VS Codeのtasks.jsonの書き方|Ctrl+Shift+Bでコマンドを一発実行

VS Codeのtasks.jsonの書き方|Ctrl+Shift+Bでコマンドを一発実行
目次 / INDEX

毎回同じコマンドを手打ちしてるなら、tasks.jsonに登録した方がいい

python main.py。npm run build。ビルドのたびにターミナルをクリックして、↑キーで履歴を遡って、Enter。

僕もずっとこれをやってた。1回数秒だから気にしてなかったけど、1日に何十回もやる操作なんだから、ここを縮めない理由がない。

結論を先に言うと、VS Codeのtasks.jsonに1回コマンドを登録すれば、あとはCtrl+Shift+B(MacはCmd+Shift+B)一発で走るようになる。ターミナルに切り替える必要すらない。

打鍵を減らす話はVS Codeの拡張と設定の記事のショートカットの節でも書いたけど、tasks.jsonはその中でも効果がでかい方だと思う。

tasks.jsonって何

開いているフォルダの直下、.vscode/tasks.json に置くファイル。「このプロジェクトでよく使うコマンド」をVS Codeに教えておくための設定だ。

プロジェクト単位の設定なので、リポジトリごとに中身が違っていい。.vscode ごとGitに入れれば、チームメンバーや未来の自分にもそのまま共有できる。

最小の作り方

コマンドパレット(Ctrl+Shift+P、MacはCmd+Shift+P)を開いて「タスク: タスクの構成(Tasks: Configure Task)」を選ぶ。すると、雛形からtasks.jsonが生成される。既にファイルがあるなら直接開いて編集すればいい。

一番小さい例。python main.py を走らせるだけのタスクはこうなる。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "run main",
      "type": "shell",
      "command": "python",
      "args": ["main.py"]
    }
  ]
}

キーは4つだけ。

  • label: 表示名。自由に付けていい
  • type: “shell” にしておけばターミナルで打つのと同じ感覚で動く
  • command: 実行するコマンド本体
  • args: 引数の配列。npm run build なら command を “npm”、args を [“run”, “build”] にする感じ

走らせるときはコマンドパレットで「タスク: タスクの実行(Tasks: Run Task)」を選んで、さっき付けたラベルを選ぶ。これだけでもう手打ちは消える。

Ctrl+Shift+Bの一発にする

ただ、毎回コマンドパレットからラベルを選ぶのは正直まだ面倒くさい。ここで group を足す。

"group": { "kind": "build", "isDefault": true }

これをタスクに追加すると「既定のビルドタスク」になって、Ctrl+Shift+B(MacはCmd+Shift+B)だけで走るようになる。エディタから手を離さず、選択肢も出ず、一発。“kind” を “test” にすればテストタスク扱いにもできる。

「今開いてるファイル」を対象にする

tasks.jsonには定義済み変数というのがあって、コマンドや引数に埋め込める。よく使うのはこのあたり。

  • ${file}: いま開いているファイルの絶対パス
  • ${fileBasenameNoExtension}: 拡張子を除いたファイル名
  • ${fileDirname}: いま開いているファイルのあるフォルダ
  • ${workspaceFolder}: 開いているフォルダの絶対パス

これを使うと「今エディタで開いてるファイルだけを実行する」タスクが作れる。演習でファイルを何個も作る授業だと、これがめちゃくちゃ効く。開いてる .py をそのまま実行する例。

{
  "label": "run current file",
  "type": "shell",
  "command": "python",
  "args": ["${file}"]
}

Cなら command を “gcc”、args を ["${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"] にする。すると、開いてる .c をコンパイルするタスクになる。ファイルごとにコマンドを書き換える必要がなくなるのがポイントだ。

何を登録すべきか。全部はやらない

便利だからといって何でも登録すると、Run Taskの一覧が育ちすぎて選ぶのが逆に遅くなる。僕の基準は3つ。

  • 頻度が高い(1日に何回も打つ)
  • 毎回同じ(引数がゆらがない)
  • このプロジェクト固有

この3つが揃うものだけ登録する。逆に、たまにしか打たないコマンドや、毎回オプションが変わるコマンドはターミナル手打ちのままでいい。

似た道具との棲み分けも一言。ゆらぎのない定型作業はtasks.json、よく書くコード片はスニペットの領分だと思う。

スニペット側はVS Codeのスニペット自作の話に書いた。

特定のタスクにキーを割り当てたい場合は、keybindings.jsonで command に “workbench.action.tasks.runTask” を書く。args にタスクのラベル文字列を添えればいける。キー割り当ての考え方はVS Codeのキーバインドを3つだけカスタムする話を参照。

つまずきどころと、もう一歩先

まず problemMatcher。タスクに $gcc や $tsc(TypeScript)、$eslint-stylish みたいな値を設定すると、コンパイラやリンタの出力を解析して、エラーが「問題」パネルに一覧される。リンタはコードの書き方の問題を指摘するツールのこと。

エラー行をクリックすれば該当行に飛べるので、ターミナルの出力を目で追ってファイルと行番号を探す作業が消える。使わないなら [] を指定しておけばいい。

あとシェルの違い。tasks.jsonをWindowsとMacの両方で使う場合、commandやパスの区切り文字が環境によって噛み合わないことがあるはず。チームで共有するファイルなら、動作確認は両方のOSでやっておいた方が安全だと思う。

それから dependsOn。タスクに別タスクのラベルを配列で書くと、先にそっちが実行される。

"dependsOrder": "sequence" を付ければ順番に走るので、build→runを1コマンドにまとめられる。ビルドしてから実行、をいつも2回打ってたなら、これで1回になる。

まずは1個だけ

tasks.jsonは全部を自動化する道具じゃなくて、「一番よく打つやつ」を消す道具だ。まずは自分が今日一番多く打ったコマンドを1個だけ登録して、Ctrl+Shift+Bで走らせてみてほしい。

よくある質問

VS Codeのtasks.jsonはどこに置く?

開いているフォルダ直下の .vscode/tasks.json に置く。コマンドパレットの「Tasks: Configure Task」を選べば雛形が生成される。プロジェクト単位の設定なので .vscode ごとGitに入れて共有できる。

tasks.jsonのタスクをCtrl+Shift+Bで実行するには?

タスクに group を追加し、kind を build、isDefault を true にする。これで既定のビルドタスクになり、Ctrl+Shift+B(MacはCmd+Shift+B)だけで走る。

今開いているファイルだけを実行するタスクは作れる?

作れる。args に ${file} を書けば今エディタで開いているファイルの絶対パスに置き換わる。${fileBasenameNoExtension} や ${fileDirname} と組み合わせればCのコンパイルにも使える。

次に読むなら

VS Codeのマルチルートワークスペースの使い方|複数フォルダを1ウィンドウに複数のリポジトリを扱うなら、1ウィンドウにまとめる読む →