外部ツールとの連携¶
本稿ではワークスペースの設定ファイル tasks.json で管理される機能について記す。ビルド、テスト、構文チェック、パッケージ化、配備などをタスクと称し、これらを担う既存のツールを VS Code から実行するのが主目的だ。
Attention
Visual Studio Code 利用ノート 冒頭の前提条件に留意すること。
ビルドタスク¶
ビルドタスクを走らせる¶
ビルドタスクは特別タスクの一つだ。専用のコマンドが用意されている。VS Code 上で次のいずれかの操作で実行する:
コマンドパレットから Tasks: Run Build Task を選択
メインメニューから を選択
キーボードから Ctrl + Shift + B を押す
(おそらくエディターの言語拡張機能次第で)タスク一覧がドロップダウンリストに現れる。所望のタスクを選択するとそれが走り出し、Output パネルの TERMINAL タブに外部ツールの処理が出力される。
WSL ノート
WSL で作業をしているとビルドタスクは bash -l -c some_command の形で外部ツールを実行するようだ。
$HOME/.bash_profile に some_command が必要とする情報が定義されているようにするのが無難だ。
既定ビルドタスクを指定する¶
ビルドタスクを毎回選択するのは自動化らしくないので、その一つをあらかじめ指定しておいてショートカットキー一発で実行できるようにするべきだ。それには、以下のいずれかの操作で
tasks.json をワークスペースに生成する:
コマンドパレットから Tasks: Configure Default Build Task を選択
メインメニューから を選択
設定ファイル tasks.json の内容は生成時点で適切に記述されている。必要に応じてカスタマイズしてよい。この指定により、次からは Ctrl + Shift +
B を押すと当該タスクが走る。
タスクを自作する¶
VS Code のタスク自動検出機能が意味をなさないようなプロジェクトでは、自力で
tasks.json をゼロから仕込むことになる。
コマンドパレットから Tasks: Configure Task を選択
メインメニューから を選択
この時点で設定ファイルが存在しなければ 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 上でどう処理されるかを指定するオブジェクトだ。後述。
optionscwd,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とすると、ユーザーが などを実行しない限り、タスク出力端末が表示されなくなる。silentとすると、エラーや警告のために出力をスキャンしない場合に限り、 TERMINAL タブを Panel 前面に出す。showReuseMessageTerminal 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関連バックグランドタスク