まくろぐ
更新: / 作成:

Deno のタスクランナーとは? npm スクリプトとの違いは?

Deno は標準で deno task コマンド を提供しており、deno.json(あるいは deno.jsonc)の tasks プロパティで定義したタスクを実行できるようになっています。 これは、Node.js で言うところの npm スクリプト (npm run) に相当するものですが、deno task の場合は、クロスプラットフォームなタスクを定義できる ところが大きな特徴になっています。

deno.json でのタスク定義
{
  "tasks": {
    "hello": "echo Hello, Deno Task Runner!"
  }
}
タスクの実行方法
$ deno task hello

npm スクリプトの場合は、定義したタスクが OS のシェル上で実行されることが前提だったので、シェルの機能をうかつに使ってしまうと、Linux では動くけど Windows では動かないというタスクなってしまいがちでした。 例えば、ファイルをまとめて削除するタスクを作りたい場合、Linux に依存した rm -rf コマンドは使えず、いちいち rimraf モジュールをインストールするといったことが必要でした。 一方、Deno 場合は、クロスプラットフォームで動作する 組み込みコマンドとして rm コマンドを備えています。 他にも、cpmvmkdirechocat といったよく使うコマンドが、Linux や Windows、macOS などで共通で使えるようになっています。

また、Linux と Windows では、パイプやリダイレクトの記述方法も微妙に異なっていますが、Deno のタスクランナーでは、組み込みでパイプやリダイレクトの構文を処理する ようになっており、連続したコマンド実行も OS のシェルに依存せずに定義できます。

jsonc フォーマットがおすすめ (JSON with Comments)

deno.json の代わりに、deno.jsonc という名前で Deno の設定ファイルを作成すると、ファイル内にコメントを記述することができます。 JSONC は JSON with Comments の略です。

deno.jsonc
{
  "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 <タスク名> <引数...> のように渡した引数は、タスクで定義されているコマンドに渡されます。

deno.json
{
  "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

関連記事

まくろぐ
サイトマップまくへのメッセージ