你是否厌倦了在终端里反复输入一长串复杂的命令?或者在多个项目中,总是记不清启动服务、运行测试的具体参数?试试 just 吧。这是一个受经典工具 make 启发,但专注于简化日常开发命令管理的利器。它让你能把繁琐的终端指令封装成简洁的“配方”,真正做到“命令即代码”,从而显著提升开发体验和效率。
什么是 just?
just 是一个命令运行器,你只需在项目根目录创建一个名为 justfile 的文本文件,在里面定义好各种命令(它称之为 recipe),之后就可以通过 just <配方名> 来快速执行。它会自动在当前目录或其父目录中寻找 justfile。
其核心价值在于:
- 封装复杂性:将长命令、环境变量设置等细节隐藏起来。
- 统一入口:为项目开发(启动、测试、构建等)提供清晰、一致的执行界面。
- 便于协作:
justfile 本身可以作为项目文档的一部分,帮助新成员快速上手。
你可以前往其 GitHub 主页 查看详细的语法文档。官方文档非常清晰易懂,因此本文不会赘述语法细节,而是重点分享“命令即代码”的理念以及我在实际项目中的使用案例。
快速安装
在 Linux 系统上,可以通过以下命令安装 just(安装路径 /usr/local/bin 可自定义):
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | sudo bash -s -- --to /usr/local/bin
安装完成后,运行 just --help 验证。

