多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

justfile 从入门到团队协作:8 个场景让构建命令不再靠记忆

justfile 从入门到团队协作:8 个场景让构建命令不再靠记忆 justfile 从入门到团队协作8 个场景让构建命令不再靠记忆【免费下载链接】just Just a command runner项目地址: https://gitcode.com/GitHub_Trending/ju/just新人入职第三天第三次问同一个问题构建命令到底敲什么我让他敲just --list屏幕上立刻列出一列带注释的任务名。从那以后我们团队的入口文档只剩一份 justfile——命令不再靠记忆写在项目里。just 在工具链里的位置不少团队是冲着 just 替代 Makefile 来的但把它理解成 Makefile 的平替反而容易用错地方。先看它和几个老朋友的分工边界重点不是功能罗列而是各自解决什么问题工具解决什么问题典型痛点Makefile目标依赖与编译追踪工业级构建语法老、变量语义绕新人上手成本高Shell 脚本把一串命令粘起来跑没有任务列表新人得读脚本才知道能干什么npm scriptsJS 生态开箱即用跨平台要写两遍复杂逻辑变成脚本套脚本Taskfile用 YAML 定义结构化任务配置层又挪一次缩进坑再来一遍just项目常用命令的自解释入口生态比 make 年轻大型构建仍要交给专业工具一句话just 不抢构建系统的活它管的是命令的入口和记忆。左边是 justfile 本体右边是just -l的输出——任务名和用途一屏看完这就是它作为操作食谱的形态。分工看明白了接下来动手目标就是五分钟。5 分钟跑通第一个 justfile装好 just 之后各平台包管理器都有在项目根目录新建 justfile注意没有扩展名写入下面这份最小文件最小可运行的 justfile三个任务覆盖常见形态。# 整个项目的入口变量在上任务在下 APP : demo build: cc -o {{APP}} main.c test: build ./{{APP}} --selftest # 默认值参数不带参数时跑 3000带参数时覆盖 serve port3000: python3 -m http.server {{port}}调用方式就四种记住它们基本够用just不带参数跑默认任务第一个或显式声明的 defaultjust build跑指定任务just serve 8080参数直接跟在任务名后面覆盖默认值just --list列出所有任务这就是新人的第一入口。改一行试试把serve的默认端口3000改成你项目的端口再跑一次just serve。改完立刻见效不需要任何编译或注册步骤——这种所见即所得是 justfile 和一堆写死脚本最直观的区别。文件能跑了但别急着往里堆命令。先把三个核心概念分清后面写什么、不写什么就有判断标准了。三个核心概念一次讲透把刚跑通的文件拆开看核心其实就三样变量、食谱、参数。变量加载时求值一次变量在文件加载时求值一次之后所有任务里引用的都是结果不会重复执行。变量定义命令输出、路径拼接、按环境分叉。# 反引号里的命令在加载时执行一次之后引用的是结果 GIT_HASH : git rev-parse --short HEAD # / 是路径拼接操作符不用手写斜杠 LOG_DIR : var / log # 变量里也能套 if值按环境分叉 BIN : if os_family() windows { app.exe } else { app }判断标准值会被多处复用时才抽变量只在一条命令里出现的常量留行内注释就够了。食谱just 的最小执行单元食谱是执行的最小单元一行名字加冒号缩进下面是命令冒号后面还能挂依赖。依赖、静默前缀与容错前缀的用法。# 冒号后是依赖先跑 test再执行本食谱 build: test cc -o app main.c clean: rm -rf dist # 前缀不回显命令本身 -echo ok # - 前缀这一步失败也不中断判断标准一个名字对应一段可以安全重跑的操作就值得定义为食谱一次性的调试命令别放进来它会污染任务列表。参数让任务接受输入参数让同一个食谱服务不同输入默认值照顾最常见的情况*变长参数兜底其余的。默认值参数与变长参数。# 默认值写在参数名后不带参数时用最常用的值 greet nameworld: echo hello {{name}} # * 开头的变长参数把多余位置参数整体收下 run *args: python3 main.py {{args}}判断标准调用方经常变的值做成参数团队里所有人传法一样的写死比参数更诚实。概念讲完马上会撞上下一个绕不开的问题——环境差异。上周一个 Windows 同事把我们的任务跑挂了.venv/bin/pip在他机器上根本不存在。让任务活起来条件、循环与跨平台修掉这类问题的思路不是写两套文件而是在表达式里做分叉钉死 shell、按操作系统分叉解释器路径。# Windows 同事跑不起来多半是默认 shell 不同显式钉死 set shell : [bash, -eo, pipefail] set windows-shell : [powershell.exe, -NoProfile, -Command] # 路径按操作系统分叉一次写全 VENV : if os_family() windows { .venv/Scripts } else { .venv/bin } install-deps: {{VENV}}/pip install -r requirements.txt两个容易忽略的点一是if/else分支是惰性求值的没走到的那一支连副作用都不会发生可以放心把另一台机器的命令写在里面二是os()返回具体系统名os_family()返回 windows/unix 这样的粗粒度家族跨平台判断用后者更稳。至于循环我们的做法是老实交给 shelljust 负责在走哪条路上做决策重复的事让一行for解决不硬造语法。跨平台解决的是个人协作的坑文件一大就是团队协作的坑了。团队里真正用起来模块化与 .env 集成一个人的任务一个文件塞得下团队的不行。下面这套组合是我们 justfile 实战里踩坑最少的一套。声明模块、启用 .env 加载、给高频命令起别名。# 按领域拆分模块mod 声明后just deploy run 就能调到 mod deploy mod test # 自动读取当前目录 .env密钥不写死在文件里 set dotenv-load # 高频命令起别名just d 等价于完整路径 alias d : deploy::run模块里可以照样写依赖、参数和mod调用时用just 模块 任务或者路径语法just deploy::run。配置分两层全团队一致的值写在根文件里机器相关的数据库地址、token放.env并加进.gitignore正文里用{{env_var(S3_BUCKET)}}取值。大型项目拆完大致长这样my-project/ ├── justfile # 入口模块声明 全局设置 ├── deploy.just # 发布staging / production ├── test.just # 测试单元 / 集成 ├── ci.just # 流水线专用任务 └── .env # 本地环境变量不入库仓库里的 examples/ 目录还有现成的模板其中跨平台 Python 项目那篇值得对着抄。任务拆好了总会有跑挂的时候得留后手。排障三板斧just 命令运行器用法里最值钱的其实是三个开关 各配一段典型输出--list把任务名和注释打成列表新人不用翻文件就知道有什么--dry-run预演不执行看错命令比跑错命令便宜--verbose输出更多执行细节定位从哪一步开始不对。三个开关的典型输出。$ just --list Available recipes: build # 编译主程序 test # 跑全部测试 $ just --dry-run build # 只打印将要执行的命令 cc -o app main.c $ just --verbose test # 附带动词时打印更多执行细节 ./app --selftest延伸资源官方手册book/ —— 语法权威出处示例合集examples/ —— 照着抄的模板解析器源码src/parser.rs —— 想深挖语法边界把你 shell 历史里敲过三次以上的命令贴进来就行——下一个入职的人不用再问第三次。【免费下载链接】just Just a command runner项目地址: https://gitcode.com/GitHub_Trending/ju/just创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表