外部ツールとの連携¶
本稿ではワークスペースの設定ファイル 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 上でどう処理されるかを指定するオブジェクトだ。後述。
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
とすると、ユーザーが などを実行しない限り、タスク出力端末が表示されなくなる。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
関連バックグランドタスク