跳转到主要内容
在本页

deno task

命令行用法

deno task [OPTIONS] [TASK]

运行配置文件中定义的任务。

deno task build

列出所有可用任务

deno task

选项 跳转到标题

--config 跳转到标题

简写: -c

配置 Deno 的不同方面,包括 TypeScript、代码检查和代码格式化。通常,配置文件名为 deno.jsondeno.jsonc,并且会被自动检测;在这种情况下,无需使用此标志。

--cwd 跳转到标题

指定运行任务的目录。

依赖管理选项 跳转到标题

--node-modules-dir 跳转到标题

设置 npm 包的 node_modules 管理模式。

描述 跳转到标题

deno task 提供了一种跨平台的方式来定义和执行特定于代码库的自定义命令。

要开始使用,请在代码库的 Deno 配置文件"tasks" 键下定义您的命令。

例如

{
  "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 配置文件(例如 deno.json)所在的目录作为当前工作目录来执行命令。这允许任务使用相对路径,并且无论您在目录树中的哪个位置执行 deno task,任务都能继续工作。在某些情况下,这可能不是您想要的,并且可以使用 INIT_CWD 环境变量覆盖此行为。

如果没有设置 INIT_CWD,它将被设置为运行任务的目录的完整路径。这与 npm run 的行为相同。

例如,以下任务将把任务的当前工作目录更改为用户运行任务所在的目录,然后输出现在的当前工作目录(记住,这在 Windows 上也适用,因为 deno task 是跨平台的)。

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

获取运行 deno task 的目录 跳转到标题

由于任务使用 Deno 配置文件所在的目录作为当前工作目录运行,因此了解执行 deno task 的目录可能很有用。这可以通过在任务或从 deno task 启动的脚本中使用 INIT_CWD 环境变量来实现(与 npm run 中的工作方式相同,但以跨平台的方式)。

例如,要将此目录提供给任务中的脚本,请执行以下操作(请注意,目录用双引号括起来,以便在包含空格的情况下将其保留为单个参数)

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

语法 跳转到标题

deno task 使用 sh/bash 的跨平台子集 shell 来执行定义的任务。

布尔列表 跳转到标题

布尔列表提供了一种根据初始命令的退出代码执行其他命令的方法。它们使用 &&|| 运算符分隔命令。

&& 运算符提供了一种执行命令的方法,如果它_成功_(退出代码为 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

顺序列表 跳转到标题

顺序列表与布尔列表类似,但无论列表中的前一个命令是否通过或失败,都会执行。命令用分号 (;) 分隔。

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

异步命令 跳转到标题

异步命令提供了一种异步执行命令的方法。这在启动多个进程时非常有用。要使命令异步执行,请在其末尾添加 &。例如,以下命令将同时执行 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 不同,第一个失败的异步命令将导致所有其他命令立即失败。在上面的示例中,这意味着如果客户端命令失败,则服务器命令也将失败并退出。您可以通过在命令末尾添加 || true 来选择退出此行为,这将强制退出代码为 0。例如:

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

环境变量 跳转到标题

环境变量的定义如下:

export VAR_NAME=value

以下是在任务中使用 shell 变量替换以及将其作为生成的 Deno 进程环境的一部分导出的示例(请注意,在 JSON 配置文件中,双引号需要用反斜杠转义)

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

将输出

hello
Deno: hello

为命令设置环境变量 跳转到标题

要在命令之前指定环境变量,请像这样列出它们

VAR=hello VAR2=bye deno run main.ts

这将专门为以下命令使用这些环境变量。

Shell 变量 跳转到标题

Shell 变量类似于环境变量,但不会导出到生成的命令。它们使用以下语法定义

VAR_NAME=value

如果我们在与前一节“环境变量”中所示类似的示例中使用 shell 变量而不是环境变量

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

我们将获得以下输出

hello
Deno: undefined

当我们想要重用一个值,但不想在任何生成的进程中使用它时,Shell 变量会很有用。

退出状态变量 跳转到标题

先前运行命令的退出代码可在 $? 变量中找到。

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

管道 跳转到标题

管道提供了一种将一个命令的输出传递到另一个命令的方法。

以下命令将标准输出 “Hello” 通过管道传输到生成的 Deno 进程的标准输入

echo Hello | deno run main.ts

要同时传输标准输出和标准错误输出,请使用 |&

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

命令替换 跳转到标题

$(command) 语法提供了一种在其他要执行的命令中使用命令输出的方法。

例如,要将获取最新 git 版本的输出提供给另一个命令,您可以执行以下操作

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

另一个使用 shell 变量的示例

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

反转退出代码 跳转到标题

要反转退出代码,请在命令前添加一个感叹号和空格

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

重定向 跳转到标题

重定向提供了一种将标准输出和/或标准错误输出传递到文件的方法。

例如,以下命令将 deno run main.ts 的*标准输出*重定向到文件系统上名为 file.txt 的文件

deno run main.ts > file.txt

要重定向*标准错误输出*,请使用 2>

deno run main.ts 2> file.txt

要同时重定向标准输出*和*标准错误输出,请使用 &>

deno run main.ts &> file.txt

要追加到文件而不是覆盖现有文件,请使用两个右尖括号而不是一个

deno run main.ts >> file.txt

通过重定向到 /dev/null 可以抑制命令的标准输出、标准错误输出或两者。这可以跨平台工作,包括在 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 跳转到标题

从 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 展开 跳转到标题

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 字符有 `*`、`?` 和 `[`/`]`。

内置命令 跳转到标题

`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` 睡眠一分钟
  • `echo` - 显示一行文本。
  • `cat` - 连接文件并在 stdout 上输出它们。如果没有提供参数,则读取并输出 stdin。
  • `exit` - 使 shell 退出。
  • `head` - 输出文件的第一部分。
  • `unset` - 取消设置环境变量。
  • `xargs` - 从 stdin 构建参数并执行命令。

如果您发现某个命令缺少有用的标志,或者对应该支持开箱即用的其他命令有任何建议,请在 deno_task_shell 仓库上提交问题

请注意,如果您希望在 Mac 或 Linux 上以非跨平台的方式执行这些命令中的任何一个,则可以通过 `sh` 运行它:`sh -c <command>`(例如 `sh -c cp source destination`)。

package.json 支持 跳转到标题

如果发现 package.json 文件,`deno task` 将回退到读取其中的 `"scripts"` 条目。请注意,Deno 不尊重或支持任何 npm 生命周期事件,例如 `preinstall` 或 `postinstall`——您必须显式运行要运行的脚本条目(例如 `deno install --entrypoint main.ts && deno task postinstall`)。