deno.com
本頁面內容

deno task

命令列用法

deno task [OPTIONS] [TASK]

執行組態檔中定義的任務。

deno task build

列出所有可用的任務

deno task

從字串評估任務

deno task --eval "echo $(pwd)"

選項 Jump to heading

--config Jump to heading

簡短標記:-c

設定 deno 的不同面向,包括 TypeScript、程式碼檢查和程式碼格式化。通常組態檔會被命名為 deno.jsondeno.jsonc 並自動偵測;在這種情況下,此標記不是必要的。

--cwd Jump to heading

指定執行任務的目錄。

--eval Jump to heading

評估傳遞的值,如同它是組態檔中的任務。

--filter Jump to heading

簡短標記:-f

依名稱篩選工作區的成員 - 應與 --recursive 一起使用。

--recursive Jump to heading

簡短標記:-r

在工作區中所有專案中執行任務。

依賴管理選項 Jump to heading

--node-modules-dir Jump to heading

設定 npm 套件的 node modules 管理模式。

描述 Jump to heading

deno task 提供一種跨平台的方式來定義和執行特定於程式碼庫的自訂命令。

若要開始使用,請在您的程式碼庫的 Deno 組態檔 中,在 "tasks" 鍵下定義您的命令。

例如

{
  "tasks": {
    "data": "deno task collect && deno task analyze",
    "collect": "deno run --allow-read=. --allow-write=. scripts/collect.js",
    "analyze": {
      "description": "Run analysis script",
      "command": "deno run --allow-read=. scripts/analyze.js"
    }
  }
}

指定目前工作目錄 Jump to heading

預設情況下,deno task 會以 Deno 組態檔(例如 deno.json)的目錄作為目前工作目錄來執行命令。這允許任務使用相對路徑,並在目錄樹中的任何位置執行 deno task 時繼續運作。在某些情況下,這可能不是所希望的,並且可以使用 INIT_CWD 環境變數來覆寫此行為。

如果尚未設定 INIT_CWD,則會將其設定為執行任務所在目錄的完整路徑。這與 npm run 的行為一致。

例如,以下任務會將任務的目前工作目錄變更為使用者執行任務所在的相同目錄,然後輸出目前工作目錄,而現在該目錄就是該目錄(請記住,這也適用於 Windows,因為 deno task 是跨平台的)。

{
  "tasks": {
    "my_task": "cd $INIT_CWD && pwd"
  }
}

取得執行 deno task 的目錄 Jump to heading

由於任務是使用 Deno 組態檔的目錄作為目前工作目錄來執行的,因此了解 deno task 從哪個目錄執行可能很有用。這可以透過在從 deno task 啟動的任務或腳本中使用 INIT_CWD 環境變數來實現(運作方式與 npm run 相同,但以跨平台方式)。

例如,若要在任務中將此目錄提供給腳本,請執行以下操作(請注意,目錄用雙引號括起來,以使其在包含空格時保持為單一引數)

{
  "tasks": {
    "start": "deno run main.ts \"$INIT_CWD\""
  }
}

任務的萬用字元比對 Jump to heading

deno task 命令可以透過傳遞萬用字元模式來平行執行多個任務。萬用字元模式以 * 字元指定。

deno.json
{
  "tasks": {
    "build-client": "deno run -RW client/build.ts",
    "build-server": "deno run -RW server/build.ts"
  }
}

執行 deno task "build-*" 將會執行 build-clientbuild-server 任務。

注意

當使用萬用字元時,請務必將任務名稱加上引號 (例如 "build-*"),否則您的 shell 可能會嘗試展開萬用字元,導致意外的錯誤。

任務依賴性 Jump to heading

您可以為任務指定依賴性

deno.json
{
  "tasks": {
    "build": "deno run -RW build.ts",
    "generate": "deno run -RW generate.ts",
    "serve": {
      "command": "deno run -RN server.ts",
      "dependencies": ["build", "generate"]
    }
  }
}

在以上範例中,執行 deno task serve 將會先平行執行 buildgenerate 任務,並且一旦它們都成功完成,就會執行 serve 任務

$ deno task serve
Task build deno run -RW build.ts
Task generate deno run -RW generate.ts
Generating data...
Starting the build...
Build finished
Data generated
Task serve deno run -RN server.ts
Listening on https://127.0.0.1:8000/

依賴任務會平行執行,預設的平行限制等於您機器上的核心數。若要變更此限制,請使用 DENO_JOBS 環境變數。

依賴性會被追蹤,如果多個任務依賴於同一個任務,則該任務只會執行一次

deno.json
{
  //   a
  //  / \
  // b   c
  //  \ /
  //   d
  "tasks": {
    "a": {
      "command": "deno run a.js",
      "dependencies": ["b", "c"]
    },
    "b": {
      "command": "deno run b.js",
      "dependencies": ["d"]
    },
    "c": {
      "command": "deno run c.js",
      "dependencies": ["d"]
    },
    "d": "deno run d.js"
  }
}
$ deno task a
Task d deno run d.js
Running d
Task c deno run c.js
Running c
Task b deno run b.js
Running b
Task a deno run a.js
Running a

