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"
}
]
}
ここでは先頭部分で指定したechoに渡す引数を「"Hello"」だけとして、その下のtasksプロパティでタスクごとに異なる引数(「"World"」と「"Goodbye"」)を渡すようにしている。先ほど「制約がある」と述べたのもこの部分だ。実行できるコマンドはtasksプロパティでのタスクの構成とは関係なく、その上の「グローバル」な部分の「commandプロパティ」で指定されてしまうのだ。つまり、tasksプロパティでさまざまなタスクを定義はできるのだが、それらのタスクはあくまでもcommandプロパティで指定されたコマンドに与える引数を変えるくらいのことしかできない。この制約は結構キツいかもしれないので、将来のバージョンでの改善を期待したいところだ。
なお、tasks.jsonファイルのグローバルな構成部分ではproblemMatcherプロパティかtasksプロパティのいずれかしか指定できないので、修正後のtasks.jsonファイルでは先ほどあった位置からはproblemMatcherプロパティを削除している(このproblemMatcherプロパティを「グローバルなproblemMatcherプロパティ」と呼ぶ)。ただし、個々のタスクでこれを指定することは可能だ(し、実際、そのような指定をしている)。
このtasksプロパティの各要素ではproblemMatcherプロパティに加えて以下のプロパティを指定している。
要するに、「World」タスクでは「Hello world」と、「Goodbye」タスクでは「Hello goodbye」と表示させようということだ。
今度は[Ctrl]+[P]キーを押して(OS Xでは[Command]+[P]キー)、プロンプトが何もない状態のコマンドパレットを表示して、「task」と入力してスペースキーを押してみよう。すると、実行可能なタスクが表示されるので、続いてタスク名を入力して、[Enter]キーを押す。これもタスクを実行する方法だが、コマンドパレットで何かを選択したりする必要がなく、シンプルにタスクを実行できるのでお勧めだ。試しに「World」タスクを実行してみよう。その結果を以下に示す。
「World」タスクの実行結果
実行結果(赤枠内)を見ると、予想とは異なる結果となっている。
実行結果を見ると予想外なことに「Hello world World」となっている。これは、最後にtaskNameプロパティの値がコマンドに渡されるためだ。タスク名を使って何かの処理を行う場合には便利だが、ここではちょっと問題がある。解決策は二つある。
一つはタスクごとのargsプロパティの指定を削除することだ。そうすれば、タスク名がechoコマンドに渡されるので「Hello World」あるいは「Hello Goodbye」と出力されるはずだ。もう一つはsuppressTaskNameプロパティをtrueと指定することだ。
{
…… 省略 ……
"tasks": [
{
"taskName": "World",
"suppressTaskName": true,
"args": [
"world"
],
"problemMatcher": "$tsc"
},
{
…… 省略 ……
}
]
}
このプロパティの値をtrueにすると、コマンドにタスク名が渡されないようになる。なお、これはタスクごとに指定してもよいが、その上の部分で次のように指定してもよい。
{
"version": "0.1.0",
"command": "echo",
"isShellCommand": true,
"showOutput": "always",
"args": ["Hello"],
"suppressTaskName": true,
"tasks": [
…… 省略 ……
]
}
この位置(グローバルな位置)に指定した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"
}
]
}
この設定により、「Run Build Task」コマンドで「Goodbye」タスクが実行されるようになる。ここでは、ビルドとは関係ないタスクを指定したが、実際にはビルド作業をワンタッチで実行できるようにするための便利なコマンドなので、このプロパティの指定とキーボードショートカットは活用したいところだ。
この他にもテストタスクの指定なども行える。タスクの活用方法の詳細については「Integrate with External Tools via Tasks」ページを、tasks.jsonファイルのスキーマについては「Appendix」を参照してほしい。
ここまではechoコマンドを使った、毒にも薬にもならないサンプルを見てきたが、タスクの紹介の最後に、TypeScriptコードのコンパイル例と、Node.jsアプリでタスクを利用しているところを紹介しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.