just的价值不是“少敲几个字”,而是把项目里的长命令、操作序列和隐含约定固化成一个可发现、可复用、可交给人/CI/Agent 执行的命令入口。
1. 任务自动化的哲学
项目开发中总有一些重复命令:构建、测试、部署、格式化、清理。这些命令要么太长记不住,要么有依赖顺序,要么散落在 README 的某个角落。
为什么不只在 README 里写命令?三个原因:容易过时、参数容易敲错、无法被工具直接执行。README 解释为什么,justfile 固化怎么做。
任务自动化工具的价值在于命令的菜单化、标准化、可发现性。你不需要记住命令,只需要知道”有什么可用”。
Makefile 能做这件事,但它有三个致命问题:语法晦涩($@、$<、$^ 是什么?)、Tab vs Space 的缩进陷阱、跨平台兼容性差(GNU Make 和 BSD Make 行为不一致)。
just 的定位很清晰:Makefile 的现代替代,专注做”命令菜单”这一件事。
2. just 的核心概念
just 是一个命令运行器(command runner),不是构建系统。它的核心理念很简单:justfile 就是项目的命令菜单。
Recipe(配方):just 的最小单元,就是一个有名字的命令块。just build 就是执行名叫 build 的 recipe。
Justfile:配置文件,放在项目根目录或 ~/.config/just/justfile(全局)。就是一个列出所有 recipe 的文件,语法比 Makefile 简单得多。
全局 vs 项目:~/.config/just/justfile 是全局的,随便在哪个目录都能用。项目根目录的 justfile 是项目专属的,在项目里会优先找它。
与 Makefile 的对比:
| 特性 | Makefile | just |
|---|---|---|
| .PHONY | 需要显式声明 | 所有 recipe 默认不检查文件 |
| 语法 | Make 专用语法 | 真实编程语法(条件、循环、字符串) |
| 语言支持 | 偏向编译型 | 支持任意语言 |
| 错误处理 | 晦涩 | 清晰,失败即停止 |
| 参数传递 | 困难 | 原生支持 {{ arg }} 模板 |
3. justfile 语法入门
基本 recipe:缩进就是要执行的命令。# 注释会在 just --list 中显示为描述。
# 构建项目
build:
cargo build --release
# 带默认值的参数
serve port="8000":
@echo "Starting server on port {{ port }}"
python -m http.server {{ port }}
# 依赖:先执行 build,再部署
deploy: build
rsync -avz ./target/release/ server:/opt/app/
# 条件判断
check version:
@if [ "{{ version }}" = "release" ]; then
cargo build --release
else
cargo build
fi
# 默认 recipe(直接运行 just 时执行)
default:
just --list完整示例——一个前端项目的 justfile:
# 项目命令菜单
default:
just --list
bootstrap:
npm install && npx playwright install
test:
npm test
lint:
npx eslint src/ --max-warnings 0
fmt:
npx prettier --write "src/**/*.{js,ts}"
build: lint test
npm run build
clean:
rm -rf dist/ node_modules/.cache/
deploy: build
rsync -avz ./dist/ deploy@prod:/var/www/app/全局 justfile 放在 ~/.config/just/justfile,任何目录都可用,适合放系统维护类 recipe。
4. 典型使用场景
| 场景 | 常用 recipe | 说明 |
|---|---|---|
| 项目命令菜单 | just lint / just test / just build / just deploy | 替代 README 中的运行说明 |
| dotfiles 管理 | just sync / just update / just doctor | 封装 chezmoi 和系统维护 |
| AI 辅助开发 | just explore / just review / just fix | 标准化 AI 工作流入口 |
| 环境初始化 | just bootstrap / just setup / just seed | 一键配置开发环境 |
5. just 与其他工具的配合
- chezmoi:用
just sync触发chezmoi apply,用just diff预览变更 - lefthook:在 pre-commit hook 中调用
just lint,统一代码质量检查 - 编辑器集成:VS Code 的 Task Runner、Neovim 的
:terminal可直接调用 just recipe - AI 工具:opencode 的 skill 定义中可直接引用 just recipe 作为可执行操作
6. 使用原则
项目常用动作要有名字:lint、test、build、fmt、check、bootstrap、deploy 应该能被快速发现。
README 和 justfile 分工:README 说明背景、依赖和注意事项;justfile 执行稳定命令。
危险动作显式命名:清理、删除、部署、覆盖数据这类 recipe 不要伪装成普通命令,必要时加确认或 dry-run。
CI 和本地共用入口:如果 CI 跑的是 just test,本地也跑 just test,环境差异会少很多。
Agent 友好:任务名称清晰、参数明确、输出稳定,未来让 Agent 修 bug 或跑验证时就不需要猜命令。