跳到主要内容

任务运行器

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 task task-name [additional args]...

在上面的示例中,要运行 data 任务,我们将执行:

deno task data

指定当前工作目录

默认情况下,deno task 会使用 Deno 配置文件(例如deno.json)所在的目录作为当前工作目录来执行命令。这允许任务使用相对路径,并且可以在执行 deno 任务的目录树的任何位置继续工作。在某些情况下,这可能不是期望的行为,可以使用 INIT_CWD 环境变量来覆盖此行为。

如果尚未设置,INIT_CWD 将设置为任务运行所在目录的完整路径。这与 npm run 的行为相同。

例如,以下任务将更改任务的当前工作目录为用户从中运行任务的同一目录,然后输出当前工作目录,即该目录(请记住,这也适用于 Windows,因为 deno task 是跨平台的)。

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

获取 deno task 运行的目录

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

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

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

语法

deno task 使用一个交叉平台的 shell,它是 sh/bash 的子集,用于执行定义的任务。

布尔列表

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

&& 运算符提供了一种执行命令的方式,如果它“成功”(具有退出代码 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 变量可能会很有用。

管道

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

以下命令将 stdout 输出“Hello”传送到生成的 Deno 进程的 stdin:

echo Hello | deno run main.ts

要传送 stdout 和 stderr,请改用 |&

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

否定退出代码

要否定退出代码,请在命令之前添加感叹号和空格:

将退出代码从 1 更改为 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 在内的跨平台方式上都有效。

抑制标准输出
deno run main.ts > /dev/null
# 抑制标准错误
deno run main.ts 2> /dev/null
# 抑制标准输出和标准错误
deno run main.ts &> /dev/null

请注意,目前不支持重定向输入和多重重定向。

Glob 扩展

Deno 1.34 及更高版本支持 Glob 扩展。这允许以跨平台方式指定匹配文件的通配符。

# 匹配当前目录和子目录中的.ts文件
echo **/*.ts
# 匹配当前目录中的.ts文件
echo *.ts
# 匹配以"data"开头,后跟一个数字,然后以.csv结尾的文件
echo data[0-9].csv

支持的通配符字符为 *?[/]

内置命令

deno task 附带了几个内置命令,可以在 Windows、Mac 和 Linux 上开箱即用。

  • cp - 复制文件。
  • mv - 移动文件。
  • rm - 删除文件或目录。
    • 例如:rm -rf [文件]... - 常用于递归删除文件或目录。
  • mkdir - 创建目录。
    • 例如:mkdir -p 目录... - 常用于创建目录及其所有父目录,如果存在则不报错。
  • pwd - 打印当前工作目录的名称。
  • sleep - 延迟指定的时间。
    • 例如:sleep 1 表示休眠1秒,sleep 0.5 表示休眠半秒,sleep 1m 表示休眠一分钟。
  • echo - 显示一行文本。
  • cat - 连接文件并将它们输出到标准输出。当没有提供参数时,读取并输出标准输入。
  • exit - 导致 shell 退出。
  • head - 输出文件的前一部分。
  • unset - 取消设置环境变量。
  • xargs - 从标准输入构建参数并执行命令。

如果发现命令上缺少有用的标志,或对于应该默认支持的其他命令有建议,请在 deno_task_shell 存储库上 提出问题

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