GoLand 2018.1 Help

Using File Watchers

A File Watcher is a GoLand system that tracks changes to your files and runs a third-party standalone application. GoLand provides predefined File Watcher templates for a number of such standard popular third-party tools (compilers, compressors, prettifiers, and others). You can also configure a custom File Watcher to run any other third-party tool.

File watchers have two dedicated code inspections:

  • The File watcher available inspection is run in every file where a predefined File Watcher is applicable. If the project has no relevant File Watcher configured, GoLand suggests to add one.
  • The File watcher problems inspection is invoked by a running File Watcher and highlights errors specific to it.

Before you start

Install and enable the File Watchers plugin. The plugin is not bundled with GoLand, but it can be installed from the JetBrains plugin repository as described in Installing, Updating and Uninstalling Repository Plugins and Enabling and Disabling Plugins.

Creating a File Watcher

  1. In the Settings/Preferences dialog (Ctrl+Alt+S), click File Watchers under Tools. The File Watchers page opens showing a list of File Watchers that are already configured in the project.
  2. Click new.png and choose the predefined template from which you want to create a File Watcher. The choice depends on the tool you are going to use. To use a tool that is not on the list, choose Custom. The New Watcher dialog box opens.
  3. In the Name text box, type the name of the File Watcher. By default, GoLand suggests the name of the selected predefined template.

Configuring the expected type and location of input files

Use the controls in the Files to watch area to define the range of files where you want to apply the File Watcher.

  1. From the File type drop-down list, choose the expected type of input files. The File Watcher will consider only files of this type as subject for analyzing and processing. File types are recognised based on associations between file types and file extensions.
  2. Choose the Scope in which the File Watcher is applicable. Changes in these files will invoke the File Watcher either immediately or upon save or frame deactivation, depending on the status of the Auto-save edited files to trigger the watcher checkbox.

    Choose one of the predefined scopes from the drop-down list or click browseButton and configure a custom scope in the Scopes dialog that opens.

Optionally
Specify how you want the File Watcher to deal with dependencies. A root file is a file that is not included (e.g. via import) in any other file within the specified scope.

  • To run the File Watcher only against root files, select the Track only root files checkbox.
  • Clear the checkbox to run the File Watcher against the file from which it is invoked and against all the files in which this file is recursively included within the specified scope.
Note that the Scope setting overrides the Track only root files checkbox setting: if a dependency is outside the specified scope, the File Watcher is not applied to it.

Configuring interaction with the external tool

In the Tool to run on changes area, specify the tool to use, the arguments to pass to it, the expected output file types, etc.

  1. In the Program text box, specify the path to the executable file of the tool (.exe, .cmd, .bat, or other depending on the specific tool).
  2. In the Arguments text box, define the arguments to pass to the tool. Arguments are usually specified using macros, for example, $FileName$ or $FileNameWithoutExtension$, that will be replaced with actual file names.
    Suppose, an action affects several files watched by the same File Watcher. As a result, the File Watcher wakes up on each changed file. However, running several tasks is redundant because the File Watcher processes all the watched files during the first run. To tell GoLand that running File Watcher just once in enough, even if several files have been changed, make sure there is no file-specific macro, such as $FileNameWithoutExtension$, in the Arguments field.
  3. In the Output paths to refresh text box, specify the files where the tool stores its output: the resulting source code, source maps, and dependencies. Based on these settings, GoLand recognizes the files generated through compilation.
    Please note, that changing the value in the Output paths to refresh text box does not make the tool store its output in another place. If you still need to do that, specify the desired custom output location in the Arguments text box: type the output paths with colons as separators and use macros.

Optionally

  1. Expand the Working Directory and Environment Variables hidden area.
  2. Define the environment variables. For example, specify the PATH variable for the tools that are required for starting the tool you are configuring but are not referenced in the path to it. In most cases it is Node.js or ruby.exe. Such situation may result from custom manual installation instead of installation through the Node Package Manager (npm) or gem manager.
  3. In the Working Directory text box, specify the directory to which the tool will be applied.
    Because the tool is always invoked in the context of a file, the default working directory is the directory of the current file. The default working directory is specified in all predefined templates through a $FileDir$ macros. To specify a custom working directory, type the path to it in the text box, or click browseButton and choose the directory in the Select Path dialog box, or click Insert Macro and select the desired macro from the list in the Macros dialog box.

