Just及Justfile:简介、实战

概述

官网,Rust实现、开源(GitHub,36K Star,851 Fork)跨平台、轻量级命令行工具;类似于传统Make工具,提供一种简单高效的方式来管理项目任务,不是构建系统。中文文档。

Make是给C项目做增量编译用的,其核心逻辑是比对文件时间戳,决定哪些东西需要重新构建。但绝大多数团队用于跑测试、部署、清理、启动开发服务器。每次都得写.PHONY声明。

特性:

  • 错误信息清晰具体
  • 支持命令行参数和环境变量
  • 自动补全功能
  • 无需声明.PHONY目标
  • 可从项目任意子目录调用,不用切到根目录

优势

  • 避免Make的"up to date"问题
  • 更友好的错误信息
  • 内置函数和环境变量支持
  • 更简洁的变量系统
  • 无需声明伪目标

函数

内置函数

函数 描述
arch() 指令集结构
os() 操作系统
os_family() 操作系统系列
env_var(key) 获取名称为key的环境变量,如果不存在则终止
env_var_or_default(key, default) 获取名称为key的环境变量,如果不存在则返回default
invocation_directory() 获取just被调用时当前目录所对应的绝对路径
justfile() 取得当前justfile的路径
justfile_directory() 取得当前justfile文件父目录的路径
just_executable() just可执行文件的绝对路径
quote(s) 用单引号包裹字符串并转义内部单引号
replace(s, from, to) 替换字符串中的所有匹配项
replace_regex(s, regex, repl) 使用正则表达式替换字符串
trim(s) 移除首尾空白字符
trim_end(s) 移除尾部空白字符
trim_end_match(s, substr) 移除匹配的后缀
trim_end_matches(s, substr) 重复移除匹配的后缀
trim_start(s) 移除首部空白字符
trim_start_match(s, substr) 移除匹配的前缀
trim_start_matches(s, substr) 重复移除匹配的前缀
capitalize(s) 首字母大写其余小写
kebabcase(s) 转换为kebab-case
lowercamelcase(s) 转换为lowerCamelCase
lowercase(s) 转换为全小写
shoutykebabcase(s) 转换为SHOUTY-KEBAB-CASE
shoutysnakecase(s) 转换为SHOUTY_SNAKE_CASE
snakecase(s) 转换为snake_case
titlecase(s) 转换为Title Case
uppercamelcase(s) 转换为UpperCamelCase
uppercase(s) 转换为全大写
absolute_path(path) 将相对路径转为绝对路径
extension(path) 获取文件扩展名
file_name(path) 获取文件名(含扩展名)
file_stem(path) 获取文件名(不含扩展名)
parent_directory(path) 获取父目录路径
without_extension(path) 获取不含扩展名的路径
clean(path) 简化路径(移除冗余部分)
join(a, b...) 拼接路径(自动处理分隔符)
path_exists(path) 检查路径是否存在
error(message) 终止执行并显示错误消息
sha256(string) 计算字符串的SHA-256哈希值(十六进制)
sha256_file(path) 计算文件的SHA-256哈希值(十六进制)
uuid() 生成随机UUID

解读:

  • arch()输出:aarch64、arm、asmjs、hexagon、mips、msp430、powerpc、powerpc64、s390x、sparc、wasm32、x86、x86_64、xcore
  • os()输出:android、bitrig、dragonfly、emscripten、freebsd、haiku、ios、linux、macos、netbsd、openbsd、solaris、和windows
  • os_family()输出:unix、windows

语法

或叫功能,包括:

  • 变量:通过:=进行赋值,并在配方中通过{``{变量名}}方式进行引用;可在命令行传参覆盖

  • @前缀:不显示命令本身,只显示输出

  • 加载.env文件:在justfile顶部加上:set dotenv-load

  • 依赖机制:在配方名后面列出依赖的配方就行。

    install:
    npm ci
    build: install
    npm run build
    test: build
    npm test

运行 just test时,Just 会先跑 install,再跑 build,最后跑 test。依赖关系清晰,执行顺序自动解析。可用 --no-deps 跳过依赖。

  • 支持配方带参数:

    deploy target:
    ./scripts/deploy.sh {{target}}

    参数设置默认值

    build mode="release":
    cargo build --{{mode}}

执行命令

bash 复制代码
just deploy staging
just deploy production
  • 支持Shebang配方:
bash 复制代码
count-files:
	#!/usr/bin/env python3
	import os
	print(len(os.listdir(".")))

Just会把配方内容存成临时文件然后用Shebang指定的解释器去跑。

  • 可通过反引号来执行系统命令
  • 条件判断:
bash 复制代码
build_type := if os() == "windows" { "exe" } else { "bin" }

arch := if arch() == "x86_64" {
	"amd64"
} else if arch() == "aarch64" {
	"arm64"
} else {
	error("Unsupported architecture")
}
# 反引号
current_branch := `git branch --show-current`

Justfile

语法受make启发

特性 Just Make
语法 简洁直观 较为复杂
跨平台 原生支持 需要兼容层
错误处理 清晰详细 有时晦涩
变量作用域 统一简单 多种类型
自动补全 完善支持 有限
.PHONY声明 不需要 需要
环境变量 内置支持 需要额外处理
现代功能 条件、函数等 有限

实战

安装:

bash 复制代码
brew install just
winget install --id Casey.Just
cargo install just

示例:

bash 复制代码
# 注释
build:
	echo "Building project..."
	cargo build

test:
	echo "Running tests..."
	cargo test

命令行使用示例:

bash 复制代码
# 列出所有配方,以_开头的配方会被隐藏
just --list
just --list --unsorted
just --summary
# 查看某个配方的具体内容
just --show <recipe>
# 用交互式选择器选配方
just --choose

用于Java项目:

bash 复制代码
# 构建应用
build:
	./mvnw clean package
# 构建 Docker 镜像(依赖 build,会先执行 build)
docker: build
	docker build -t my-app:latest .
docker push my-app:latest
# 本地运行(依赖 build)
run: build
	./mvnw spring-boot:run -Dspring-boot.run.profiles=local

用于Node.js项目:

bash 复制代码
install:
	npm ci
build: install
	npm run build
test: build
	npm test

生态

  • vim-just:插件可为vim提供justfile语法高亮显示
  • just-mode:可为justfile提供语法高亮和自动缩进
相关推荐
Tairitsu_H11 天前
[Linux系统] 自动化构建make / Makefile | 进度条
linux·操作系统·makefile·make
djjjx.19 天前
Linux工具篇 (三):make与Makefile
linux·服务器·makefile·make
琥珀色糖2 个月前
Linux makefile
linux·运维·服务器·makefile·make
sulikey4 个月前
个人Linux操作系统学习笔记4 - makefile
linux·makefile·make·构建
量子炒饭大师4 个月前
【Linux系统编程】——【自动化构建-make/Makefile】拒绝手动编译!构建你的赛博代码加工厂,重塑逻辑矩阵效率极限
linux·运维·自动化·makefile·make·自动化构建
yuanyuan2o25 个月前
从最小项目开始的 CMake 教程
c语言·开发语言·arm开发·c++·makefile·make·cmake
GDAL6 个月前
Go Channel `make()` 深入全面讲解
golang·make·通道
dingdingfish7 个月前
Bash学习 - 第10章:Installing Bash
bash·make·shell·install·configure·5.3
dingdingfish8 个月前
如何升级Bash
bash·make·install·upgrade·configure·5.3