配方参数

配方可以有参数。这里的配方 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

参数可以有默认值:

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