在本页
deno task
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
执行的目录可能很有用。这可以通过在从 deno task
启动的任务或脚本中使用 INIT_CWD
环境变量来实现(与 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.ts
和 deno 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
或者将标准输出重定向到标准错误,反之亦然
# 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
开头的脚本。
例如
#!/usr/bin/env -S deno run
console.log("Hello there!");
{
"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
- 连接文件并输出到标准输出。如果没有提供参数,它将读取并输出标准输入。exit
- 导致 shell 退出。head
- 输出文件的前一部分。unset
- 取消设置环境变量。xargs
- 从标准输入构建参数并执行命令。
如果您发现某个命令缺少有用的标志,或者有任何关于应该默认支持的其他命令的建议,请在 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 cache main.ts && deno task postinstall
)。