找回密码
 立即注册
首页 业界区 业界 Just:告别 Makefile 的现代命令行任务运行器 ...

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

恿深疏 2025-9-25 10:43:51
本文推荐的一个轻量级命令行工具--Just,它提供了一种简单高效的方式来管理项目任务,类似于传统的 Make 工具,但具有更简洁的语法和更现代化的功能。
我目前在一些小项目中开始使用它来管理一些日常的任务,非常方便,它是基于Rust开发的工具,
所以它在Windows系统中使用也非常方便。
Just简介

Just是一个简单而强大的命令运行器,它允许你将项目中常用的命令保存在一个名为justfile的文件中。
与传统的Make工具类似, 但是Just提供了更简洁的语法和更灵活的功能。
主要包括:

  • 跨平台支持(Linux、macOS、Windows)
  • 错误信息清晰具体
  • 支持命令行参数和环境变量
  • 自动补全功能
  • 无需声明.PHONY目标
  • 可从项目任意子目录调用
如果你平时也用Makefile来管理项目,那么上手Just会非常快。
Just支持多种操作系统,包括 Linux、MacOS 和 Windows,并且无需额外依赖,它的目标是让命令管理变得简单、直观且易于维护。
它常用命令组织在名为justfile的文件中,通过简洁的语法定义任务(称为"配方"),然后通过 just 命令运行这些任务。
主要组成部分

justfile是Just的核心,它包含了所有可运行的命令(也称为配方)。
一个典型的justfile包括以下几个部分:

  • 配方定义:每个配方定义了一个可执行的命令序列。
  • 变量定义:用于存储和复用的值。
  • 设置:用于控制Just行为的配置选项。
  • 注释:用于解释配方或变量的作用。
以下是一个简单的justfile示例:
  1. # 这是一个注释
  2. build:
  3.   echo "Building project..."
  4.   cargo build
  5. test:
  6.   echo "Running tests..."
  7.   cargo test
复制代码
在这个例子中,build和test是两个配方,分别用于构建和测试项目。
基本语法

justfile的语法非常直观,而且和Makefile非常类似。
最简单的例子如下:
  1. # 这是一个注释
  2. hello:
  3.     @echo "Hello, Just!"
复制代码
命令行中运行结果:
  1. $  just
  2. Hello, Just!
复制代码
变量的使用

变量是我们编写配方时最常用的功能,Just支持多种变量的类型。
变量可以通过:= 进行赋值,并在配方中通过{{变量名}}的方式进行引用。

  • 普通变量
  1. version := "1.0.0"
  2. test:
  3.     @echo {{version}}
复制代码
运行结果:
  1. $  just test
  2. 1.0.0
复制代码

  • 路径拼接
  1. config_dir := "config"
  2. config_file := config_dir / "settings.toml"
  3. test:
  4.     @echo {{config_dir}}
  5.     @echo {{config_file}}
复制代码
运行结果:
  1. $  just test
  2. config
  3. config/settings.toml
复制代码

  • 变量插值
  1. version := "1.0.0"
  2. deploy:
  3.   scp build/app-{{version}}.tar.gz server:/apps
复制代码
执行时,scp命令中的{{version}}会替换成version变量的实际值。

  • 命令行覆盖变量
写在justfile中的变量并不是固定的,可以通过命令行来传入不同的值,比如第一个示例中:
  1. version := "1.0.0"
  2. test:
  3.     @echo {{version}}
复制代码
  1. $  just test
  2. 1.0.0$  just version=2.0.0 test2.0.0
复制代码

  • 环境变量
  1. path := env_var('PATH')
  2. # 访问环境变量
  3. show_path:
  4.     echo "PATH Var: {{path}}"
复制代码
通过内置的env_var函数可以访问环境变量。
条件判断

条件判断可以让我们编写配方时更加灵活,比如针对不同的平台编译不同的二进制。
  1. build_type := if os() == "windows" { "exe" } else { "bin" }
  2. build:
  3.     @echo "可执行文件的后缀: {{build_type}}"
复制代码
我是windows系统,执行结果如下:
  1. $  just build
  2. 可执行文件的后缀: exe
复制代码
如果条件分支比较多,可以使用else if,比如:
  1. arch := if arch() == "x86_64" {
  2.     "amd64"
  3. } else if arch() == "aarch64" {
  4.     "arm64"
  5. } else {
  6.     error("Unsupported architecture")
  7. }
复制代码
内置函数

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 的环境变量如果不存在则返回 defaultinvocation_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中,可以通过反引号来执行系统命令,比如:
  1. current_branch := `git branch --show-current`
  2. deploy:
  3.   echo "Deploying branch {{current_branch}}"
复制代码
与Makefile的比较

最后,整理了justfile与传统的Makefile相比,在特性方面的不同和改进,供参考:
特性JustMake语法简洁直观较为复杂跨平台原生支持需要兼容层错误处理清晰详细有时晦涩变量作用域统一简单多种类型自动补全完善支持有限.PHONY 声明不需要需要环境变量内置支持需要额外处理现代功能条件、函数等有限Just的优势主要体现在:

  • 避免 Make 的"up to date"问题
  • 更友好的错误信息
  • 内置函数和环境变量支持
  • 更简洁的变量系统
  • 无需声明伪目标
如果你的项目也有Makefile的需求,不妨试试用justfile来试试!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
3 天前

举报

很好很强大  我过来先占个楼 待编辑
您需要登录后才可以回帖 登录 | 立即注册