在 Flutter 项目中使用 just build 一键编译并自动打开输出文件夹。
解决了哪些开发痛点?
以一个典型的 Python Django 项目为例。
使用 just 之前:
- 每次启动开发服务器,都需要手动输入或粘贴:
uv run manage.py runserver 0.0.0.0:7456。
- 每次运行测试,都需要输入一长串包含环境变量的命令:
PROJECT_CONFIG_FILE=Navigation/fixtures/test_config.yaml uv run manage.py test Navigation。
使用 just 之后:
- 启动服务器只需:
just run。
- 运行测试只需:
just test Navigation。
just 将命令细节封装后,执行一个操作变得像按按钮一样简单。这不仅减少了键盘输入(Token),为大脑腾出了更多处理代码逻辑的上下文空间,还将“开发”和“操作环境配置”这两个阶段清晰地分离开。以前,我习惯把这类命令写在项目根目录的 dev_cheatsheet.md 文件里,但查找、复制、粘贴的过程本身就有打断感,而且这个文件因为包含临时笔记而不适合用 Git 跟踪,导致这些重要命令处于一种“易丢失”的尴尬状态。
just 完美解决了上述问题:
- 执行自然流畅:想做什么,就打开终端输入
just <命令>,命令名都是自己定义的、有意义的单词(如 run, test),无需记忆。
- 文件可追踪:
justfile 本身是纯文本,完全可以纳入版本控制,成为项目资产。新成员可以通过阅读它来了解项目的构建、测试和运行方式。
真实用例分享
1. Git 工作流封装
我习惯在写代码前,先创建一个符合规范的空白提交。以下 justfile 片段定义了我的常用 Git 操作:
root := justfile_directory()
# 创建一个空 commit ,使用预设的提交信息模板
@new:
cd {{root}} && git commit --allow-empty --edit --file={{root}}/.gitmessage
# 将当前所有更改追加(amend)到上一个提交
@amend:
cd "{{root}}" && git add . && git commit --amend || (git restore --staged . && false)
# 如果上一个提交是空的,则撤销它
@forget:
if git diff --quiet HEAD HEAD~1; then \
git reset --soft HEAD~1 && echo "✅ 空提交已删除"; \
fi
# 统计代码行数(默认排除 test/ 目录和自动生成的 .g.dart 文件)
cloc range="":
cd "{{root}}" && git ls-files -z \
| grep -z -v -E '\.(g|freezed)\.dart$' \
{{ if range != "all" { "| grep -z -v '^test/'" } else { "" } }} \
| xargs -0 cloc
现在,just new 创建提交,just amend 追加更改,just forget 撤销空提交,just cloc 统计代码量,一切井井有条。
2. Django 项目命令集
我的项目采用 monorepo 结构,虚拟环境在仓库根目录。通过 just 可以轻松管理路径和命令:
root := justfile_directory() / "../.."
python_environment := root / ".venv"
python_interpreter := python_environment / "bin/python"
@run:
just echo_url
cd "{{justfile_directory()}}" && {{python_interpreter}} manage.py runserver 0.0.0.0:8535
@echo_url:
echo "网址: http://localhost:8535/"
echo "后台网址: http://localhost:8535/admin/"
@test app="Navigation":
ALLABOUTME_CONFIG_FILE={{app}}/fixtures/test_config.yaml uv run manage.py test {{app}}
@shell:
cd "{{justfile_directory()}}" && {{python_interpreter}} manage.py shell_plus
@migrate:
cd "{{justfile_directory()}}" && {{python_interpreter}} manage.py migrate
这里有个贴心小技巧:just run 里先执行了 just echo_url,这样启动服务器后,终端会直接打印出访问地址,一键点击即可打开浏览器,非常方便。这比手动输入网址要高效得多。
3. Flutter 项目命令集
对于 Flutter 项目,just 的管理价值更大,因为编译命令通常更长、参数更多(如定义 Dart 编译时常量、设置代理等)。
root := justfile_directory()
app_version := `grep '^version:' pubspec.yaml | cut -d ' ' -f2 | cut -d '+' -f1`
app_build := `grep '^version:' pubspec.yaml | cut -d ' ' -f2 | cut -d '+' -f2`
HTTP_PROXY := "http://192.168.2.205:10808"
@run:
flutter run --dart-define-from-file=lib/app/constants/env.json --dart-define=APP_VERSION={{app_version}} --dart-define=APP_BUILD_NUMBER={{app_build}} --dart-define=APP_IS_IN_DEV=true
# 运行测试时自动启动和关闭后端API服务
@test *args: start_api && stop_api
HTTP_PROXY="" HTTPS_PROXY="" \
flutter test --dart-define-from-file=test/config_and_data/env.json "$@" || true
@build:
HTTP_PROXY="{{HTTP_PROXY}}" HTTPS_PROXY="{{HTTP_PROXY}}" just inner_release_build "true"
# 编译成功后,在WSL中自动用Windows资源管理器打开APK所在文件夹
if [ -f "{{app_release_path}}" ]; then \
/mnt/c/Windows/explorer.exe "$(wslpath -w {{build_dir}})" || true; \
else \
echo "APK not found!" >&2; exit 1; \
fi
@get:
HTTP_PROXY="{{HTTP_PROXY}}" HTTPS_PROXY="{{HTTP_PROXY}}" flutter pub get
这个配置解决了几个痛点:
- 版本号注入:自动从
pubspec.yaml 读取版本号,作为常量传入,代码中可直接使用。
- 网络代理:为
pub get 等命令预设代理,解决网络慢的问题。
- 测试自动化:
just test 自动管理后端服务的生命周期。
- 构建后操作:
just build 编译后自动打开输出文件夹,省去手动寻找 APK 的麻烦。
4. 为 AI 助手预设环境
我使用 Claude Code 进行开发辅助,通过 just 可以预设好所有复杂的环境变量,确保 AI 在正确的上下文中运行。
@ai model="glm-5" args="":
HTTP_PROXY="{{HTTP_PROXY}}" HTTPS_PROXY="{{HTTP_PROXY}}" \
ANTHROPIC_BASE_URL="https://coding.dashscope.aliyuncs.com/apps/anthropic" \
ANTHROPIC_AUTH_TOKEN="sk-xxx-your-token-xxx" \
ANTHROPIC_MODEL="{{model}}" \
claude {{args}}
@aicontinue:
just ai "glm-5" --continue
这样,无论是启动新对话 (just ai) 还是继续上一次对话 (just aicontinue),都只需要一个简单的命令。我还会在项目的 CLAUDE.md 文件中明确说明:“请使用 just test 来运行测试”,从而约束 AI 的行为,确保它不会因为环境问题而执行失败。
总结
just 不仅仅是一个命令别名工具,它通过将 开发命令 代码化、版本化,为项目建立了一套可重复、可协作的执行标准。它降低了心智负担,让开发者更专注于代码本身。无论是个人项目还是团队协作,引入 just 来管理你的开发工作流,都是一个投入极小、回报极高的选择。如果你有自己独特的 justfile 配方,也欢迎在云栈社区分享你的实践经验。