概述
官网,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、xcore
- os()输出:android、bitrig、dragonfly、emscripten、freebsd、haiku、ios、linux、macos、netbsd、openbsd、solaris、和windows
- os_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}}
执行命令
just deploy staging
just deploy production
- 支持Shebang配方:
count-files:
#!/usr/bin/env python3
import os
print(len(os.listdir(".")))
Just会把配方内容存成临时文件然后用Shebang指定的解释器去跑。
- 可通过反引号来执行系统命令
- 条件判断:
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启发
| 语法 | 简洁直观 | 较为复杂 |
| 跨平台 | 原生支持 | 需要兼容层 |
| 错误处理 | 清晰详细 | 有时晦涩 |
| 变量作用域 | 统一简单 | 多种类型 |
| 自动补全 | 完善支持 | 有限 |
| .PHONY声明 | 不需要 | 需要 |
| 环境变量 | 内置支持 | 需要额外处理 |
| 现代功能 | 条件、函数等 | 有限 |
实战
安装:
brew install just
winget install –id Casey.Just
cargo install just
示例:
# 注释
build:
echo "Building project…"
cargo build
test:
echo "Running tests…"
cargo test
命令行使用示例:
# 列出所有配方,以_开头的配方会被隐藏
just –list
just –list –unsorted
just –summary
# 查看某个配方的具体内容
just –show <recipe>
# 用交互式选择器选配方
just –choose
用于Java项目:
# 构建应用
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项目:
install:
npm ci
build: install
npm run build
test: build
npm test
生态
- vim-just:插件可为vim提供justfile语法高亮显示
- just-mode:可为justfile提供语法高亮和自动缩进






