简介

在开发和配置过程中,时常会发生记不住需要的命令行代码的情况。 特别是同时开发多个项目,或者使用不同语言的时候。

最简单的方法就是在终端的历史里寻找运行过的代码。 当然还可以通过脚本语言,编写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 --comp­letions 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!"

可以集成bashPythonPerl等等脚本语言。

私有命令

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上的中文文档

参考