Visual Studio Codeの使い勝手をよくするツール特集:Visual Studio Code早分かりガイド(2/5 ページ)

» 2015年09月08日 05時00分 公開
[かわさきしんじInsider.NET編集部]

複数のタスクを記述する

 tasks.jsonファイルにはタスクを複数記述することもできる(ただし、制約はある。後述)。そこで、先ほどのtasks.jsonファイルに手を入れて複数のタスクを構成してみよう。これにはtasks.jsonファイルに「tasks」プロパティを追加する。以下はその例だ。

{
  "version": "0.1.0",
  "command": "echo",
  "isShellCommand": true,
  "showOutput": "always",
  "args": ["Hello"],
  "tasks": [
    {
      "taskName": "World",
      "args": [
        "world"
      ],
      "problemMatcher": "$tsc"
    },
    {
      "taskName": "Goodbye",
      "args": [
        "goodbye"
      ],
      "problemMatcher": "$tsc"
    }
  ]
}


tasksプロパティを追加したtasks.jsonファイル(JSON)

 ここでは先頭部分で指定したechoに渡す引数を「"Hello"」だけとして、その下のtasksプロパティでタスクごとに異なる引数(「"World"」と「"Goodbye"」)を渡すようにしている。先ほど「制約がある」と述べたのもこの部分だ。実行できるコマンドはtasksプロパティでのタスクの構成とは関係なく、その上の「グローバル」な部分の「commandプロパティ」で指定されてしまうのだ。つまり、tasksプロパティでさまざまなタスクを定義はできるのだが、それらのタスクはあくまでもcommandプロパティで指定されたコマンドに与える引数を変えるくらいのことしかできない。この制約は結構キツいかもしれないので、将来のバージョンでの改善を期待したいところだ。

 なお、tasks.jsonファイルのグローバルな構成部分ではproblemMatcherプロパティかtasksプロパティのいずれかしか指定できないので、修正後のtasks.jsonファイルでは先ほどあった位置からはproblemMatcherプロパティを削除している(このproblemMatcherプロパティを「グローバルなproblemMatcherプロパティ」と呼ぶ)。ただし、個々のタスクでこれを指定することは可能だ(し、実際、そのような指定をしている)。

 このtasksプロパティの各要素ではproblemMatcherプロパティに加えて以下のプロパティを指定している。

  • taskNameプロパティ: タスクの名前
  • argsプロパティ: 上で指定したargsプロパティに追加して、実行するコマンド(この場合はechoコマンド)に渡す引数

 要するに、「World」タスクでは「Hello world」と、「Goodbye」タスクでは「Hello goodbye」と表示させようということだ。

 今度は[Ctrl]+[P]キーを押して(OS Xでは[Command]+[P]キー)、プロンプトが何もない状態のコマンドパレットを表示して、「task」と入力してスペースキーを押してみよう。すると、実行可能なタスクが表示されるので、続いてタスク名を入力して、[Enter]キーを押す。これもタスクを実行する方法だが、コマンドパレットで何かを選択したりする必要がなく、シンプルにタスクを実行できるのでお勧めだ。試しに「World」タスクを実行してみよう。その結果を以下に示す。

[Ctrl]+[P]キー(OS Xでは[Command]+[P]キー)を押してコマンドパレットを表示したら「task」と入力してスペースキーを押すと、実行可能なタスクが表示されるので、続けて「World」と入力して[Enter]キーを押す
[Ctrl]+[P]キー(OS Xでは[Command]+[P]キー)を押してコマンドパレットを表示したら「task」と入力してスペースキーを押すと、実行可能なタスクが表示されるので、続けて「World」と入力して[Enter]キーを押す
実行結果が表示される。が……
実行結果が表示される。が……

「World」タスクの実行結果
実行結果(赤枠内)を見ると、予想とは異なる結果となっている。


 実行結果を見ると予想外なことに「Hello world World」となっている。これは、最後にtaskNameプロパティの値がコマンドに渡されるためだ。タスク名を使って何かの処理を行う場合には便利だが、ここではちょっと問題がある。解決策は二つある。

 一つはタスクごとのargsプロパティの指定を削除することだ。そうすれば、タスク名がechoコマンドに渡されるので「Hello World」あるいは「Hello Goodbye」と出力されるはずだ。もう一つはsuppressTaskNameプロパティをtrueと指定することだ。

{
  …… 省略 ……

  "tasks": [
    {
      "taskName": "World",
      "suppressTaskName": true,
      "args": [
        "world"
      ],
      "problemMatcher": "$tsc"
    },
    {
      …… 省略 ……
    }
  ]
}


suppressTaskNameプロパティの指定(JSON)

 このプロパティの値をtrueにすると、コマンドにタスク名が渡されないようになる。なお、これはタスクごとに指定してもよいが、その上の部分で次のように指定してもよい。

{
  "version": "0.1.0",
  "command": "echo",
  "isShellCommand": true,
  "showOutput": "always",
  "args": ["Hello"],
  "suppressTaskName": true,
  "tasks": [
    …… 省略 ……
  ]
}


グローバルなsuppressTaskNameプロパティ指定(JSON)

 この位置(グローバルな位置)に指定したsuppressTaskNameプロパティの値は、以降のtasksプロパティの中でこのプロパティを指定すれば上書きされ、そうでなければグローバルな値が利用される。

 これで思った通りの出力が得られる。

 なお、この状態でコマンドパレットから[Run Build Task]コマンドを選択するか、[Ctrl]+[Shift]+[B]キー(OS Xでは[Shift]+[Command]+[B]キー)を押すと次のようなメッセージが表示される。これは「ビルドタスク」が設定されていないからだ(先ほどは、タスクが一つだけだったので、それが自動的にビルドタスクとして扱われていた)。

ビルドタスクがない ビルドタスクがない

 ビルドタスクを指定するには、tasksプロパティに記述したタスクのいずれかで「isBuildCommand」プロパティの値をtrueにすればよい。複数のタスクでこれをtrueにした場合には、それらの中で一番上にあるものがビルドタスクとして扱われるようだ。

{
  …… 省略 ……
  "tasks": [
    {
      …… 省略 ……
    },
    {
      "isBuildCommand": true,
      "taskName": "Goodbye",
      "args": [
        "goodbye"
      ],
      "problemMatcher": "$tsc"
    }
  ]
}


isBuildCommandプロパティの指定(JSON)

 この設定により、「Run Build Task」コマンドで「Goodbye」タスクが実行されるようになる。ここでは、ビルドとは関係ないタスクを指定したが、実際にはビルド作業をワンタッチで実行できるようにするための便利なコマンドなので、このプロパティの指定とキーボードショートカットは活用したいところだ。

 この他にもテストタスクの指定なども行える。タスクの活用方法の詳細については「Integrate with External Tools via Tasks」ページを、tasks.jsonファイルのスキーマについては「Appendix」を参照してほしい。

 ここまではechoコマンドを使った、毒にも薬にもならないサンプルを見てきたが、タスクの紹介の最後に、TypeScriptコードのコンパイル例と、Node.jsアプリでタスクを利用しているところを紹介しよう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。