配方参数

配方可以有参数。这里的配方 build 有一个参数叫 target:

build target:
  @echo 'Building {{target}}…'
  cd {{target}} && make

要在命令行上传递参数,请把它们放在配方名称后面:

$ just build my-awesome-project
Building my-awesome-project…
cd my-awesome-project && make

要向依赖配方传递参数,请将依赖配方和参数一起放在括号里:

default: (build "main")

build target:
  @echo 'Building {{target}}…'
  cd {{target}} && make

变量也可以作为参数传递给依赖:

target := "main"

_build version:
  @echo 'Building {{version}}…'
  cd {{version}} && make

build: (_build target)

命令的参数可以通过将依赖与参数一起放在括号中的方式传递给依赖:

build target:
  @echo "Building {{target}}…"

push target: (build target)
  @echo 'Pushing {{target}}…'

参数可以有默认值:

default := 'all'

test target tests=default:
  @echo 'Testing {{target}}:{{tests}}…'
  ./test --tests {{tests}} {{target}}

有默认值的参数可以省略:

$ just test server
Testing server:all…
./test --tests all server

或者提供:

$ just test server unit
Testing server:unit…
./test --tests unit server

默认值可以是任意的表达式,但字符串或路径拼接必须放在括号内:

arch := "wasm"

test triple=(arch + "-unknown-unknown") input=(arch / "input.dat"):
  ./test {{triple}}

配方的最后一个参数可以是变长的,在参数名称前用 +* 表示:

backup +FILES:
  scp {{FILES}} me@server.com:

+ 为前缀的变长参数接受 一个或多个 参数,并展开为一个包含这些参数的字符串,以空格分隔:

$ just backup FAQ.md GRAMMAR.md
scp FAQ.md GRAMMAR.md me@server.com:
FAQ.md                  100% 1831     1.8KB/s   00:00
GRAMMAR.md              100% 1666     1.6KB/s   00:00

* 为前缀的变长参数接受 0个或更多 参数,并展开为一个包含这些参数的字符串,以空格分隔,如果没有参数,则为空字符串:

commit MESSAGE *FLAGS:
  git commit {{FLAGS}} -m "{{MESSAGE}}"

变长参数可以被分配默认值。这些参数被命令行上传递的参数所覆盖:

test +FLAGS='-q':
  cargo test {{FLAGS}}

{{…}} 的替换可能需要加引号,如果它们包含空格。例如,如果你有以下配方:

search QUERY:
  lynx https://www.google.com/?q={{QUERY}}

然后你输入:

$ just search "cat toupee"

just 将运行 lynx https://www.google.com/?q=cat toupee 命令,这将被 sh 解析为lynxhttps://www.google.com/?q=cattoupee,而不是原来的 lynxhttps://www.google.com/?q=cat toupee

你可以通过添加引号来解决这个问题:

search QUERY:
  lynx 'https://www.google.com/?q={{QUERY}}'

$ 为前缀的参数将被作为环境变量导出:

foo $bar:
  echo $bar