just命令运行器

(3 mins to read)

比Makefile更人性化,专注于运行一组命令(称为配方,recipe),而不是进行构建(具体地,Make专注于进行增量式构建,如果发现生成的可执行文件已经是最新的,就不会进行任何操作了,这显然不是一个命令运行器应该做的)。

安装

1
cargo install just

使用

只需创建一个名为justfile的文件。

在调用just时,它会在当前目录和父目录中寻找justfile

当有一条命令运行失败,配方就会停止运行。

在调用just但没有传入任何配方时,会运行第一个配方,即默认配方,因此第一个配方通常选择项目中最常运行的命令。

紧接着配方前面的注释将出现在ust --list中。

  • just --list
  • just --summary
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
alias b := build

host := `uname -a`

# build main
build:
cc *.c -o main

# test everything
test-all: build
./test --all

# run a specific test
test TEST: build
./test --test {{TEST}}

#!开头的配方被称为Shebang配方,它通过将配方主体保存到文件中并运行它来执行。这让你可以用不同的语言来编写配方:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
python:
#!/usr/bin/env python3
print('Hello from python!')

sh:
#!/usr/bin/env sh
hello='Yo'
echo "$hello from a shell script!"

foo:
#!/usr/bin/env bash
set -euxo pipefail
hello='Yo'
echo "$hello from Bash!"

在bash中,set -e使bash在命令失败时退出,set -u使bash在变量未定义时退出,set -x使bash在运行前打印每一行脚本,set -o pipefail使bash在管道中的一个命令失败时退出。

我个人认为为几乎每个项目写一个justfile非常有用,无论大小。

在一个有多个贡献者的大项目中,有一个包含项目工作所需的所有命令的文件是非常有用的,这样所有命令唾手可得。

可能有不同的命令来测试、构建、检查、部署等等,把它们都放在一个地方是很方便的,可以减少你花在告诉人们要运行哪些命令和如何输入这些命令的时间。

而且,有了一个容易放置命令的地方,你很可能会想出其他有用的东西,这些东西是项目集体智慧的一部分,但没有写在任何地方,比如修订控制工作流程的某些部分需要的神秘命令,安装你项目的所有依赖,或者所有你可能需要传递给构建系统的任意标志等。