外部ツールとの連携

本稿ではワークスペースの設定ファイル tasks.json で管理される機能について記す。ビルド、テスト、構文チェック、パッケージ化、配備などをタスクと称し、これらを担う既存のツールを VS Code から実行するのが主目的だ。

Attention

Visual Studio Code 利用ノート 冒頭の前提条件に留意すること。

ビルドタスク

ビルドタスクを走らせる

ビルドタスクは特別タスクの一つだ。専用のコマンドが用意されている。VS Code 上で次のいずれかの操作で実行する:

  • コマンドパレットから Tasks: Run Build Task を選択

  • メインメニューから Terminal ‣ Run Build Task… を選択

  • キーボードから Ctrl + Shift + B を押す

(おそらくエディターの言語拡張機能次第で)タスク一覧がドロップダウンリストに現れる。所望のタスクを選択するとそれが走り出し、Output パネルの TERMINAL タブに外部ツールの処理が出力される。

WSL ノート

WSL で作業をしているとビルドタスクは bash -l -c some_command の形で外部ツールを実行するようだ。 $HOME/.bash_profilesome_command が必要とする情報が定義されているようにするのが無難だ。

既定ビルドタスクを指定する

ビルドタスクを毎回選択するのは自動化らしくないので、その一つをあらかじめ指定しておいてショートカットキー一発で実行できるようにするべきだ。それには、以下のいずれかの操作で tasks.json をワークスペースに生成する:

  • コマンドパレットから Tasks: Configure Default Build Task を選択

  • メインメニューから Terminal ‣ Configure Default Build Task… を選択

設定ファイル tasks.json の内容は生成時点で適切に記述されている。必要に応じてカスタマイズしてよい。この指定により、次からは Ctrl + Shift + B を押すと当該タスクが走る。

タスクを自作する

VS Code のタスク自動検出機能が意味をなさないようなプロジェクトでは、自力で tasks.json をゼロから仕込むことになる。

  • コマンドパレットから Tasks: Configure Task を選択

  • メインメニューから Terminal ‣ Configure Tasks… を選択

この時点で設定ファイルが存在しなければ Create tasks.json file from template というプロンプトが出現するので、それを選択する。ドロップダウンリストが現れる。項目 Others を選択すると、タスクのテンプレを含む tasks.json が生成されてエディターに表示される。

タスクオブジェクトのプロパティーの一部を簡単に記す。tasks.json 編集中に IntelliSense を適宜ポップアップさせて利用可能なプロパティーを知ることができるので、網羅的に記述することはしない:

label

このタスクの名前。VS Code の UI に用いられる。

type

カスタムタスクの場合は shell または process のいずれかを取る。

shell を指定すると command はシェルコマンドとして解釈される。スクリプトを指定したいときにはこれを適用する。

process を指定すると command は実行するプロセスとして解釈される。

command

外部ツールとして実行するコマンド

group

タスクが属するグループを指定する。例えば test グループに属するタスクは VS Code コマンド Run Test Task を実行することで走る。

presentation

タスク出力が Panel 上でどう処理されるかを指定するオブジェクトだ。後述。

options

cwd, env, shell を上書きするためのオブジェクトだ。

options は、グローバルに、あるいは OS ごとに設定することもできる。

ここで設定された env はタスクスクリプトやプロセスの中からしか参照できない。

シェルコマンドの記述については、空白文字、引用符、変数展開などのコマンドライン展開に注意する。特に args には、そのための詳細な指定方式も存在する。

複合タスクを定義する

プロパティー dependsOn を利用すると、定義済みタスクを次から次へと走らせることができる。例えばラベル Task1, Task2 を持つタスクが定義されているとすると、次のタスクはそれらを順次走らせる:

{
    "label": "Composite Task",
    "dependsOn": ["Task1", "Task2"]
}

ユーザー固有のタスクを定義する

