找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5301

积分

1

好友

727

主题
发表于 1 小时前 | 查看: 4| 回复: 0

你是否厌倦了在终端里反复输入一长串复杂的命令?或者在多个项目中,总是记不清启动服务、运行测试的具体参数?试试 just 吧。这是一个受经典工具 make 启发,但专注于简化日常开发命令管理的利器。它让你能把繁琐的终端指令封装成简洁的“配方”,真正做到“命令即代码”,从而显著提升开发体验和效率。

什么是 just?

just 是一个命令运行器,你只需在项目根目录创建一个名为 justfile 的文本文件,在里面定义好各种命令(它称之为 recipe),之后就可以通过 just <配方名> 来快速执行。它会自动在当前目录或其父目录中寻找 justfile

其核心价值在于:

  1. 封装复杂性:将长命令、环境变量设置等细节隐藏起来。
  2. 统一入口:为项目开发(启动、测试、构建等)提供清晰、一致的执行界面。
  3. 便于协作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 命令的输出截图
在 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 完美解决了上述问题:

  1. 执行自然流畅:想做什么,就打开终端输入 just <命令>,命令名都是自己定义的、有意义的单词(如 run, test),无需记忆。
  2. 文件可追踪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 配方,也欢迎在云栈社区分享你的实践经验。




上一篇:Python实战:掌握time与pathlib模块,高效处理时间与文件路径
下一篇:算法题“隔离病毒”的解题思路:基于BFS/DFS的模拟与连通块分析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-13 07:40 , Processed in 0.756452 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表