Deno のタスクランナーとは? npm スクリプトとの違いは?
Deno は標準で deno task コマンド を提供しており、deno.json(あるいは deno.jsonc)の tasks プロパティで定義したタスクを実行できるようになっています。
これは、Node.js で言うところの npm スクリプト (npm run) に相当するものですが、deno task の場合は、クロスプラットフォームなタスクを定義できる ところが大きな特徴になっています。
{
"tasks": {
"hello": "echo Hello, Deno Task Runner!"
}
}$ deno task hello
npm スクリプトの場合は、定義したタスクが OS のシェル上で実行されることが前提だったので、シェルの機能をうかつに使ってしまうと、Linux では動くけど Windows では動かないというタスクなってしまいがちでした。
例えば、ファイルをまとめて削除するタスクを作りたい場合、Linux に依存した rm -rf コマンドは使えず、いちいち rimraf モジュールをインストールするといったことが必要でした。
一方、Deno 場合は、クロスプラットフォームで動作する 組み込みコマンドとして rm コマンドを備えています。
他にも、cp、mv、mkdir、echo、cat といったよく使うコマンドが、Linux や Windows、macOS などで共通で使えるようになっています。
また、Linux と Windows では、パイプやリダイレクトの記述方法も微妙に異なっていますが、Deno のタスクランナーでは、組み込みでパイプやリダイレクトの構文を処理する ようになっており、連続したコマンド実行も OS のシェルに依存せずに定義できます。
jsonc フォーマットがおすすめ (JSON with Comments)
deno.json の代わりに、deno.jsonc という名前で Deno の設定ファイルを作成すると、ファイル内にコメントを記述することができます。
JSONC は JSON with Comments の略です。
{
"tasks": {
// データ収集と分析を実行します
"data": "deno task collect && deno task analyze",
// データ収集を実行します
"collect": "deno run --allow-read=. --allow-write=. scripts/collect.js",
// データ分析を実行します
"analyze": "deno run --allow-read=. scripts/analyze.js"
}
}タスクの一覧を表示する
deno task コマンドを 引数なしで実行 すると、定義されているタスクの一覧を表示できます。
$ deno task
Available tasks:
- analyze
deno run --allow-read=. scripts/analyze.js
- collect
deno run --allow-read=. --allow-write=. scripts/collect.js
- data
deno task collect && deno task analyze
Deno プロジェクトを git clone してきたときに、deno task でできることがざっと分かるようになっていると親切ですね。
タスク実行時にコマンドライン引数を渡す
deno task <タスク名> <引数...> のように渡した引数は、タスクで定義されているコマンドに渡されます。
{
"tasks": {
"my-echo": "echo"
}
}例えば、上記のように定義した my-echo タスクを、次のように引数 A B C 付きで実行すると、それらは echo に対して渡されます。
$ deno task my-echo A B C
Task my-echo echo "A" "B" "C"
A B C
コマンドライン引数がどのようにタスクに渡されたかは、出力の 1 行目を見るとわかります。
この 1 行目の出力を抑制するには、deno task コマンドに -q (--quiet) オプションを指定します。
$ deno task -q my-echo A B C
A B C