如果發現依賴性之間存在循環,將會傳回錯誤

deno.json
{
  "tasks": {
    "a": {
      "command": "deno run a.js",
      "dependencies": ["b"]
    },
    "b": {
      "command": "deno run b.js",
      "dependencies": ["a"]
    }
  }
}
$ deno task a
Task cycle detected: a -> b -> a

您也可以指定一個具有 dependencies 但沒有 command 的任務。這對於將多個任務邏輯地分組在一起很有用

deno.json
{
  "tasks": {
    "dev-client": "deno run --watch client/mod.ts",
    "dev-server": "deno run --watch sever/mod.ts",
    "dev": {
      "dependencies": ["dev-client", "dev-server"]
    }
  }
}

執行 deno task dev 將會平行執行 dev-clientdev-server

工作區支援 Jump to heading

deno task 可以在工作區中使用,以平行執行來自多個成員目錄的任務。若要從所有工作區成員執行 dev 任務,請使用 --recursive 標記

deno.json
{
  "workspace": [
    "client",
    "server"
  ]
}
client/deno.json
{
  "name": "@scope/client",
  "tasks": {
    "dev": "deno run -RN build.ts"
  }
}
server/deno.json
{
  "name": "@scope/server",
  "tasks": {
    "dev": "deno run -RN server.ts"
  }
}
$ deno task --recursive dev
Task dev deno run -RN build.ts
Task dev deno run -RN server.ts
Bundling project...
Listening on https://127.0.0.1:8000/
Project bundled

可以根據工作區成員篩選要執行的任務

$ deno task --filter "client" dev
Task dev deno run -RN build.ts
Bundling project...
Project bundled

請注意,篩選器會比對每個成員的 deno.json 檔案的 name 欄位中指定的工作區成員名稱。

語法 Jump to heading

deno task 使用跨平台 shell,它是 sh/bash 的子集,用於執行定義的任務。

布林列表 Jump to heading

布林列表提供了一種根據初始命令的結束代碼執行其他命令的方式。它們使用 &&|| 運算子分隔命令。

&& 運算子提供了一種執行命令的方式,如果它成功(結束代碼為 0),它將執行下一個命令

deno run --allow-read=. --allow-write=. collect.ts && deno run --allow-read=. analyze.ts

|| 運算子則相反。它提供了一種執行命令的方式,只有當它失敗(結束代碼為非零)時,它才會執行下一個命令

deno run --allow-read=. --allow-write=. collect.ts || deno run play_sad_music.ts

循序列表 Jump to heading

循序列表與布林列表類似,但無論列表中的前一個命令是否通過或失敗,都會執行。命令以分號 (;) 分隔。

deno run output_data.ts ; deno run --allow-net server.ts

非同步命令 Jump to heading

非同步命令提供了一種使命令非同步執行的方式。當啟動多個程序時,這可能很有用。若要使命令非同步,請在其末尾新增 &。例如,以下程式碼會同時執行 sleep 1 && deno run --allow-net client.tsdeno run --allow-net server.ts

sleep 1 && deno run --allow-net client.ts & deno run --allow-net server.ts

與大多數 shell 不同,第一個失敗的非同步命令會導致所有其他命令立即失敗。在上述範例中,這表示如果 client 命令失敗,則 server 命令也會失敗並結束。您可以透過在命令末尾新增 || true 來選擇退出此行為,這將強制執行 0 結束代碼。例如

deno run --allow-net client.ts || true & deno run --allow-net server.ts || true

環境變數 Jump to heading

環境變數的定義方式如下

export VAR_NAME=value

以下是在任務中使用環境變數的範例,其中包含 shell 變數替換,然後將其匯出為衍生 Deno 程序的環境的一部分(請注意,在 JSON 組態檔中,雙引號需要使用反斜線逸出)

export VAR=hello && echo $VAR && deno eval "console.log('Deno: ' + Deno.env.get('VAR'))"

會輸出

hello
Deno: hello

為命令設定環境變數 Jump to heading

若要在命令之前指定環境變數,請像這樣列出它們

VAR=hello VAR2=bye deno run main.ts

這將專門針對以下命令使用這些環境變數。

Shell 變數 Jump to heading

Shell 變數與環境變數類似,但不會匯出到衍生的命令。它們使用以下語法定義

VAR_NAME=value

如果我們在與先前的「環境變數」章節中所示範例類似的範例中使用 shell 變數而不是環境變數

VAR=hello && echo $VAR && deno eval "console.log('Deno: ' + Deno.env.get('VAR'))"

我們將得到以下輸出

hello
Deno: undefined

當我們想要重複使用值,但不希望它在任何衍生的程序中可用時,Shell 變數會很有用。

結束狀態變數 Jump to heading

先前執行的命令的結束代碼可在 $? 變數中使用。