Configuring advanced options

In the Advanced Options area, customize the default behaviour of the File Watcher.

  1. Specify the events that will invoke the File Watcher:
    • To invoke the File Watcher as soon as any changes are made to the source code, select the Auto-save edited files to trigger the watcher checkbox.
      When the checkbox is cleared, the File Watcher starts upon save (File | Save All) or when you move the focus from GoLand (on frame deactivation).
    • By default, the File Watcher wakes up on any saved change, including the updates received from you version control system when you, for example, check out a branch. To ignore such changes and invoke the File Watcher only you update your code in GoLand, clear the Trigger the watcher on external changes checkbox.
  2. Specify whether you want the File Watcher to interact with the GoLand syntax parser:
    • When the Trigger watcher regardless of syntax errors checkbox is selected, the File Watcher start regardless of the syntactical correctness of a file. The File Watcher will start upon update, save, or frame deactivation, depending on the status of the Auto-save edited files to trigger the watcher checkbox.
    • When the Trigger watcher regardless of syntax errors checkbox is cleared, the File Watcher ignores all triggers in files that are syntactically invalid and starts only in error-free files.
  3. Use the Create output file from stdout checkbox to specify how you want to generate the output file.
    • When the checkbox is selected, GoLand reads the native tool's output (standard output stream (stdout)) and generates the resulting files from it.
    • When the checkbox is cleared, the tool writes its output directly to the files specified in the Output paths to refresh field.
  4. In the Show console drop-down list, choose when you want the File Watcher to open the console.
    • Always: with this option, the console always opens after the tool execution is completed.
    • On error: with this option, the console opens after the tool execution only when the Exit code is different from 0.
    • Never: choose this option to suppress opening the console at all.

Optionally
Configure the output filters to distinguish the output of the File Watcher from other output. Based on these filters, absolute file paths and line numbers in the tool's output are converted into hyperlinks. Clicking those links opens the corresponding files in the editor.
For example, to get useful error messages displayed, type $FILE_PATH$:$LINE$ $MESSAGE$

Enabling and disabling File Watchers

To toggle the enable/disable status of a File Watcher, select/clear the checkbox next to it on the File Watchers page of the Settings dialog box. If an error occurs while a File Watcher is running, the File Watcher is automatically disabled. To restore the status, enable the File Watcher manually.

When a File Watcher is enabled, it starts automatically as soon as a file to which compilation is applicable is changed or saved, see Configuring advanced options.

Examples of customizing the behaviour of an external tool in a File Watcher

The only way to influence a third-party tool is pass arguments to it just as if you were working in the command line mode. These arguments are specific to each tool. Below are two examples of customizing the default output location for the CoffeeScript compiler.

Suppose, you have a project with the following folder structure:

fileWatcherExampleImage1
By default, the generated files will be stored in the folder where the original file is. You can change this default location and have the generated files stored in the js folder. Moreover, you can have them stored in a flat list or arranged in the folder structure that repeats the original structure under the app node.

  • To have all the generated files stored in the output js folder without retaining the original folder structure under the app folder:
    1. In the Arguments text box, type:
      --output $ProjectFileDir$\js\ --compile --map $FileName$
    2. In the Output paths to refresh text box, type:
      $ProjectFileDir$\js\$FileNameWithoutExtension$.js:$ProjectFileDir$\js\$FileNameWithoutExtension$.map

    As a result, the project tree looks as follows:

    fileWatcherExampleImage2

  • To have the original folder structure under the app node retained in the output js folder:
    1. In the Arguments text box, type:
      --output $ProjectFileDir$\js\$FileDirRelativeToProjectRoot$\ --compile --map $FileName$
    2. In the Output paths to refresh text box, type:
      $ProjectFileDir$\js\$FileDirRelativeToProjectRoot$\$FileNameWithoutExtension$.js:$ProjectFileDir$\js\$FileDirRelativeToProjectRoot$\$FileNameWithoutExtension$.map

    As a result, the project tree looks as follows:

    fileWatcherExampleImage3

Last modified: 25 July 2018

See Also

Language and Framework-Specific Guidelines: