Skip to main content

just

  • casey/just
    • CC0-1.0, Rust
    • command runner, 不是 构建工具
      • 不需要 make 的 .PHONY
      • 不需要 文件依赖管理
    • 能接收 命令行参数
    • 会加载 .env
    • 支持自定义语言的 任务运行
    • 能够从子目录执行
  • 参考
brew install just # macOS brew
apk add just # AlpineLinux

just --list
just --list PATH # PATH 支持 :: 分割多个
just --summary # 空格分割的所有 target

just os=bsd # 修改变量
just --set os bsd

just --choose # 选择 target - 依赖 fzf
# 调用其他目录
(cd foo && just build)
just foo/build
just foo/

just bar::b # 搜索 foo.just, foo/mod.just, foo/justfile, foo/.justfile

just --fmt --check --unstable
just --dump # --dump-format json
just --timestamp recipe --timestamp-format '%H:%M:%S%.3f %Z' # strftime

justfile

  • justfile, .justfile
  • global - just --global-justfile, just -g
    • $XDG_CONFIG_HOME/just/justfile
    • $HOME/.config/just/justfile
    • $HOME/justfile
    • $HOME/.justfile
optfor
quite静默模式
fallback如果 recipe 不存在,尝试向上找 justfile
mod bar # 定义模块名字 - 作为子命令运行 just bar b
mod foo 'PATH' # 从给定的 path 加载模块 mod.just, justfile, .justfile
mod? foo

# 引入其他 justfile
import 'foo/bar.just'
import? 'foo/bar.just'

# for Node.js
export PATH := "./node_modules/.bin:" + env_var('PATH')

# 启用 unstable 特性
# JUST_UNSTABLE
# 例如 [script(COMMAND)]
set unstable

# 修改默认工作目录
set working-directory := 'bar'

alias b := build # 设置别名

set shell := ["bash", "-uc"]
set shell := ["zsh", "-cu"] # 修改 shell

[private]
default:
@just --list --justfile {{justfile()}}

# 注释
js:
#!/usr/bin/env node
console.log('Greetings from JavaScript!')

# 这种方式也保证所有都在一个 shell 运行而不是一行一个 shell
sh:
#!/usr/bin/env sh
hello='Yo'
echo "$hello from a shell script!"

# 默认文档内容
[doc('Say hello to someone.')]
hello name:
@echo "Hello, {{name}}!"

[no-cd] # 避免 cd 到 justfile 所在目录
build name:
@echo "Building {{name}}..."

# 会读取 TEST_NAME 环境变量
test $TEST_NAME="1":

# 依赖可以带参数
xbuild: (build "main")
# 透传参数,默认参数
push target=xyz: (build target)
# 复杂默认参数
test triple=(arch + "-unknown-unknown") input=(arch / "input.dat"):

# varidic 参数 / 可变参数
backup +FILES:
backup *FILES:

[working-directory: 'bar'] # 针对命令修改工作目录
@bar:

# 执行顺序是 a b c d
b: a && c d

[no-exit-message]
git *args:
@git {{args}}
  • recipe
    • private
      • _ 开头为 private
      • 者使用 [private] 标记为 private
      • 不会在 list 显示
    • quite
      • set quiet
      • [no-quiet] 取消 quite
      • @line
      • @recipe:
        • 默认 quiet,
        • 在行首加 @ 取消 quiet
      • Shebang recipes 默认 quite
  • 内置函数别名
    • _directory -> _dir
      • home_directory() -> ``home_dir()`
  • 内置函数
    • arch, num_cpus, os, os_family
    • shell
    • env(key) / env_var(key), env(key, default) / env_var_or_default(key, default)
    • is_dependency() - 当前 recipe 作为依赖 运行
    • invocation_directory(), invocation_directory_native()
    • justfile(), justfile_directory()
    • source_file(), source_directory()
    • just_executable()
    • just_pid()
    • error
  • 字符串函数、 case 转换函数、路径函数、随机、hash、日期、版本号、 XDG 目录
  • console 颜色常量
  • recipe 属性
    • confirm, doc, extension, group, no-cd, no-exit-message, no-quiet, private, script
    • working-directory
    • positional-arguments
    • linux, macos, unix, windows, openbsd
  • 语法
    • if/else
# 确保是单个命令 - 以免把 serve 当成参数
just --one build serve