文件监视器
File Watcher 是 一个 PyCharm 的一项工具,可在您在 IDE 中更改或保存文件时,自动运行编译器、格式化程序或代码检查器等命令行工具。
文件监视器有两个专用的 代码检查:
在适用预定义文件监视器的每个文件中,都会运行 File Watcher 可用 检查。 如果项目未配置相关文件监视器, PyCharm 会建议添加一个。
正在运行的文件监视器会触发 File Watcher 问题 检查,并突出显示其特有的错误。
您可以使用可用模板之一,或从头配置一个文件监视器。 配置好的文件监视器可以保存在您的项目设置或 IDE 设置中,并在不同项目中使用。
有关特定工具的文件监视器的详细信息,请参阅相应页面:
请注意,在 PyCharm 中使用其中一些工具需要您在 设置 | 插件 页面安装插件,如 从 JetBrains Marketplace 安装插件 所述。
开始之前
请确保在设置中启用了 File Watchers 插件。 按 Ctrl+Alt+S 打开设置,然后选择 。 点击 已安装 选项卡。 在搜索字段中,键入 File Watchers。 有关插件的详细信息,请参阅 管理插件。
创建文件监视器
在 设置 对话框(Ctrl+Alt+S )中,点击 工具 下的 文件监视器。 将打开 File Watchers 页面 ,显示已在此项目和 IDE 中配置的文件监视器列表。
点击
,然后选择要从中创建文件监视器的预定义模板。 选择取决于您要使用的工具。 要使用不在列表中的工具,请选择 自定义。

将打开 新建监视器 对话框。
在 名称 字段中,键入文件监视器的名称。 默认情况下, PyCharm 会建议所选预定义模板的名称。
配置输入文件的预期类型和位置
使用 要监视的文件 区域中的控件定义要应用文件监视器的文件范围。
在 文件类型 列表中,选择预期的输入文件类型。 文件监视器只会将此类型的文件视为分析和处理的对象。 文件类型基于 文件类型与文件扩展名之间的关联 进行识别。
默认情况下,该字段会根据所选的预定义模板显示文件类型。
选择文件监视器适用的 作用域。

根据 自动保存已编辑的文件以触发监视器 复选框的状态,这些文件中的更改会立即、在保存时或在窗口失去焦点时调用文件监视器。
从列表中选择一个预定义范围。 对于项目级文件监视器,您也可以点击
,在打开的 作用域 对话框中配置自定义范围。
所有位置: 以下列出的所有范围。
项目文件: 项目内容根中的所有文件(请参阅 配置项目结构)。
项目生产文件: 项目内容根中的所有文件(不包括测试源)。
项目测试文件: 项目测试源根中的所有文件。
临时文件和控制台: 位于 项目 工具窗口中的 临时文件和控制台 目录中的所有文件。
打开的文件: 在编辑器中当前打开的所有文件。
当前文件: 在活动编辑器选项卡中打开的文件。
VCS 作用域: 这些范围仅在您的 项目受版本控制时可用。
所有更改的文件: 所有已更改的文件,即与所有现有更改列表关联的所有文件。
默认更改列表: 与更改列表
Default关联的所有文件。
或者,点击
,在打开的 范围 对话框中配置 自定义范围。
可选 :指定您希望文件监视器如何处理依赖项。 根文件是指在 指定范围内未被包含在任何其他文件中的文件(例如通过
import)。要仅针对根文件运行文件监视器,请选中 仅跟踪根文件 复选框。
清除该复选框,以便针对调用它的文件以及在指定范围内递归包含该文件的所有文件运行文件监视器。
请注意, 作用域 设置会覆盖 仅跟踪根文件 复选框的设置:如果依赖项不在指定范围内,则不会对其应用文件监视器。
配置与外部工具的交互
在 更改时运行的工具 区域中,指定要使用的工具、传递给该工具的参数、预期的输出文件类型等。
在 程序(P) 字段中,指定该工具可执行文件的路径( .exe 、 .cmd 、 .bat ,或其他,具体取决于所用工具)。
在 实参(A) 字段中,定义要传递给该工具的参数。
参数通常使用 宏 指定,例如,
$FileName$或$FileNameWithoutExtension$,它们将被替换为实际的文件名。请手动键入宏,或点击
,然后在打开的 宏 对话框的列表中选择相应的模式。
在 要刷新的输出路径(O) 字段中,指定该工具存储其输出的文件:生成的源代码、源映射和依赖项。 基于这些设置, PyCharm 会识别通过编译生成的文件。
输出路径通常使用 宏 指定。 您可以手动键入它们,或点击
,然后在打开的对话框的列表中选择相应的宏。
要指定多个宏,请使用冒号
:作为分隔符,例如,$FileNameWithoutExtension$.css:$FileNameWithoutExtension$.css.map。展开 工作目录与环境变量 隐藏区域。
定义环境变量。 例如,请为启动您正在配置的工具所需但未包含在该工具路径中的工具指定
PATH变量。 在大多数情况下,它是 Node.js 或 ruby.exe。 这种情况可能是由于采用自定义的手动安装,而不是通过 Node 包管理器(npm)或 gem 管理器 进行安装所致。在 工作目录(W) 字段中,指定该工具 将应用到的目录。
由于该工具始终在文件的上下文中调用,默认工作目录为当前文件所在的目录。 默认工作目录在所有预定义模板中通过
$FileDir$宏指定。 要指定自定义工作目录,请在该字段中键入其路径,或点击并在 选择路径 对话框中选择目录,或点击
并在 宏 对话框的列表中选择所需的 宏。
配置高级选项
在 高级选项 区域中,自定义文件监视器的默认行为。
指定将调用文件监视器的事件:
要在对源代码进行任何更改时立即调用文件监视器,请选中 自动保存已编辑的文件以触发监视器 复选框。
当清除此复选框时,文件监视器会在保存时( )或当您将焦点从 PyCharm 移开时(在窗口失去焦点时)启动。

