设置

设置控制解释和执行。每个设置最多可以指定一次,可以出现在 justfile 的任何地方。

例如:

set shell := ["zsh", "-cu"]

foo:
  # this line will be run as `zsh -cu 'ls **/*.txt'`
  ls **/*.txt

设置一览表

名称默认描述
allow-duplicate-recipesbooleanFalse允许在 justfile 后面出现的配方覆盖之前的同名配方
allow-duplicate-variablesbooleanFalse允许在 justfile 后面出现的变量覆盖之前的同名变量
dotenv-filenamestring-如果有自定义名称的 .env 环境变量文件的话,则将其加载
dotenv-loadbooleanFalse如果有.env 环境变量文件的话,则将其加载
dotenv-pathstring-从自定义路径中加载 .env 环境变量文件, 文件不存在将会报错。可以覆盖 dotenv-filename
dotenv-requiredbooleanFalse如果 .env 环境变量文件不存在的话,需要报错
exportbooleanFalse将所有变量导出为环境变量
fallbackbooleanFalse如果命令行中的第一个配方没有找到,则在父目录中搜索 justfile
ignore-commentsbooleanFalse忽略以#开头的配方行
positional-argumentsbooleanFalse传递位置参数
shell[COMMAND, ARGS…]-设置用于调用配方和评估反引号内包裹内容的命令
tempdirstring-tempdir 位置创建临时目录,而不是系统默认的临时目录
windows-powershellbooleanFalse在 Windows 上使用 PowerShell 作为默认 Shell(废弃,建议使用 windows-shell)
windows-shell[COMMAND, ARGS…]-设置用于调用配方和评估反引号内包裹内容的命令

Bool 类型设置可以写成:

set NAME

这就相当于:

set NAME := true

允许重复的配方

如果 allow-duplicate-recipes 被设置为 true,那么定义多个同名的配方就不会出错,而会使用最后的定义。默认为 false

set allow-duplicate-recipes

@foo:
  echo foo

@foo:
  echo bar
$ just foo
bar

允许重复的变量

如果 allow-duplicate-variables 被设置为 true,那么定义多个同名的变量将不会报错。默认为 false

set allow-duplicate-variables

a := "foo"
a := "bar"

@foo:
  echo $a
$ just foo
bar

环境变量加载

如果 dotenv-load, dotenv-filename, dotenv-path, or dotenv-required 中任意一项被设置, just 会尝试从文件中加载环境变量

如果设置了 dotenv-path, just 会在指定的路径下搜索文件,该路径可以是绝对路径, 也可以是基于当前工作路径的相对路径

如果设置了 dotenv-filenamejust 会在指定的相对路径,以及其所有的上层目录中,搜索指定文件

如果没有设置 dotenv-filename,但是设置了 dotenv-loaddotenv-requiredjust 会在当前工作路径,以及其所有的上层目录中,寻找名为 .env 的文件。

dotenv-filenamedotenv-path 很相似,但是 dotenv-path 只会检查指定的目录 而 dotenv-filename 会检查指定目录以及其所有的上层目录。

如果没有找到环境变量文件也不会报错,除非设置了 dotenv-required

从文件中加载的变量是环境变量,而非 just 变量,所以在配方和反引号中需要必须通过 $VARIABLE_NAME 来调用。

比如,如果你的 .env 文件包含以下内容:

# a comment, will be ignored
DATABASE_ADDRESS=localhost:6379
SERVER_PORT=1337

并且你的 justfile 包含:

set dotenv-load

serve:
  @echo "Starting server with database $DATABASE_ADDRESS on port $SERVER_PORT…"
  ./server --database $DATABASE_ADDRESS --port $SERVER_PORT

just serve 将会输出:

$ just serve
Starting server with database localhost:6379 on port 1337…
./server --database $DATABASE_ADDRESS --port $SERVER_PORT

导出

export 设置使所有 just 变量作为环境变量被导出。默认值为 false

set export

a := "hello"

@foo b:
  echo $a
  echo $b
$ just foo goodbye
hello
goodbye

位置参数

如果 positional-argumentstrue,配方参数将作为位置参数传递给命令。对于行式配方,参数 $0 将是配方的名称。

例如,运行这个配方:

set positional-arguments

@foo bar:
  echo $0
  echo $1

将产生以下输出:

$ just foo hello
foo
hello

当使用 sh 兼容的 Shell,如 bashzsh 时,$@ 会展开为传给配方的位置参数,从1开始。当在双引号内使用 "$@" 时,包括空白的参数将被传递,就像它们是双引号一样。也就是说,"$@" 相当于 "$1" "$2"……当没有位置参数时,"$@"$@ 将展开为空(即,它们被删除)。

这个例子的配方将逐行打印参数:

set positional-arguments

@test *args='':
  bash -c 'while (( "$#" )); do echo - $1; shift; done' -- "$@"

两个 参数运行:

$ just test foo "bar baz"
- foo
- bar baz

Shell

shell 设置控制用于调用执行配方代码行和反引号内指令的命令。Shebang 配方不受影响。

# use python3 to execute recipe lines and backticks
set shell := ["python3", "-c"]

# use print to capture result of evaluation
foos := `print("foo" * 4)`

foo:
  print("Snake snake snake snake.")
  print("{{foos}}")

just 把要执行的命令作为一个参数进行传递。许多 Shell 需要一个额外的标志,通常是 -c,以使它们评估执行第一个参数。

Windows Shell

just 在 Windows 上默认使用 sh。要在 Windows 上使用不同的 Shell,请使用windows-shell

set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]

hello:
  Write-Host "Hello, world!"

参考 powershell.just ,了解在所有平台上使用 PowerShell 的 justfile。

Windows PowerShell

set windows-powershell 使用遗留的 powershell.exe 二进制文件,不再推荐。请参阅上面的 windows-shell 设置,以通过更灵活的方式来控制在 Windows 上使用哪个 Shell。

just 在 Windows 上默认使用 sh。要使用 powershell.exe 作为替代,请将 windows-powershell 设置为 true

set windows-powershell := true

hello:
  Write-Host "Hello, world!"
Python 3
set shell := ["python3", "-c"]
Bash
set shell := ["bash", "-uc"]
Z Shell
set shell := ["zsh", "-uc"]
Fish
set shell := ["fish", "-c"]
Nushell
set shell := ["nu", "-c"]

如果你想设置默认的表格显示模式为 light:

set shell := ['nu', '-m', 'light', '-c']

Nushell 使用 Rust 开发并且具备良好的跨平台能力,支持 Windows / macOS 和各种 Linux 发行版