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 的对比:

特性Makefilejust
.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. 使用原则

项目常用动作要有名字linttestbuildfmtcheckbootstrapdeploy 应该能被快速发现。

README 和 justfile 分工:README 说明背景、依赖和注意事项;justfile 执行稳定命令。

危险动作显式命名:清理、删除、部署、覆盖数据这类 recipe 不要伪装成普通命令,必要时加确认或 dry-run。

CI 和本地共用入口:如果 CI 跑的是 just test,本地也跑 just test,环境差异会少很多。

Agent 友好:任务名称清晰、参数明确、输出稳定,未来让 Agent 修 bug 或跑验证时就不需要猜命令。

延伸阅读