概述
官网,Rust实现、开源(GitHub,36K Star,851 Fork)跨平台、轻量级命令行工具;类似于传统Make工具,提供一种简单高效的方式来管理项目任务,不是构建系统。中文文档。
Make是给C项目做增量编译用的,其核心逻辑是比对文件时间戳,决定哪些东西需要重新构建。但绝大多数团队用于跑测试、部署、清理、启动开发服务器。每次都得写.PHONY声明。
特性:
- 错误信息清晰具体
- 支持命令行参数和环境变量
- 自动补全功能
- 无需声明
.PHONY目标 - 可从项目任意子目录调用,不用切到根目录
优势
- 避免Make的"up to date"问题
- 更友好的错误信息
- 内置函数和环境变量支持
- 更简洁的变量系统
- 无需声明伪目标
函数
内置函数
| 函数 | 描述 |
|---|---|
arch() |
指令集结构 |
os() |
操作系统 |
os_family() |
操作系统系列 |
env_var(key) |
获取名称为key的环境变量,如果不存在则终止 |
env_var_or_default(key, default) |
获取名称为key的环境变量,如果不存在则返回default |
invocation_directory() |
获取just被调用时当前目录所对应的绝对路径 |
justfile() |
取得当前justfile的路径 |
justfile_directory() |
取得当前justfile文件父目录的路径 |
just_executable() |
just可执行文件的绝对路径 |
quote(s) |
用单引号包裹字符串并转义内部单引号 |
replace(s, from, to) |
替换字符串中的所有匹配项 |
replace_regex(s, regex, repl) |
使用正则表达式替换字符串 |
trim(s) |
移除首尾空白字符 |
trim_end(s) |
移除尾部空白字符 |
trim_end_match(s, substr) |
移除匹配的后缀 |
trim_end_matches(s, substr) |
重复移除匹配的后缀 |
trim_start(s) |
移除首部空白字符 |
trim_start_match(s, substr) |
移除匹配的前缀 |
trim_start_matches(s, substr) |
重复移除匹配的前缀 |
capitalize(s) |
首字母大写其余小写 |
kebabcase(s) |
转换为kebab-case |
lowercamelcase(s) |
转换为lowerCamelCase |
lowercase(s) |
转换为全小写 |
shoutykebabcase(s) |
转换为SHOUTY-KEBAB-CASE |
shoutysnakecase(s) |
转换为SHOUTY_SNAKE_CASE |
snakecase(s) |
转换为snake_case |
titlecase(s) |
转换为Title Case |
uppercamelcase(s) |
转换为UpperCamelCase |
uppercase(s) |
转换为全大写 |
absolute_path(path) |
将相对路径转为绝对路径 |
extension(path) |
获取文件扩展名 |
file_name(path) |
获取文件名(含扩展名) |
file_stem(path) |
获取文件名(不含扩展名) |
parent_directory(path) |
获取父目录路径 |
without_extension(path) |
获取不含扩展名的路径 |
clean(path) |
简化路径(移除冗余部分) |
join(a, b...) |
拼接路径(自动处理分隔符) |
path_exists(path) |
检查路径是否存在 |
error(message) |
终止执行并显示错误消息 |
sha256(string) |
计算字符串的SHA-256哈希值(十六进制) |
sha256_file(path) |
计算文件的SHA-256哈希值(十六进制) |
uuid() |
生成随机UUID |
解读:
arch()输出:aarch64、arm、asmjs、hexagon、mips、msp430、powerpc、powerpc64、s390x、sparc、wasm32、x86、x86_64、xcoreos()输出:android、bitrig、dragonfly、emscripten、freebsd、haiku、ios、linux、macos、netbsd、openbsd、solaris、和windowsos_family()输出:unix、windows
语法
或叫功能,包括:
-
变量:通过
:=进行赋值,并在配方中通过{``{变量名}}方式进行引用;可在命令行传参覆盖 -
@前缀:不显示命令本身,只显示输出 -
加载
.env文件:在justfile顶部加上:set dotenv-load -
依赖机制:在配方名后面列出依赖的配方就行。
install:
npm ci
build: install
npm run build
test: build
npm test
运行 just test时,Just 会先跑 install,再跑 build,最后跑 test。依赖关系清晰,执行顺序自动解析。可用 --no-deps 跳过依赖。
-
支持配方带参数:
deploy target:
./scripts/deploy.sh {{target}}参数设置默认值
build mode="release":
cargo build --{{mode}}
执行命令
bash
just deploy staging
just deploy production
- 支持Shebang配方:
bash
count-files:
#!/usr/bin/env python3
import os
print(len(os.listdir(".")))
Just会把配方内容存成临时文件然后用Shebang指定的解释器去跑。
- 可通过反引号来执行系统命令
- 条件判断:
bash
build_type := if os() == "windows" { "exe" } else { "bin" }
arch := if arch() == "x86_64" {
"amd64"
} else if arch() == "aarch64" {
"arm64"
} else {
error("Unsupported architecture")
}
# 反引号
current_branch := `git branch --show-current`
Justfile
语法受make启发
| 特性 | Just | Make |
|---|---|---|
| 语法 | 简洁直观 | 较为复杂 |
| 跨平台 | 原生支持 | 需要兼容层 |
| 错误处理 | 清晰详细 | 有时晦涩 |
| 变量作用域 | 统一简单 | 多种类型 |
| 自动补全 | 完善支持 | 有限 |
| .PHONY声明 | 不需要 | 需要 |
| 环境变量 | 内置支持 | 需要额外处理 |
| 现代功能 | 条件、函数等 | 有限 |
实战
安装:
bash
brew install just
winget install --id Casey.Just
cargo install just
示例:
bash
# 注释
build:
echo "Building project..."
cargo build
test:
echo "Running tests..."
cargo test
命令行使用示例:
bash
# 列出所有配方,以_开头的配方会被隐藏
just --list
just --list --unsorted
just --summary
# 查看某个配方的具体内容
just --show <recipe>
# 用交互式选择器选配方
just --choose
用于Java项目:
bash
# 构建应用
build:
./mvnw clean package
# 构建 Docker 镜像(依赖 build,会先执行 build)
docker: build
docker build -t my-app:latest .
docker push my-app:latest
# 本地运行(依赖 build)
run: build
./mvnw spring-boot:run -Dspring-boot.run.profiles=local
用于Node.js项目:
bash
install:
npm ci
build: install
npm run build
test: build
npm test