Just:告别 Makefile 的现代命令行任务运行器

本文推荐的一个轻量级命令行工具--Just,它提供了一种简单高效的方式来管理项目任务,类似于传统的 Make 工具,但具有更简洁的语法和更现代化的功能。

我目前在一些小项目中开始使用它来管理一些日常的任务,非常方便,它是基于Rust开发的工具,

所以它在Windows系统中使用也非常方便。

Just简介

Just是一个简单而强大的命令运行器,它允许你将项目中常用的命令保存在一个名为justfile的文件中。

与传统的Make工具类似, 但是Just提供了更简洁的语法和更灵活的功能。

主要包括:

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

如果你平时也用Makefile来管理项目,那么上手Just会非常快。

Just支持多种操作系统,包括 LinuxMacOSWindows,并且无需额外依赖,它的目标是让命令管理变得简单、直观且易于维护。

它常用命令组织在名为justfile的文件中,通过简洁的语法定义任务(称为"配方"),然后通过 just 命令运行这些任务。

主要组成部分

justfileJust的核心,它包含了所有可运行的命令(也称为配方)。

一个典型的justfile包括以下几个部分:

  • 配方定义:每个配方定义了一个可执行的命令序列。
  • 变量定义:用于存储和复用的值。
  • 设置 :用于控制Just行为的配置选项。
  • 注释:用于解释配方或变量的作用。

以下是一个简单的justfile示例:

makefile 复制代码
# 这是一个注释
build:
  echo "Building project..."
  cargo build

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

在这个例子中,buildtest是两个配方,分别用于构建和测试项目。

基本语法

justfile的语法非常直观,而且和Makefile非常类似。

最简单的例子如下:

makefile 复制代码
# 这是一个注释
hello:
    @echo "Hello, Just!"

命令行中运行结果:

powershell 复制代码
$  just
Hello, Just!

变量的使用

变量 是我们编写配方 时最常用的功能,Just支持多种变量的类型。

变量 可以通过:= 进行赋值,并在配方中通过{{变量名}}的方式进行引用。

  1. 普通变量
makefile 复制代码
version := "1.0.0"

test:
    @echo {{version}}

运行结果:

powershell 复制代码
$  just test
1.0.0
  1. 路径拼接
makefile 复制代码
config_dir := "config"
config_file := config_dir / "settings.toml"

test:
    @echo {{config_dir}}
    @echo {{config_file}}

运行结果:

powershell 复制代码
$  just test
config
config/settings.toml
  1. 变量插值
powershell 复制代码
version := "1.0.0"

deploy:
  scp build/app-{{version}}.tar.gz server:/apps

执行时,scp命令中的{{version}}会替换成version变量的实际值。

  1. 命令行覆盖变量

写在justfile中的变量并不是固定的,可以通过命令行来传入不同的值,比如第一个示例中:

makefile 复制代码
version := "1.0.0"

test:
    @echo {{version}}
powershell 复制代码
$  just test
1.0.0

$  just version=2.0.0 test
2.0.0
  1. 环境变量
makefile 复制代码
path := env_var('PATH')

# 访问环境变量
show_path:
    echo "PATH Var: {{path}}"

通过内置的env_var函数可以访问环境变量。

条件判断

条件判断可以让我们编写配方时更加灵活,比如针对不同的平台编译不同的二进制。

makefile 复制代码
build_type := if os() == "windows" { "exe" } else { "bin" }

build:
    @echo "可执行文件的后缀: {{build_type}}"

我是windows系统,执行结果如下:

powershell 复制代码
$  just build
可执行文件的后缀: exe

如果条件分支比较多,可以使用else if,比如:

makefile 复制代码
arch := if arch() == "x86_64" {
    "amd64"
} else if arch() == "aarch64" {
    "arm64"
} else {
    error("Unsupported architecture")
}

内置函数

Just中内置了很多函数,方便我们在编写任务时,获取一些必要的信息。

比如上面示例中使用的os()arch(),都是内置函数。

函数 描述 备注
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_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) 首字母大写其余小写 "hello"->"Hello"
kebabcase(s) 转换为 kebab-case "fooBar"->"foo-bar"
lowercamelcase(s) 转换为 lowerCamelCase "Foo_bar"->"fooBar"
lowercase(s) 转换为全小写 "HeLLo"->"hello"
shoutykebabcase(s) 转换为 SHOUTY-KEBAB-CASE "fooBar"->"FOO-BAR"
shoutysnakecase(s) 转换为 SHOUTY_SNAKE_CASE "fooBar"->"FOO_BAR"
snakecase(s) 转换为 snake_case "fooBar"->"foo_bar"
titlecase(s) 转换为 Title Case "hello world"->"Hello World"
uppercamelcase(s) 转换为 UpperCamelCase "foo_bar"->"FooBar"
uppercase(s) 转换为全大写 "hello"->"HELLO"
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

执行系统命令

justfile中,可以通过反引号来执行系统命令,比如:

makefile 复制代码
current_branch := `git branch --show-current`

deploy:
  echo "Deploying branch {{current_branch}}"

与Makefile的比较

最后,整理了justfile与传统的Makefile相比,在特性方面的不同和改进,供参考:

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

Just的优势主要体现在:

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

如果你的项目也有Makefile的需求,不妨试试用justfile来试试!

相关推荐
深栈解码1 分钟前
OpenIM 源码深度解析系列(四):在线状态相关存储结构
后端
前端付豪3 分钟前
微信视频号推荐系统揭秘:兴趣建模、多模态分析与亿级流控架构实战
前端·后端·算法
bcbnb5 分钟前
跨平台接口一致性调试实录:如何用Sniffmaster等多款抓包工具拆解一个偶发Bug
后端
深栈解码5 分钟前
OpenIM 源码深度解析系列(五):分布式在线状态管理的完整实现
后端
brzhang1 小时前
我写了个脚本,让AI每天自动看完热榜、写稿、配乐,还用我的声音读出来
前端·后端·架构
bobz9651 小时前
vscode 使用 trunk code
后端
天天摸鱼的java工程师2 小时前
你如何处理一个高并发接口的线程安全问题?说说你做过的优化措施
java·后端
JohnYan2 小时前
Bun技术评估 - 11 Websocket
javascript·后端·bun
HEY_FLYINGPIG2 小时前
【FLASK】FLASK应用中的多用户并行登录与加密
后端·python·flask
fydw_7152 小时前
Flask-login 处理授权逻辑
后端·python·flask