# outputs 10
deno eval 'Deno.exit(10)' || echo $?

管線 Jump to heading

管線提供一種將一個命令的輸出導向另一個命令的方式。

以下命令將 stdout 輸出「Hello」導向衍生 Deno 程序的 stdin

echo Hello | deno run main.ts

若要導向 stdout 和 stderr,請改用 |&

deno eval 'console.log(1); console.error(2);' |& deno run main.ts

命令替換 Jump to heading

$(command) 語法提供了一種在其他執行的命令中使用命令輸出的方式。

例如,若要將取得最新 git 修訂版本的輸出提供給另一個命令,您可以執行以下操作

deno run main.ts $(git rev-parse HEAD)

另一個使用 shell 變數的範例

REV=$(git rev-parse HEAD) && deno run main.ts $REV && echo $REV

否定結束代碼 Jump to heading

若要否定結束代碼,請在命令前新增驚嘆號和空格

# change the exit code from 1 to 0
! deno eval 'Deno.exit(1);'

重新導向 Jump to heading

重新導向提供一種將 stdout 和/或 stderr 導向檔案的方式。

例如,以下程式碼將 deno run main.tsstdout 重新導向到檔案系統上名為 file.txt 的檔案

deno run main.ts > file.txt

若要改為重新導向 stderr,請使用 2>

deno run main.ts 2> file.txt

若要同時重新導向 stdout stderr,請使用 &>

deno run main.ts &> file.txt

若要附加到檔案,而不是覆寫現有檔案,請使用兩個向右角括號而不是一個

deno run main.ts >> file.txt

可以透過重新導向到 /dev/null 來抑制命令的 stdout、stderr 或兩者。這以跨平台方式運作,包括在 Windows 上。

# suppress stdout
deno run main.ts > /dev/null
# suppress stderr
deno run main.ts 2> /dev/null
# suppress both stdout and stderr
deno run main.ts &> /dev/null

或將 stdout 重新導向到 stderr,反之亦然

# redirect stdout to stderr
deno run main.ts >&2
# redirect stderr to stdout
deno run main.ts 2>&1

也支援輸入重新導向

# redirect file.txt to the stdin of gzip
gzip < file.txt

請注意,目前不支援重新導向多個重新導向。

跨平台 Shebang Jump to heading

從 Deno 1.42 開始,deno task 將在所有平台上以相同的方式執行以 #!/usr/bin/env -S 開頭的腳本。

例如

script.ts
#!/usr/bin/env -S deno run
console.log("Hello there!");
deno.json
{
  "tasks": {
    "hi": "./script.ts"
  }
}

然後在 Windows 機器上

> pwd
C:\Users\david\dev\my_project
> deno task hi
Hello there!

Glob 擴展 Jump to heading

Deno 1.34 及更高版本支援 Glob 擴展。這允許指定 glob 以跨平台方式比對檔案。

# match .ts files in the current and descendant directories
echo **/*.ts
# match .ts files in the current directory
echo *.ts
# match files that start with "data", have a single number, then end with .csv
echo data[0-9].csv

支援的 glob 字元為 *?[/]

內建命令 Jump to heading

deno task 隨附多個內建命令,這些命令在 Windows、Mac 和 Linux 上都能開箱即用。

  • cp - 複製檔案。
  • mv - 移動檔案。
  • rm - 移除檔案或目錄。
    • 範例:rm -rf [FILE]... - 通常用於遞迴刪除檔案或目錄。
  • mkdir - 建立目錄。
    • 範例:mkdir -p DIRECTORY... - 通常用於建立目錄及其所有父目錄,如果目錄已存在則不會發生錯誤。
  • pwd - 列印目前/工作目錄的名稱。
  • sleep - 延遲指定的時間量。
    • 範例:sleep 1 睡眠 1 秒,sleep 0.5 睡眠半秒,或 sleep 1m 睡眠 1 分鐘
  • echo - 顯示文字行。
  • cat - 連接檔案並將其輸出到 stdout。當未提供引數時,它會讀取並輸出 stdin。
  • exit - 導致 shell 結束。
  • head - 輸出檔案的第一部分。
  • unset - 取消設定環境變數。
  • xargs - 從 stdin 建置引數並執行命令。

如果您發現命令中缺少有用的標記,或對應開箱即用的其他命令有任何建議,請在 deno_task_shell 儲存庫上開啟 issue

請注意,如果您希望在 Mac 或 Linux 上以非跨平台方式執行任何這些命令,則可以透過 sh 執行它:sh -c <command> (例如 sh -c cp source destination)。

package.json 支援 Jump to heading

如果發現 package.json 檔案,deno task 會回退到從 package.json 檔案中的 "scripts" 條目讀取。請注意,Deno 不尊重或支援任何 npm 生命周期事件,例如 preinstallpostinstall — 您必須明確執行您想要執行的腳本條目 (例如 deno install --entrypoint main.ts && deno task postinstall)。

您找到需要的資訊了嗎?

隱私權政策