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

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

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

Just简介

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

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

主要包括:

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

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

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

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

主要组成部分

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

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

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

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

# 这是一个注释
build:
echo "Building project..."
cargo build test:
echo "Running tests..."
cargo test

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

基本语法

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

最简单的例子如下:

# 这是一个注释
hello:
@echo "Hello, Just!"

命令行中运行结果:

$  just
Hello, Just!

变量的使用

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

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

  1. 普通变量
version := "1.0.0"

test:
@echo {{version}}

运行结果:

$  just test
1.0.0
  1. 路径拼接
config_dir := "config"
config_file := config_dir / "settings.toml" test:
@echo {{config_dir}}
@echo {{config_file}}

运行结果:

$  just test
config
config/settings.toml
  1. 变量插值
version := "1.0.0"

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

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

  1. 命令行覆盖变量

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

version := "1.0.0"

test:
@echo {{version}}
$  just test
1.0.0 $ just version=2.0.0 test
2.0.0
  1. 环境变量
path := env_var('PATH')

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

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

条件判断

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

build_type := if os() == "windows" { "exe" } else { "bin" }

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

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

$  just build
可执行文件的后缀: exe

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

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中,可以通过反引号来执行系统命令,比如:

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来试试!

Just:告别 Makefile 的现代命令行任务运行器的更多相关文章

  1. 无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它

    无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer.Windows服务器管理工具或NET START命令启动它 1. ...

  2. 在命令行中运行eclipse中创建的java项目

    在命令行中运行eclipse中创建的java项目 博客分类: java相关 javaeclipse命令行  由于项目要求,需要对eclipse中的项目进行打包,似的可以在客户机上不装eclipse的情 ...

  3. 命令行编译运行Java

    首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...

  4. 命令行下运行php的方法和技巧

    linux中直接用"php"命令来执行php文件 一般在linux命令行下运行php文件的代码: XML/HTML代码 linux下执行:#php安装路径 -f php文件路径 例 ...

  5. SoapUI命令行方式运行

    http://stackoverflow.com/questions/9220132/soapui-groovy-script-calls-to-command-line SoapUI支持用命令行方式 ...

  6. 在命令行终端运行 Elisp 脚本

    通常,我们在 Emacs 中运行 Elisp 代码片段,但是也可能需要在命令行终端运行 Elisp 脚本程序.在命令行终端运行 Elisp 脚本需要使用 --script 选项,例如: emacs - ...

  7. 终端命令行编译运行C#程序HelloWorld

    终端命令行编译运行C#程序HelloWorld 今天忽然有人问我,刚学习java程序的时候,一般老师都会建议我们从配置环境变量开始从命令行编译运行程序,那么学习c#的时候基本是直接安装visual s ...

  8. jmeter命令行模式运行,实时获取压测结果

    jmeter命令行模式运行,实时获取压测结果 jmeter很小,很快,使用方便,可以在界面运行,可以命令行运行.简单介绍下命令行运行的方式: sh jmeter.sh -n -t my-script. ...

  9. 从命令行模式运行Windows管理工具。

    从命令行模式运行Windows管理工具. 分类: Play Windows 2004-08-06 16:39 6076人阅读 评论(3) 收藏 举报 1.可以直接在开始-〉运行里面输入的管理工具: 文 ...

  10. 您可以从 Windows 命令行上运行 gcc、g++、ar、ranlib、dlltool 和其他一些 GNU 工具

    Windows 上的安装为了在 Windows 上安装 GCC,您需要安装 MinGW.为了安装 MinGW,请访问 MinGW 的主页 www.mingw.org,进入 MinGW 下载页面,下载最 ...

随机推荐

  1. go 组合函数 Collection

    我们经常需要程序在数据集上执行操作,比如选择满足给定条件的所有项,或者将所有的项通过一个自定义函数映射到一个新的集合上. 在某些语言中,会习惯使用泛型. Go 不支持泛型,在 Go 中,当你的程序或者 ...

  2. Wireshark 的过滤器类型

    Wireshark 是一个强大的网络协议分析工具,支持多种类型的过滤器来帮助用户捕获和分析网络流量. 根据使用场景和功能,Wireshark 的过滤器可以分为以下两类: 1. 捕获过滤器(Captur ...

  3. Joker 全栈低代码智能开发平台:开启高效开发新时代

    低代码开发技术凭借其独特优势,正逐渐成为软件开发领域的关键力量.Gartner 预测,到 2025 年,全球 70% 的新应用将采用低代码 / 无代码技术.Forrester 报告显示,中国低代码市场 ...

  4. BUUCTF---RSA5(低加密指数广播攻击)

    题目 知识 加密指数e非常小 一份明文使用不同的模数n,相同的加密指数e进行多次加密 可以拿到每一份加密后的密文和对应的模数n.加密指数e 解密 由于模数n只能分解为p和q,所以当n很多时,p或q有相 ...

  5. Nginx 301永久性转移

    我有个域名www.taadis.com, 想永久性转移到taadis.com. 前言 看到很多网友的做法是把taadis.com & www.taadis.com等多个域名放到一个server ...

  6. 面试官:如果某个业务量突然提升100倍QPS你会怎么做?

    "假设你负责的系统,某个业务线的QPS突然暴增100倍,你会怎么应对?" --这是上周朋友去面试,被问到一道题,他答了"加机器扩容",结果面试官眉头一皱:&qu ...

  7. RocketMQ的Producer是如何发送消息的

    RocketMQ 的 Producer 发送消息过程涉及多个步骤,包括初始化.消息创建.发送方式选择 1.Producer初始化 首先,我们需要创建并初始化一个Producer示例 这段代码完成了以下 ...

  8. 💻开源项目介绍-NewsNow-优雅的实时新闻聚合平台

    news.zktww.vip 引言 在信息洪流中,如何优雅地获取新闻? 在当今信息爆炸的时代,我们每天需要在微博.知乎.Twitter.GitHub等平台间频繁切换,才能捕捉到最新的热点动态. New ...

  9. 为什么 MySQL 选择使用 B+ 树作为索引结构?

    为什么 MySQL 选择使用 B+ 树作为索引结构? MySQL 选择 B+ 树作为其索引结构的主要原因是它具有以下几个优势,这些优势使得 B+ 树非常适合用于数据库系统中的索引实现. 1. 高效的范 ...

  10. kettle介绍-Step之Return steps metrics

    Return steps metrics转换步骤信息统计介绍 转换步骤信息统计步骤可以用于统计当前转换中的其它步骤信息,包括步骤执行后的输入行数.输入行数.读入行数.更新行数等.此步骤可以直接拖入转换 ...