默认情况下,文件监视器会在任何已保存的更改时唤醒,包括您从版本控制系统接收到的更新,例如检出分支时。 要忽略此类更改,并仅在您在 PyCharm 中更新代码时调用文件监视器,请清除 在外部更改时触发监视器 复选框。
指定您是否希望文件监视器与 PyCharm 语法解析器交互:
当选中 忽略语法错误触发监视器 复选框时,文件监视器会在不考虑文件语法正确性的情况下启动。 文件监视器会在更新、保存或窗口失去焦点时启动,具体取决于 自动保存已编辑的文件以触发监视器 复选框的状态。
当清除 忽略语法错误触发监视器 复选框时,文件监视器会忽略语法无效的文件中的所有触发器,并仅在无错误的文件中启动。
使用 从 stdout 创建输出文件 复选框来指定您希望如何生成输出文件。
当选中该复选框时, PyCharm 会读取原生工具的输出
standard output stream (stdout)并据此生成结果文件。当清除该复选框时,工具会将其输出直接写入 要刷新的输出路径 字段中指定的文件。
在 显示控制台 列表中,选择您希望文件监视器何时打开控制台。
始终: 选择此选项时,工具执行完成后将始终打开控制台。
出错时: 选择此选项时,仅当
Exit code与0不同时,才会在工具执行完成后打开控制台。从不: 选择此选项时,将完全不打开控制台。
在编辑器中显示文件监视器报告的信息
如果在文件监视器中配置的工具报告了关于您的代码的错误或警告,并包含指向文件及特定行的链接,您可以直接在编辑器中查看这些信息:
在 中,启用检查 文件监视器问题。
在 编辑监视器 对话框的 输出过滤器 字段中,描述您想要匹配的输出格式。 使用宏
$FILE_PATH$、$LINE$和$MESSAGE$来实现。 您需要避免在\中使用如大括号、点之类的特殊符号。 与$MESSAGE$宏匹配的文本将在编辑器中显示。
示例
该工具以以下格式报告错误:
请使用以下正则表达式作为输出过滤器,以便在编辑器中高亮显示该错误:
保存、启用和禁用文件监视器
保存新的文件监视器后,您可以决定它是仅在当前项目中可用(从 级别 列表中选择 项目 )还是在所有项目中可用(选择 全局)。

要启用或禁用文件监视器,打开 设置 对话框(Ctrl+Alt+S ),转到 ,然后选中或清除其旁边的复选框。
当您打开适用预定义文件监视器的文件时,PyCharm 会建议启用文件监视器:

