简介
在开发和配置过程中,时常会发生记不住需要的命令行代码的情况。 特别是同时开发多个项目,或者使用不同语言的时候。
最简单的方法就是在终端的历史里寻找运行过的代码。
当然还可以通过脚本语言,编写shell
或者Python
等脚本运行。
但这样不仅复杂,还有可能存在跨平台问题。
just
是一个快捷的跨平台命令行运行工具,通过在目录中编写justfile
文件,
可以方便地调用命令。
安装
安装Rust
Linux
用户可以通过命令安装:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Windows
用户可以下载rustup
工具安装:
在官网链接中寻找适合的版本。
安装just
使用cargo
包管理器安装:
cargo install just
编写justfile
推荐直接在项目的根目录编写justfile
。
这样可以把项目所需的所有命令都同步到git
仓库。
运行起来也最方便。
最简单的命令
# 输出Hello World!
hello: echo "Hello World!"
这里在#
之后的注释会在运行just --list
时显示出来。
默认命令
# 默认列举just命令
default:
@just --list
这里的@
表示静默运行,不会输出命令本身。
别名
alias t := test
alias c := check
使用别名可以更方便地运行命令,比如这里的just t
等价于运行just test
。
指定shell
set shell := ["zsh", "-cu"]
set windows-shell := ["pwsh.exe", "-NoLogo", "-Command"]
通过指定shell
,可以实现跨平台运行相同的命令。
跨平台
set windows-shell := ["pwsh.exe", "-NoLogo", "-Command"]
tests_dir := if os_family() == "windows" { "./tests/Release" } else { "./tests/" }
这里的os_family()
是just
的内置函数,可以输出系统类型是unix
或者windows
。
通过if
语句,可以使得test_dir
在不同系统类型中取不同的值。
字符串
string-with-tab := "\t"
string-with-newline := "\n"
escapes := '\t\n\r\"\\'
# 多行字符串,相当于`foo\nbar\n`
x := '''
foo
bar
'''
just
命令
# 运行命令,hello是命令名,param1是参数
$ just hello param1
# 列举命令
$ just --list
$ just --summary
# 显示指定命令的全部信息
just --show test
# 选择需要运行的命令
$ just --choose
# 编译成指定shell脚本
just --completions zsh
GitHub Actions
集成
- uses: extractions/setup-just@v1
with:
just-version: 0.10.5
IDE 集成
带参数的命令
filter PATTERN: echo {{PATTERN}}
# 带默认值的命令
email address='master@example.com': echo {{address}}
# 带表达式的命令
test triple=(arch() + "-unknown-unknown"): ./test {{triple}}
# '+'表示接受1个或者多个参数
backup +FILES: scp {{FILES}} me@example.com
# '*'表示接受0个或者多个参数
commit MESSAGE *FLAGS: git commit {{FLAGS}} -m "{{MESSAGE}}"
带环境变量的命令
# 接受带'$'的环境变量
hello $name: echo $name
命令运行顺序
# 运行顺序 a -> b -> c -> d
b: a && c d
# 执行命令'a'
b:
echo 'B start!'
just a
echo 'B end!'
# 带表达式的依赖
default: (build "main")
build target:
@echo 'Building {{target}}...'
最简单的依赖关系如下:
config: config sth.
build: config
build sth.
test: build
test sth.
这样直接运行just test
的时候就会根据依赖项,按顺序执行config -> build -> test
。
命令注释
# '@':静默运行,'-':忽略退出状态错误
hello:
@ echo "command will not be echoed"
- echo "ignore none-zero exit status and continue"
@hello2:
echo "command will not be echoed"
# 取反命令退出状态
hello3:
# if command succeeds(exit status is 0), exit just
! git branch | grep '* master'
其他语言集成
bash-test:
#!/usr/bin/env bash
set -euxo pipefail
hello='Yo'
echo "$hello from bash!"
可以集成bash
、Python
、Perl
等等脚本语言。
私有命令
test: _test-helper
./bin/test
# 不会在`just --list`中输出
_test-helper: ./bin/super-secret-test-helper-stuff
集成到shell
别名
for recipe in `just -f ~/.justfile --summary`; do
alias $recipe="just -f ~/.justfile -d. $recipe"
done
变量
version := "0.2.7"
tardir := "awesomesauce-" + version
tarball := tardir + ".tar.gz"
test:
echo {{version}}
# 通过`just`命令改变变量值
$ just --set version 1.1.0
设置环境变量
export RUST_BACKTRACE := "1"
test:
cargo test
条件和循环
# 条件语句
fo := if "hi" =~ 'h.+' { "match" } else { "mismatch" }
test:
if true; then echo 'True!'; fi
for file in `ls .`; do echo $file; done
while `server-is-dead`; do ping -c 1 server; done
foo bar:
echo {{ if bar == "bar" { "hello" } else { "bye" } }}
注意
每一行语句都由新的shell
执行。所有在变换目录时,需要把语句写在同一行,或者集成bash
。
change-working-dir: cd bar && pwd
更多内容可以参考GitHub
上的中文文档。