Just:告别 Makefile 的现代命令行任务运行器
本文推荐的一个轻量级命令行工具--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示例:
# 这是一个注释
build:
echo "Building project..."
cargo build
test:
echo "Running tests..."
cargo test
在这个例子中,build和test是两个配方,分别用于构建和测试项目。
基本语法
justfile的语法非常直观,而且和Makefile非常类似。
最简单的例子如下:
# 这是一个注释
hello:
@echo "Hello, Just!"
命令行中运行结果:
$ just
Hello, Just!
变量的使用
变量是我们编写配方时最常用的功能,Just支持多种变量的类型。
变量可以通过:= 进行赋值,并在配方中通过{{变量名}}的方式进行引用。
- 普通变量
version := "1.0.0"
test:
@echo {{version}}
运行结果:
$ just test
1.0.0
- 路径拼接
config_dir := "config"
config_file := config_dir / "settings.toml"
test:
@echo {{config_dir}}
@echo {{config_file}}
运行结果:
$ just test
config
config/settings.toml
- 变量插值
version := "1.0.0"
deploy:
scp build/app-{{version}}.tar.gz server:/apps
执行时,scp命令中的{{version}}会替换成version变量的实际值。
- 命令行覆盖变量
写在justfile中的变量并不是固定的,可以通过命令行来传入不同的值,比如第一个示例中:
version := "1.0.0"
test:
@echo {{version}}
$ just test
1.0.0
$ just version=2.0.0 test
2.0.0
- 环境变量
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 的现代命令行任务运行器的更多相关文章
- 无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它
无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer.Windows服务器管理工具或NET START命令启动它 1. ...
- 在命令行中运行eclipse中创建的java项目
在命令行中运行eclipse中创建的java项目 博客分类: java相关 javaeclipse命令行 由于项目要求,需要对eclipse中的项目进行打包,似的可以在客户机上不装eclipse的情 ...
- 命令行编译运行Java
首先要安装JDK,然后设置环境变量Path,添加C:\Program Files (x86)\Java\jdk1.8.0_66\bin 然后建立一个名为j.java的文件,里面加入如下代码: publ ...
- 命令行下运行php的方法和技巧
linux中直接用"php"命令来执行php文件 一般在linux命令行下运行php文件的代码: XML/HTML代码 linux下执行:#php安装路径 -f php文件路径 例 ...
- SoapUI命令行方式运行
http://stackoverflow.com/questions/9220132/soapui-groovy-script-calls-to-command-line SoapUI支持用命令行方式 ...
- 在命令行终端运行 Elisp 脚本
通常,我们在 Emacs 中运行 Elisp 代码片段,但是也可能需要在命令行终端运行 Elisp 脚本程序.在命令行终端运行 Elisp 脚本需要使用 --script 选项,例如: emacs - ...
- 终端命令行编译运行C#程序HelloWorld
终端命令行编译运行C#程序HelloWorld 今天忽然有人问我,刚学习java程序的时候,一般老师都会建议我们从配置环境变量开始从命令行编译运行程序,那么学习c#的时候基本是直接安装visual s ...
- jmeter命令行模式运行,实时获取压测结果
jmeter命令行模式运行,实时获取压测结果 jmeter很小,很快,使用方便,可以在界面运行,可以命令行运行.简单介绍下命令行运行的方式: sh jmeter.sh -n -t my-script. ...
- 从命令行模式运行Windows管理工具。
从命令行模式运行Windows管理工具. 分类: Play Windows 2004-08-06 16:39 6076人阅读 评论(3) 收藏 举报 1.可以直接在开始-〉运行里面输入的管理工具: 文 ...
- 您可以从 Windows 命令行上运行 gcc、g++、ar、ranlib、dlltool 和其他一些 GNU 工具
Windows 上的安装为了在 Windows 上安装 GCC,您需要安装 MinGW.为了安装 MinGW,请访问 MinGW 的主页 www.mingw.org,进入 MinGW 下载页面,下载最 ...
随机推荐
- vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果
2025 AI实战vue3+deepseek+arcoDesign仿DeepSeek/豆包网页版AI聊天助手. vue3-web-deepseek 实战网页PC版智能AI对话,基于vite6+vue3 ...
- MySQL查询当前连接数的语句
1. 查看当前总连接数 SHOW STATUS LIKE 'Threads_connected'; 返回当前建立的连接总数 2. 查看最大连接数配置 SHOW VARIABLES LIKE 'max_ ...
- CompletableFuture原理及应用场景详解
1.应用场景 现在我们打开各个APP上的一个页面,可能就需要涉及后端几十个服务的API调用,比如某宝.某个外卖APP上,下面是某个外卖APP的首页.首页上的页面展示会关联很多服务的API调用,如果使用 ...
- WPF MessageBox
参考文档 MessageBox MessageBoxButton MessageBoxImage MessageBoxOptions MessageBoxResult
- Web前端入门第 26 问:CSS 浏览器兼容性怎么查?
学编码之前,当先学排查问题的能力. 在那个 IE 浏览器 当道的时代,前端开发简直就是刀耕火种一般,一个简单的圆角模块,嘿...不好意思,它不支持,用图片吧. 但凡经历过 IE 的洗礼,就会知道当时哪 ...
- 1安装docker
1安装docker 1.1主机环境 ssh://192.168.30.30:22 root 123QWEasd 1.2安装依赖 docker依赖于系统的一些必要的工具,可以提前安装. yum ...
- Python3处理文档_word文档实现自动化办公(一)
最近打算写一个自动化出报告的脚本 先从处理word文档开始 Python 操作 Word 最常见的依赖库是:python-docx 所以,在开始操作之前,我们需要在虚拟环境下安装这个依赖库 pip3 ...
- 最小生成树 & 严格次小生成树
最小生成树 何为最小生成树? 有一类问题:给定一张图,可以删除若干条边,在不改变连通性(一般是全联通)的情况下,权值和最小的方案是什么?没错,这就是最小生成树问题(MST问题).那么基本性质其实连聪明 ...
- SpringBoot整合Web层技术
目录 1 SpringBoot整合Web层技术 1.1 SpringBoot整合Servlet 1.1.1 方式一 通过注解扫描完成Servlet组件的注册 1.1.1.1 创建Servlet 1.1 ...
- .NET 原生驾驭 AI 新基建实战系列(六):Pinecone ── 托管向量数据库的向量数据库的云原生先锋
引言 随着人工智能和机器学习技术的快速发展,向量数据在许多应用场景中变得越来越重要.从推荐系统到自然语言处理,再到图像搜索,向量搜索技术成为实现高效.精准匹配的核心.Pinecone 作为一个托管的向 ...