ワークスペースに関連付けられないユーザーレベルのタスクを作成することもできる。コマンドパレットから Tasks: Open User Tasks を実行すると、VS Code ユーザー設定フォルダーに tasks.json を必要なら生成して、エディターで開く。

端末パネルの表示を制御する

ファイル tasks.json のタスクオブジェクトにおけるプロパティー presentation について。このオブジェクトを設定すれば、タスクが走ると VS Code 内蔵端末が現れる挙動を変更できる。

有用でありそうなプロパティーを以下に記す:

clear

タスクが走る前に端末を消去するか否か。

close

タスクが退場するときにその端末を閉じるか否か。

echo

実行コマンド自体を端末に表示するかどうか。

panel

タスク間で端末を共有するか否かを制御する。

shared が既定値だ。

dedicated は(ラベル単位で)端末をタスクに専属させる。そのタスクを再び走らせると、端末が再利用される。別のタスク出力は別の端末が利用される。

new はタスク一つ一つに対して端末を新しく生成する。

reveal

内臓端末を擁する Panel をどのように前面に持ってくるかを制御する。

always とすれば、出力を表示する内蔵端末は常時公開される。

never とすると、ユーザーが View ‣ Terminal などを実行しない限り、タスク出力端末が表示されなくなる。

silent とすると、エラーや警告のために出力をスキャンしない場合に限り、 TERMINAL タブを Panel 前面に出す。

showReuseMessage

Terminal will be reused by tasks, press any key to close it の表示をするか否か。これを false にしておくと画面がすっきりとする。

その他の取り得るプロパティーと値については IntelliSense で確認する。

Problem Matchers

VS Code はタスク出力をスキャンして既知の警告やエラーの文字列を探し、エディター中に波線でそれを示したり、PROBLEMS タブに一覧で報告したりする。これはタスクの problem matcher という機能の働きによるものだ。

タスク定義で利用可能な変数

Visual Studio Code Variables Reference にタスク定義で利用可能な変数の一覧がある。

  • tasks.json のみならず launch.json でも参照可能。

  • 環境変数 XXXX${env:XXXX} のようにして参照可能。

  • VS Code 設定 XXXX${config:XXXX} のようにして参照可能。

  • ${input:XXXX} のようにして、プロンプトから入力させることも可能。このときは設定ファイルにそれに備える記述が必要となることも忘れてはいけない。

タスク定義例

実際に tasks.json で私が定義して実績があるものを記す。

傾向

  • 既存の Makefile があるプロジェクトでは make -C ${workspaceFolder}/path/to/MakefileDir を実行するタスクを定義するのが自然だ。

  • Linter は VS Code に導入している拡張機能のコマンドを使うことが多い。

  • GitHub Actions に任せるので、配備タスクは自分では書かないことが多い。

  • HTTPS サーバーを起動するタスクはありがちだ。コマンドはいろいろ考えられる:

    bash$ python -m http.server 8000 --bind 127.0.0.1'
    

Sphinx プロジェクト

Python パッケージ開発用ワークスペースにおける文書部と捉えてもいい。 Sphinx の sphinx-quickstart が生成する Makefile を再利用する。

  • コマンド make html を実行して HTML をビルドするタスク(前述参照)

  • 成果物 index.html をブラウザーで開くタスク(シェルコマンドが環境依存なのでユーザータスクとする)

Jekyll ブログプロジェクト

次の二つは入れておく:

  • コマンド bundle update を実行して Gemfile.lock を更新するタスク

  • コマンド bundle exec jekyll serve を実行して HTTP サーバーを稼働するタスク

あとはリンクチェックや assets に収容するファイルの最適化タスクなどが考えられる。

自分自身のタスク

本稿は WSL 前提なので OS 固有の設定などは省いた。これからも取り組む予定はない。

次の事柄はいずれ取り組むだろう:

  • ビルドタスクとテストタスクを見極める。

  • 複合タスクを実践する。

  • タスクプロパティー presentation の調整を実践する。

  • 変数を積極的に参照する。

  • problemMatcher 関連

  • バックグランドタスク