border-effect="line" />
启用文件监视器后,一旦所选类型且在所选范围内的文件发生更改或保存,它就会自动启动,参见 配置高级选项。
如果在文件监视器运行期间发生错误,文件监视器会自动被禁用。 要恢复状态,请手动启用文件监视器。
在保存时自动运行文件监视器
您可以配置 IDE 在修改后的文件中自动运行文件监视器,当您的更改被 保存。
按 Ctrl+Alt+S 打开设置,然后选择 。
启用 File Watcher 选项并应用更改。
为新项目启用全局文件监视器
全局文件监视器可以在您以后创建的所有新项目中自动启用。
打开 新建项目的设置 对话框( ),转到 ,并选中所需文件监视器旁边的复选框。
在文件监视器中自定义外部工具行为的示例
影响第三方工具的唯一方式是向其传递参数,就像您在命令行模式下工作时那样。 这些参数因工具而异。 下面是两个用于自定义 SCSS 编译器 默认输出位置的示例。
自定义 SCSS 编译器
假设您的项目结构如下:

如您所见, _grid.scss 已被导入到 Page.scss 中。 下面的示例展示了当您手动或自动保存项目时,如何将 Page.scss 编译为 CSS,以及对 _grid.scss 的更改如何反映在生成的 CSS 文件中。
创建一个类型为 SCSS 的文件监视器:打开 设置 对话框(Ctrl+Alt+S ),转到 ,点击工具栏上的
,并从列表中选择 SCSS。

在 新建文件监视器 对话框中,所有必填字段都已填充。

实际上,这些设置足以成功运行编译器。
让我们更改 grid.scss ,例如,将第 31 行中的
margin-left: 0;替换为margin-left: 12px;。 这会触发我们的文件监视器,编译器会处理 Page.scss 。 结果,会生成两个文件,并显示为 Page.scss 的子项:Page.css ,包含编译后的 CSS 代码
Page.css.map ,包含源映射,可让您在调试会话期间对应用进行单步调试。

尽管默认设置足以成功运行编译器,但让我们还是仔细看一下这些设置,以了解如何自定义文件监视器的行为。
更改触发文件监视器的操作
文件监视器会在您的项目手动( 或 Ctrl+S )或自动保存时立即唤醒并启动转译器。
在一般情况下,您的代码会在您将焦点从 PyCharm 移开时(在窗口失去焦点时)自动保存。 使用文件监视器时,当您编辑文件监视器范围内的文件时,也会自动保存。 因此,在您键入的整个过程中,转译器可能一直在运行,从而可能导致性能问题。 要解决该问题,请关闭自动保存已编辑文件。
按 Ctrl+Alt+S 打开设置,然后选择 。 选择所需的文件监视器(SCSS 在我们的示例中)并点击工具栏上的 。 在 编辑文件监视器 对话框,展开 高级选项 区域并清除 自动保存已编辑的文件以触发监视器 复选框。

默认情况下,即使其范围内的文件在 PyCharm 外部被编辑,文件监视器也会唤醒。 要更改此行为,并仅在内部编辑时转译文件,请清除 在外部更改时触发监视器 复选框。

更改范围
默认情况下, PyCharm 监控整个项目中所有具有 .scss 扩展名的文件的更改。 这适用于我们的示例。 不过,您可以更改范围,例如仅处理未提交的更改。 在大型项目中,这将节省时间。
按 Ctrl+Alt+S 打开设置,然后选择 。 选择所需的文件监视器(SCSS 在我们的示例中)并点击工具栏上的 。 在 编辑文件监视器 对话框,选择适用的范围。 了解更多内容,请参阅 作用域和文件颜色。

自定义输出位置
默认情况下,生成的 .css 和 .css.map 文件存储在原始文件所在的文件夹中,并在 项目 工具窗口 Alt+1 中显示为其子项。 您可以更改这个默认行为,将所有生成的 .css 和 .css.map 文件存储在单独的文件夹中。
让我们从一个简单的情况开始。 假设您在项目根目录中有一个 custom_output.scss 文件。

让我们编辑 custom_output.scss ,例如,将第 6 行中的 fill-opacity: abs(50); 替换为 fill-opacity: abs(60);。 在默认文件监视器配置下,生成的 custom_output.css 和 custom_output.css.map 将存储在项目根目录,并显示为 custom_output.scss 的子项。

它会很方便,将所有输出存储在单独的文件夹中,例如, css 。 让我们创建一个自定义 SCSS_custom_output 文件监视器,将 css 文件夹作为输出位置。
按 Ctrl+Alt+S 打开设置,然后选择 。 然后创建一个 SCSS 文件监视器 如上所述。
按如下方式更新默认设置:
在 参数 字段中,键入:
$FileName$:$ProjectFileDir$/css/$FileNameWithoutExtension$.css在 要刷新的输出路径 字段中,键入:
$ProjectFileDir$/css/$FileNameWithoutExtension$.css:$ProjectFileDir$/css/$FileNameWithoutExtension$.css.map

保存新的文件监视器并确保其已启用。

现在,如果您编辑 custom_output.scss ,例如,将第 6 行中的 fill-opacity: abs(50); 替换为 fill-opacity: abs(60); ,PyCharm 创建了一个 css 文件夹,并将生成的 custom_output.css 和 custom_output.css.map 文件存储在其中。

自定义输出位置:保留原始文件夹结构
让我们现在考虑一个示例,其中 .scss 文件存储在文件夹结构中,例如:

在默认文件监视器下,生成的文件将存储在原始 .scss 文件所在的同一文件夹中。

如果我们使用自定义文件监视器 如上所述 ,所有生成的文件将存储在同一个 css 文件夹中:

为了让 PyCharm 保留文件夹结构,让我们创建另一个自定义文件监视器。
按 Ctrl+Alt+S 打开设置,然后选择 。 然后创建一个 SCSS 文件监视器 如上所述。
按如下方式更新默认设置:
在 参数 字段中,键入:
$FileName$:$ProjectFileDir$/css/$FileDirRelativeToProjectRoot$/$FileNameWithoutExtension$.css在 要刷新的输出路径 字段中,键入:
$ProjectFileDir$/css/$FileDirRelativeToProjectRoot$/$FileNameWithoutExtension$.css:$ProjectFileDir$/css/$FileDirRelativeToProjectRoot$/$FileNameWithoutExtension$.css.map

保存新的文件监视器并确保其已启用。

现在,如果您编辑 custom_output_body.scss 、 custom_output_header.scss 或 custom_output_footer.scss ,PyCharm 会创建一个 css 文件夹,其子文件夹结构会保留 styles_structured 的结构。

自定义 CoffeeScript 编译器
假设,您有一个项目,文件夹结构如下:

在默认文件监视器下,生成的文件将显示为其原始文件的子项。

您可以更改这个默认位置,并将生成的文件存储在单独的 JavaScript 文件夹中。
将所有生成的文件存储在输出 JavaScript 文件夹中

在 参数 字段中,键入:
--map --compile -o $ProjectFileDir$/JavaScript $FileName$在 要刷新的输出路径 字段中,键入:
$ProjectFileDir$/JavaScript/$FileNameWithoutExtension$.js:$ProjectFileDir$/JavaScript/$FileNameWithoutExtension$.map:$FileNameWithoutExtension$.js.map
结果,项目树如下所示:

您还可以将生成的文件存储在重复原始结构的文件夹结构中,在 app 节点下。
在输出文件夹中保留原始文件夹结构
创建 CoffeeScript 文件监视器。
在 参数 字段中,键入:
--map --compile -o $ProjectFileDir$/JavaScript/$FileDirRelativeToProjectRoot$ $FileName$在 要刷新的输出路径 字段中,键入:
$ProjectFileDir$/JavaScript/$FileDirRelativeToProjectRoot$/$FileNameWithoutExtension$.js:$ProjectFileDir$/JavaScript/$FileDirRelativeToProjectRoot$/$FileNameWithoutExtension$.map:$FileNameWithoutExtension$.js.map
结果,项目树如下所示:

文件监视器疑难解答
可能会显示一个包含错误消息的弹出窗口,同时通知您文件监视器已被禁用。
下面是可能的错误列表:
报告的问题 | 问题描述 | 解决方法 |
|---|---|---|
| 文件监视器使用了此项目中未定义的范围。 | 双击该监视器,然后选择一个可用范围,或创建一个新范围。 |
| 项目使用了已被移除的全局文件监视器。 | 使用 移除 按钮 |
PyCharm 运行大量相同的文件监视器任务。 | 在进行批量更新之后,例如来自您的 VCS, PyCharm 会为每个已保存的文件运行一个单独的文件监视器任务。 | 在 参数 字段中,添加文件特定的宏(如 |