justfile
Justfileを作成する際に、最新の構文、機能、ベストプラクティスを理解するために使用します。
description の原文を見る
Use when writing Justfiles to understand the latest syntax, features, and best practices
SKILL.md 本文
Justfileの記述
以下のreadmeは次から取得されています: https://github.com/casey/just/blob/master/README.md
Justfileの構文とシステムを完全に説明しています。
<h1 align=center><code>just</code></h1>
justは、プロジェクト固有のコマンドを保存して実行するための便利な方法です。
このreadmeはbookとしても利用可能です。bookは最新のリリースを反映しており、一方GitHubのreadmeは最新のmasterを反映しています。
(中文文档在 这里, 快看过来!)
レシピと呼ばれるコマンドは、makeにインスピレーションを受けた構文を持つjustfileというファイルに保存されます:

その後、just RECIPEで実行できます:
$ just test-all
cc *.c -o main
./test --all
Yay, all your tests passed!
justには多くの便利な機能があり、makeに対して多くの改善があります:
justはビルドシステムではなくコマンドランナーなので、makeの複雑性と癖の多くを回避できます。.PHONYレシピは不要です!- Linux、MacOS、Windows、および他の合理的なUnixシステムが追加の依存関係なしでサポートされています。(ただし、システムに
shがない場合は、別のシェルを選択する必要があります。) - エラーは具体的で有益であり、構文エラーはソースコンテキストと共にレポートされます。
- レシピはコマンドライン引数を受け入れることができます。
- 可能な限り、エラーは静的に解決されます。不明なレシピと循環依存は、何かが実行される前にレポートされます。
justは.envファイルをロードし、環境変数を簡単に設定できます。- レシピはコマンドラインからリスト表示できます。
- コマンドライン補完スクリプトはほとんどの一般的なシェルで利用可能です。
- レシピは任意の言語(PythonやNodeJSなど)で記述できます。
justはjustfileを含むディレクトリだけでなく、任意のサブディレクトリから呼び出せます。- そしてさらに多く!
justでサポートが必要な場合は、お気軽にissueを開くかDiscordで私に連絡してください。機能リクエストとバグレポートは常に歓迎です!
クイックスタート
コンピュータにjustをインストールする方法は、インストールセクションを参照してください。just --versionを実行して、正しくインストールされていることを確認してみてください。
構文の概要については、このチートシートを確認してください。
justがインストールされて動作したら、プロジェクトのルートに以下の内容でjustfileという名前のファイルを作成します:
recipe-name:
echo 'This is a recipe!'
# this is a comment
another-recipe:
@echo 'This is another recipe.'
justを呼び出すと、現在のディレクトリとその上位ディレクトリでjustfileを探すため、プロジェクトのどのサブディレクトリからでも呼び出せます。
justfileの検索は大文字小文字を区別しないため、Justfile、JUSTFILE、JuStFiLeなどの任意のケースが機能します。justは.justfileという名前のファイルも探します。これはjustfileを隠したい場合に便利です。
引数なしでjustを実行すると、justfileの最初のレシピが実行されます:
$ just
echo 'This is a recipe!'
This is a recipe!
1つ以上の引数は実行するレシピを指定します:
$ just another-recipe
This is another recipe.
justは実行前に各コマンドを標準エラーに出力します。これがecho 'This is a recipe!'が出力された理由です。これは@で始まる行では抑制されます。これがecho 'This is another recipe.'が出力されなかった理由です。
コマンドが失敗するとレシピの実行は停止します。ここではcargo testが成功した場合のみcargo publishが実行されます:
publish:
cargo test
# tests passed, time to publish!
cargo publish
レシピは他のレシピに依存することができます。ここでtestレシピはbuildレシピに依存しているので、testが実行される前にbuildが実行されます:
build:
cc main.c foo.c bar.c -o main
test: build
./test
sloc:
@echo "`wc -l *.c` lines of code"
$ just test
cc main.c foo.c bar.c -o main
./test
testing… all tests passed!
依存関係のないレシピは、コマンドラインで指定された順序で実行されます:
$ just build sloc
cc main.c foo.c bar.c -o main
1337 lines of code
依存関係は常に最初に実行されます。たとえそれらが依存するレシピの後に渡されても:
$ just test build
cc main.c foo.c bar.c -o main
./test
testing… all tests passed!
レシピはサブモジュール内のレシピに依存することができます:
mod foo
baz: foo::bar
例
様々なjustfileは例ディレクトリおよびGitHubで見つけることができます。
機能
デフォルトレシピ
justがレシピなしで呼び出されると、[default]属性を持つレシピ、またはその属性を持つレシピがない場合はjustfileの最初のレシピが実行されます。
このレシピはプロジェクトで最も頻繁に実行されるコマンド(テストの実行など)の場合があります:
test:
cargo test
依存関係を使用して複数のレシピをデフォルトで実行することもできます:
default: lint build test
build:
echo Building…
test:
echo Testing…
lint:
echo Linting…
デフォルトレシピとして意味があるレシピがない場合は、justfileの始めに利用可能なレシピをリストするレシピを追加できます:
default:
just --list
利用可能なレシピのリスト表示
レシピはjust --listで英字順にリスト表示できます:
$ just --list
Available recipes:
build
test
deploy
lint
サブモジュール内のレシピはjust --list PATHでリスト表示できます。PATHはスペースまたは::で区切られたモジュールパスです:
$ cat justfile
mod foo
$ cat foo.just
mod bar
$ cat bar.just
baz:
$ just --list foo bar
Available recipes:
baz
$ just --list foo::bar
Available recipes:
baz
just --summaryはより簡潔です:
$ just --summary
build test deploy lint
--unsortedを渡すと、レシピがjustfileに表示される順序で出力されます:
test:
echo 'Testing!'
build:
echo 'Building!'
$ just --list --unsorted
Available recipes:
test
build
$ just --summary --unsorted
test build
justがjustfile内のレシピをデフォルトでリスト表示するようにしたい場合は、これをデフォルトレシピとして使用できます:
default:
@just --list
上記の行に--justfile {{justfile()}}を追加する必要があるかもしれません。それなしで、just -f /some/distant/justfile -d .またはjust -f ./non-standard-justfileを実行した場合、レシピ内の単純なjust --listは提供されたファイルを必ずしも使用しません。現在のパスでjustfileを見つけようとし、No justfile foundエラーが発生する可能性があります。
見出しのテキストは--list-headingでカスタマイズできます:
$ just --list --list-heading $'Cool stuff…\n'
Cool stuff…
test
build
インデントは--list-prefixでカスタマイズできます:
$ just --list --list-prefix ····
Available recipes:
····test
····build
--list-headingへの引数は、見出しとそれに続く改行の両方を置き換えるため、空でない場合は改行を含める必要があります。これは、空の文字列を渡して見出し行全体を抑制できるようにするためです:
$ just --list --list-heading ''
test
build
複数のレシピの呼び出し
複数のレシピは一度にコマンドラインから呼び出すことができます:
build:
make web
serve:
python3 -m http.server -d out 8000
$ just build serve
make web
python3 -m http.server -d out 8000
パラメータを持つレシピは、他のレシピの名前にマッチしていても引数を吸収することに注意してください:
build project:
make {{project}}
serve:
python3 -m http.server -d out 8000
$ just build serve
make: *** No rule to make target `serve'. Stop.
--oneフラグを使用して、コマンドライン呼び出しを単一のレシピに制限できます:
$ just --one build serve
error: Expected 1 command-line recipe invocation but found 2.
作業ディレクトリ
デフォルトでは、レシピはjustfileを含むディレクトリに設定された作業ディレクトリで実行されます。
[no-cd]属性を使用すると、レシピはjustが呼び出されたディレクトリに設定された作業ディレクトリで実行されます。
@foo:
pwd
[no-cd]
@bar:
pwd
$ cd subdir
$ just foo
/
$ just bar
/subdir
set working-directory := '…'ですべてのレシピの作業ディレクトリをオーバーライドできます:
set working-directory := 'bar'
@foo:
pwd
$ pwd
/home/bob
$ just foo
/home/bob/bar
working-directory属性で特定のレシピの作業ディレクトリをオーバーライドできます<sup>1.38.0</sup>:
[working-directory: 'bar']
@foo:
pwd
$ pwd
/home/bob
$ just foo
/home/bob/bar
working-directory設定またはworking-directory属性への引数は、絶対パスまたは相対パスにできます。相対パスの場合、デフォルト作業ディレクトリに対して相対的に解釈されます。
エイリアス
エイリアスを使うと、レシピを代替名でコマンドラインから呼び出すことができます:
alias b := build
build:
echo 'Building!'
$ just b
echo 'Building!'
Building!
エイリアスのターゲットはサブモジュール内のレシピにすることができます:
mod foo
alias baz := foo::bar
設定
設定は解釈と実行を制御します。各設定は最大1回、justfileのどこでも指定できます。
例えば:
set shell := ["zsh", "-cu"]
foo:
# this line will be run as `zsh -cu 'ls **/*.txt'`
ls **/*.txt
設定テーブル
| 名前 | 値 | デフォルト | 説明 |
|---|---|---|---|
allow-duplicate-recipes | boolean | false | justfileの後に出現するレシピが同じ名前の前のレシピをオーバーライドすることを許可します。 |
allow-duplicate-variables | boolean | false | justfileの後に出現する変数が同じ名前の前の変数をオーバーライドすることを許可します。 |
dotenv-filename | string | - | 存在する場合、カスタム名の.envファイルをロードします。 |
dotenv-load | boolean | false | 存在する場合、.envファイルをロードします。 |
dotenv-override | boolean | false | .envファイルの値で既存の環境変数をオーバーライドします。 |
dotenv-path | string | - | カスタムパスから.envファイルをロードし、存在しない場合はエラーになります。dotenv-filenameをオーバーライドします。 |
dotenv-required | boolean | false | .envファイルが見つからない場合はエラーになります。 |
export | boolean | false | すべての変数を環境変数としてエクスポートします。 |
fallback | boolean | false | コマンドラインの最初のレシピが見つからない場合、親ディレクトリでjustfileを検索します。 |
ignore-comments | boolean | false | #で始まるレシピ行を無視します。 |
positional-arguments | boolean | false | 位置指定引数を渡します。 |
quiet | boolean | false | 実行前にレシピ行のエコーを無効にします。 |
script-interpreter<sup>1.33.0</sup> | [COMMAND, ARGS…] | ['sh', '-eu'] | 空の[script]属性を持つレシピを呼び出すために使用されるコマンドを設定します。 |
shell | [COMMAND, ARGS…] | - | レシピとバッククォートを呼び出すために使用されるコマンドを設定します。 |
tempdir | string | - | システムのデフォルトテンポラリディレクトリの代わりにtempdirに一時ディレクトリを作成します。 |
unstable<sup>1.31.0</sup> | boolean | false | 不安定な機能を有効にします。 |
windows-powershell | boolean | false | Windows上でデフォルトシェルとしてPowerShellを使用します。(非推奨。代わりにwindows-shellを使用してください。) |
windows-shell | [COMMAND, ARGS…] | - | レシピとバッククォートを呼び出すために使用されるコマンドを設定します。 |
working-directory<sup>1.33.0</sup> | string | - | レシピとバッククォートの作業ディレクトリを設定します。デフォルト作業ディレクトリに対して相対的です。 |
Boolean設定は次のように記述できます:
set NAME
これは以下と同等です:
set NAME := true
非boolean設定は文字列と式の両方に設定できます。<sup>1.46.0</sup>
ただし、設定はバッククォートと多くの関数の動作に影響するため、これらの式は直接的または参照経由で間接的にバッククォートまたは関数呼び出しを含むことができません。
重複レシピを許可
allow-duplicate-recipesがtrueに設定されている場合、同じ名前の複数のレシピを定義することはエラーではなく、最後の定義が使用されます。デフォルトはfalseです。
set allow-duplicate-recipes
@foo:
echo foo
@foo:
echo bar
$ just foo
bar
重複変数を許可
allow-duplicate-variablesがtrueに設定されている場合、同じ名前の複数の変数を定義することはエラーではなく、最後の定義が使用されます。デフォルトはfalseです。
set allow-duplicate-variables
a := "foo"
a := "bar"
@foo:
echo {{a}}
$ just foo
bar
Dotenv設定
dotenv-load、dotenv-filename、dotenv-override、dotenv-path、またはdotenv-requiredのいずれかが設定されている場合、justはファイルから環境変数をロードしようとします。
dotenv-pathが設定されている場合、justは与えられたパスのファイルを探します。これは絶対パスまたは作業ディレクトリに対して相対的な場合があります。
コマンドラインオプション--dotenv-path(短縮形-E)を使用して、実行時にdotenv-pathを設定またはオーバーライドできます。
dotenv-filenameが設定されている場合、justは与えられたパスのファイルを探します。これは作業ディレクトリとその各祖先に対して相対的です。
dotenv-filenameが設定されていないが、dotenv-loadまたはdotenv-requiredが設定されている場合、justは.envという名前のファイルを探します。これは作業ディレクトリとその各祖先に対して相対的です。
dotenv-filenameとdotenv-pathは同様ですが、dotenv-pathは作業ディレクトリに対して相対的にのみチェックされ、dotenv-filenameは作業ディレクトリとその各祖先に対して相対的にチェックされます。
環境ファイルが見つからない場合、dotenv-requiredが設定されていない限りエラーではありません。
ロードされた変数は環境変数であり、just変数ではないため、レシピとバッククォートで$VARIABLE_NAMEを使用してアクセスする必要があります。
dotenv-overrideが設定されている場合、環境ファイルの変数は既存の環境変数をオーバーライドします。
例えば、.envファイルが以下を含む場合:
# a comment, will be ignored
DATABASE_ADDRESS=localhost:6379
SERVER_PORT=1337
そしてjustfileが以下を含む場合:
set dotenv-load
serve:
@echo "Starting server with database $DATABASE_ADDRESS on port $SERVER_PORT…"
./server --database $DATABASE_ADDRESS --port $SERVER_PORT
just serveは以下を出力します:
$ just serve
Starting server with database localhost:6379 on port 1337…
./server --database $DATABASE_ADDRESS --port $SERVER_PORT
エクスポート
export設定は、すべてのjust変数を環境変数としてエクスポートします。デフォルトはfalseです。
set export
a := "hello"
@foo b:
echo $a
echo $b
$ just foo goodbye
hello
goodbye
位置指定引数
positional-argumentsがtrueの場合、レシピ引数はコマンドに位置指定引数として渡されます。行ごとのレシピの場合、引数$0はレシピ名になります。
例えば、このレシピを実行すると:
set positional-arguments
@foo bar:
echo $0
echo $1
以下の出力が生成されます:
$ just foo hello
foo
hello
bashやzshなどのsh互換シェルを使用する場合、$@はレシピに与えられた位置指定引数に展開されます(1から始まります)。二重引用符内で"$@"として使用される場合、空白を含む引数は二重引用符で囲まれているように渡されます。つまり、"$@"は"$1" "$2"...と同等です。位置パラメータがない場合、"$@"と$@は何もない(つまり削除される)に展開されます。
このサンプルレシピは引数を1行ずつ別々の行に出力します:
set positional-arguments
@test *args='':
bash -c 'while (( "$#" )); do echo - $1; shift; done' -- "$@"
2つの引数で実行した場合:
$ just test foo "bar baz"
- foo
- bar baz
位置指定引数は[positional-arguments]属性でレシピごとに有効にすることもできます<sup>1.29.0</sup>:
[positional-arguments]
@foo bar:
echo $0
echo $1
PowerShellは他のシェルと同じ方法で位置指定引数を処理しないため、位置指定引数を有効にするとPowerShellを使用するレシピが壊れる可能性があります。
PowerShell 7.4以上を使用する場合、-CommandWithArgsフラグは位置指定引数が期待通りに機能するようにします:
set shell := ['pwsh.exe', '-CommandWithArgs']
set positional-arguments
print-args a b c:
Write-Output @($args[1..($args.Count - 1)])
シェル
shell設定は、レシピ行とバッククォートを呼び出すために使用されるコマンドを制御します。Shebangレシピは影響を受けません。デフォルトシェルはsh -cuです。
# use python3 to execute recipe lines and backticks
set shell := ["python3", "-c"]
# use print to capture result of evaluation
foos := `print("foo" * 4)`
foo:
print("Snake snake snake snake.")
print("{{foos}}")
justはコマンドを引数として渡します。多くのシェルは、最初の引数を評価するために追加フラグ(通常は-c)が必要です。
Windowsシェル
justはWindowsでデフォルトでshを使用します。Windowsで別のシェルを使用するには、windows-shellを使用します:
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
hello:
Write-Host "Hello, world!"
powershell.justを参照して、すべてのプラットフォームでPowerShellを使用するjustfileの例を確認してください。
Windows PowerShell
set windows-powershellはレガシーpowershell.exeバイナリを使用し、推奨されなくなりました。Windows上で使用するシェルを制御するより柔軟な方法については、上記のwindows-shell設定を参照してください。
justはWindowsでデフォルトでshを使用します。代わりにpowershell.exeを使用するには、windows-powershellを真に設定します。
set windows-powershell := true
hello:
Write-Host "Hello, world!"
Python 3
set shell := ["python3", "-c"]
Bash
set shell := ["bash", "-uc"]
Z Shell
set shell := ["zsh", "-uc"]
Fish
set shell := ["fish", "-c"]
Nushell
set shell := ["nu", "-c"]
デフォルトテーブルモードをlightに変更したい場合:
set shell := ['nu', '-m', 'light', '-c']
NushellはRustで記述され、Windows / macOSおよびLinuxのクロスプラットフォームサポートを備えています。
ドキュメンテーションコメント
レシピの直前のコメントはjust --listに表示されます:
# build stuff
build:
./bin/build
# test stuff
test:
./bin/test
$ just --list
Available recipes:
build # build stuff
test # test stuff
[doc]属性を使用して、レシピのドキュメンテーションコメントを設定または抑制できます:
# This comment won't appear
[doc('Build stuff')]
build:
./bin/build
# This one won't either
[doc]
test:
./bin/test
$ just --list
Available recipes:
build # Build stuff
test
式と代替
式では、様々な演算子と関数呼び出しがサポートされています。これらは割り当て、デフォルトレシピ引数、およびレシピボディ{{…}}代替内で使用できます。
tmpdir := `mktemp -d`
version := "0.2.7"
tardir := tmpdir / "awesomesauce-" + version
tarball := tardir + ".tar.gz"
config := quote(config_dir() / ".project-config")
publish:
rm -f {{tarball}}
mkdir {{tardir}}
cp README.md *.c {{ config }} {{tardir}}
tar zcvf {{tarball}} {{tardir}}
scp {{tarball}} me@server.com:release/
rm -rf {{tarball}} {{tardir}}
連結
+演算子は左側の引数を右側の引数と連結した値を返します:
foobar := 'foo' + 'bar'
論理演算子
論理演算子&&と||を使用して文字列値を合約できます<sup>1.37.0</sup>。これはPythonのandとorに似ています。これらの演算子は空の文字列''を偽と見なし、他のすべての文字列を真と見なします。
これらの演算子は現在不安定です。
&&演算子は、左側の引数が空の文字列の場合は空の文字列を返し、そうでない場合は右側の引数を返します:
foo := '' && 'goodbye' # ''
bar := 'hello' && 'goodbye' # 'goodbye'
||演算子は、左側の引数が空でない場合はそれを返し、そうでない場合は右側の引数を返します:
foo := '' || 'goodbye' # 'goodbye'
bar := 'hello' || 'goodbye' # 'hello'
パスの結合
/演算子を使用して2つの文字列をスラッシュで結合できます:
foo := "a" / "b"
$ just --evaluate foo
a/b
すでに存在する場合でも/が追加されることに注意してください:
foo := "a/"
bar := foo / "b"
$ just --evaluate bar
a//b
絶対パスも構築できます<sup>1.5.0</sup>:
foo := / "b"
$ just --evaluate foo
/b
/演算子はWindowsでも/文字を使用します。したがって、ユニバーサルネーミング規則(UNC)(\?で始まるもの)を使用するパスでは、/演算子の使用を避けるべきです。なぜなら、フォースラッシュはUNCパスではサポートされていないからです。
{{のエスケープ
{{を含むレシピを記述するには、{{{{を使用します:
braces:
echo 'I {{{{LOVE}} curly braces!'
(一致しない}}は無視されるため、エスケープする必要はありません。)
別のオプションは、エスケープしたいすべてのテキストを補間内に配置することです:
braces:
echo '{{'I {{LOVE}} curly braces!'}}'
さらに別のオプションは{{ "{{" }}を使用することです:
braces:
echo 'I {{ "{{" }}LOVE}} curly braces!'
文字列
'single'、"double"、および'''triple'''の引用文字列リテラルがサポートされています。レシピボディ内とは異なり、{{…}}補間は文字列内ではサポートされていません。
二重引用符文字列はエスケープシーケンスをサポートしています:
carriage-return := "\r"
double-quote := "\""
newline := "\n"
no-newline := "\
"
slash := "\\"
tab := "\t"
unicode-codepoint := "\u{1F916}"
$ just --evaluate
"arriage-return := "
double-quote := """
newline := "
"
no-newline := ""
slash := "\"
tab := " "
unicode-codepoint := "🤖"
Unicodeキャラクターエスケープシーケンス\u{…}<sup>1.36.0</sup>は最大6桁の16進数を受け入れます。
文字列は改行を含む場合があります:
single := '
hello
'
double := "
goodbye
"
単一引用符文字列はエスケープシーケンスを認識しません:
escapes := '\t\n\r\"\\'
$ just --evaluate
escapes := "\t\n\r\"\\"
トリプル単一引用符またはトリプル二重引用符で区切られた、インデント付きの単一および二重引用符文字列の両方がサポートされています。インデント付きの文字列行は、先頭の改行とすべての非空行に共通の先頭空白が削除されます:
# this string will evaluate to `foo\nbar\n`
x := '''
foo
bar
'''
# this string will evaluate to `abc\n wuv\nxyz\n`
y := """
abc
wuv
xyz
"""
インデント付きでない文字列と同様に、インデント付きの二重引用符文字列はエスケープシーケンスを処理し、インデント付きの単一引用符文字列はエスケープシーケンスを無視します。エスケープシーケンス処理はインデント解除後に行われます。インデント解除アルゴリズムは、エスケープシーケンスが生成する空白または改行を考慮しません。
シェル拡張文字列
xで始まる文字列はシェル拡張されます<sup>1.27.0</sup>:
foobar := x'~/$FOO/${BAR}'
| 値 | 置換 |
|---|---|
$VAR | 環境変数VARの値 |
${VAR} | 環境変数VARの値 |
${VAR:-DEFAULT} | 環境変数VARの値、またはVARが設定されていない場合はDEFAULT |
先頭の~ | 現在のユーザーのホームディレクトリへのパス |
先頭の~USER | USERのホームディレクトリへのパス |
この展開はコンパイル時に実行されるため、.envファイルおよびエクスポートされたjust変数は使用できません。ただし、これにより、シェル拡張文字列を、just変数と.envファイルに依存できないインポートパスなどの場所で使用できます。
フォーマット文字列
fで始まる文字列はフォーマット文字列です<sup>1.44.0</sup>:
name := "world"
message := f'Hello, {{name}}!'
フォーマット文字列は{{…}}で区切られた補間を含む場合があります。これには式が含まれます。フォーマット文字列は、連結された文字列フラグメントと評価された式に評価されます。
フォーマット文字列にリテラル{{を含めるには、{{{{を使用します:
foo := f'I {{{{LOVE} curly braces!'
エラーを無視する
通常、コマンドが0以外の終了ステータスを返すと、実行は停止します。コマンドが失敗しても実行を続けるには、コマンドに-を付けます:
foo:
-cat foo
echo 'Done!'
$ just foo
cat foo
cat: foo: No such file or directory
echo 'Done!'
Done!
関数
justは、レシピボディ{{…}}代替、割り当て、デフォルトパラメータ値など、式で使用するための多くの組み込み関数を提供しています。
_directoryで終わるすべての関数は_dirに省略できます。つまり、home_directory()はhome_dir()として記述することもできます。さらに、invocation_directory_native()はinvocation_dir_native()に省略できます。
システム情報
arch()— 命令セットアーキテクチャ。可能な値は"aarch64"、"arm"、"asmjs"、"hexagon"、"mips"、"msp430"、"powerpc"、"powerpc64"、"s390x"、"sparc"、"wasm32"、"x86"、"x86_64"、および"xcore"です。num_cpus()<sup>1.15.0</sup> - 論理CPUの数。os()— オペレーティングシステム。可能な値は"android"、"bitrig"、"dragonfly"、"emscripten"、"freebsd"、"haiku"、"ios"、"linux"、"macos"、"netbsd"、"openbsd"、および"solaris"です。os_family()— オペレーティングシステムのファミリ;可能な値は"unix"および"windows"です。
例えば:
system-info:
@echo "This is an {{arch()}} machine".
$ just system-info
This is an x86_64 machine
os_family()関数を使用して、様々なオペレーティングシステムで動作するクロスプラットフォームjustfileを作成できます。例については、cross-platform.justファイルを参照してください。
外部コマンド
-
shell(command, args...)<sup>1.27.0</sup>はシェルスクリプトcommandの標準出力を0個以上の位置指定引数argsで返します。commandを解釈するために使用されるシェルは、レシピ行を評価するために使用されるシェルと同じであり、set shell := […]で変更できます。commandは最初の引数として渡されるため、コマンドが'echo $@'の場合、デフォルトシェルコマンドsh -cuとargs'foo'および'bar'での完全なコマンドラインは:'sh' '-cu' 'echo $@' 'echo $@' 'foo' 'bar'これにより、
$@が期待通りに機能し、$1は最初の引数を参照します。$@は最初の位置指定引数を含まず、これは実行されているプログラムの名前であることが予期されています。
# arguments can be variables or expressions
file := '/sys/class/power_supply/BAT0/status'
bat0stat := shell('cat $1', file)
# commands can be variables or expressions
command := 'wc -l'
output := shell(command + ' "$1"', 'main.c')
# arguments referenced by the shell command must be used
empty := shell('echo', 'foo')
full := shell('echo $1', 'foo')
error := shell('echo $1')
# Using python as the shell. Since `python -c` sets `sys.argv[0]` to `'-c'`,
# the first "real" positional argument will be `sys.argv[2]`.
set shell := ["python3", "-c"]
olleh := shell('import sys; print(sys.argv[2][::-1])', 'hello')
環境変数
env(key)<sup>1.15.0</sup> —keyという名前の環境変数を取得し、存在しない場合は中止します。
home_dir := env('HOME')
test:
echo "{{home_dir}}"
$ just
/home/user1
env(key, default)<sup>1.15.0</sup> —keyという名前の環境変数を取得し、存在しない場合はdefaultを返します。env_var(key)—env(key)の非推奨エイリアス。env_var_or_default(key, default)—env(key, default)の非推奨エイリアス。
デフォルトは||演算子で空の環境変数値に代替できます。これは現在不安定です:
set unstable
foo := env('FOO', '') || 'DEFAULT_VALUE'
実行ファイル
-
require(name)<sup>1.39.0</sup> —PATH環境変数内のディレクトリで実行ファイルnameを検索し、その完全なパスを返すか、nameという実行ファイルが存在しない場合はエラーで中止します。bash := require("bash") @test: echo "bash: '{{bash}}'"$ just bash: '/bin/bash' -
which(name)<sup>1.39.0</sup> —PATH環境変数内のディレクトリで実行ファイルnameを検索し、その完全なパスを返すか、nameという実行ファイルが存在しない場合は空の文字列を返します。現在不安定です。set unstable bosh := which("bosh") @test: echo "bosh: '{{bosh}}'"$ just bosh: ''
呼び出し情報
is_dependency()- 現在のレシピが別のレシピの依存関係として実行されているかどうかを示す文字列trueを返します。直接実行されている場合はfalseを返します。
呼び出しディレクトリ
invocation_directory()-justが呼び出されたときの現在のディレクトリの絶対パスを取得します。これはコマンド実行前にjustが変更する(chdir)前です。Windowsでは、invocation_directory()はcygpathを使用して呼び出しディレクトリをCygwin互換の/区切りパスに変換します。すべてのプラットフォームで逐語的な呼び出しディレクトリを返すには、invocation_directory_native()を使用します。
例えば、「現在のディレクトリ」(ユーザー/呼び出し元の観点から)のすぐ下のファイルにrustfmtを呼び出すには、次のルールを使用します:
rustfmt:
find {{invocation_directory()}} -name \*.rs -exec rustfmt {} \;
あるいは、コマンドを現在のディレクトリから実行する必要がある場合は、(例えば)以下を使用できます:
build:
cd {{invocation_directory()}}; ./some_script_that_needs_to_be_run_from_here
invocation_directory_native()-justが呼び出されたときの現在のディレクトリの絶対パスを取得します。これはコマンド実行前にjustが変更する(chdir)前です。
Justfileおよびjustfileディレクトリ
justfile()- 現在のjustfileのパスを取得します。justfile_directory()- 現在のjustfileの親ディレクトリのパスを取得します。
例えば、現在のjustfileの場所に対して相対的にコマンドを実行するには:
script:
{{justfile_directory()}}/scripts/some_script
ソースおよびソースディレクトリ
source_file()<sup>1.27.0</sup> - 現在のソースファイルのパスを取得します。source_directory()<sup>1.27.0</sup> - 現在のソースファイルの親ディレクトリのパスを取得します。
source_file()とsource_directory()は、ルートjustfileではjustfile()およびjustfile_directory()と同じ動作をしますが、インポートまたはサブモジュール内から呼び出された場合は、現在のimportまたはmodソースファイルのパスおよびディレクトリをそれぞれ返します。
Just実行ファイル
just_executable()-just実行ファイルの絶対パス。
例えば:
executable:
@echo The executable is at: {{just_executable()}}
$ just
The executable is at: /bin/just
JustプロセスID
just_pid()-just実行ファイルのプロセスID。
例えば:
pid:
@echo The process ID is: {{ just_pid() }}
$ just
The process ID is: 420
文字列操作
append(suffix, s)<sup>1.27.0</sup>s内のスペース区切り文字列にsuffixを追加します。append('/src', 'foo bar baz')→'foo/src bar/src baz/src'prepend(prefix, s)<sup>1.27.0</sup>s内のスペース区切り文字列にprefixを前置します。prepend('src/', 'foo bar baz')→'src/foo src/bar src/baz'encode_uri_component(s)<sup>1.27.0</sup> -[A-Za-z0-9_.!~*'()-]を除くs内の文字をパーセントエンコードします。これはJavaScriptencodeURIComponent関数の動作に一致します。quote(s)- すべての単一引用符を'\''に置き換え、sに単一引用符を前置および後置します。これは、ほとんどのBourneシェルの派生を含む多くのシェルの特殊文字をエスケープするのに十分です。replace(s, from, to)-s内のfromのすべての出現をtoに置き換えます。replace_regex(s, regex, replacement)-s内のregexのすべての出現をreplacementに置き換えます。正規表現はRustregexcrateによって提供されます。使用例については構文ドキュメントを参照してください。キャプチャグループはサポートされています。replacement文字列は置換文字列構文を使用します。trim(s)-sから先頭および末尾の空白を削除します。trim_end(s)-sから末尾の空白を削除します。trim_end_match(s, substring)-sのsubstringに一致するサフィックスを削除します。trim_end_matches(s, substring)-sのsubstringに一致するサフィックスを繰り返し削除します。trim_start(s)-sから先頭の空白を削除します。trim_start_match(s, substring)-sのsubstringに一致するプレフィックスを削除します。trim_start_matches(s, substring)-sのsubstringに一致するプレフィックスを繰り返し削除します。
ケース変換
capitalize(s)<sup>1.7.0</sup> -sの最初の文字を大文字に、残りを小文字に変換します。kebabcase(s)<sup>1.7.0</sup> -sをkebab-caseに変換します。lowercamelcase(s)<sup>1.7.0</sup> -sをlowerCamelCaseに変換します。lowercase(s)-sを小文字に変換します。shoutykebabcase(s)<sup>1.7.0</sup> -sをSHOUTY-KEBAB-CASEに変換します。shoutysnakecase(s)<sup>1.7.0</sup> -sをSHOUTY_SNAKE_CASEに変換します。snakecase(s)<sup>1.7.0</sup> -sをsnake_caseに変換します。titlecase(s)<sup>1.7.0</sup> -sをTitle Caseに変換します。uppercamelcase(s)<sup>1.7.0</sup> -sをUpperCamelCaseに変換します。uppercase(s)-sを大文字に変換します。
パス操作
失敗可能
absolute_path(path)- 作業ディレクトリ内の相対pathへの絶対パス。/fooディレクトリ内のabsolute_path("./bar.txt")は/foo/bar.txtです。canonicalize(path)<sup>1.24.0</sup> - シンボリックリンクを解決し、.、..、および余分な/を可能な限り削除することでpathを正規化します。extension(path)-pathの拡張子。extension("/foo/bar.txt")はtxtです。file_name(path)- 先頭のディレクトリコンポーネントが削除されたpathのファイル名。file_name("/foo/bar.txt")はbar.txtです。file_stem(path)- 拡張子なしのpathのファイル名。file_stem("/foo/bar.txt")はbarです。parent_directory(path)-pathの親ディレクトリ。parent_directory("/foo/bar.txt")は/fooです。without_extension(path)- 拡張子なしのpath。without_extension("/foo/bar.txt")は/foo/barです。
これらの関数は失敗する可能性があります。例えば、パスに拡張子がない場合など。これは実行を中止します。
失敗不可能
clean(path)- 余分なパスセパレータ、中間.コンポーネント、および可能な限り..を削除することでpathを簡素化します。clean("foo//bar")はfoo/bar、clean("foo/..")は.、clean("foo/./bar")はfoo/barです。join(a, b…)- この関数はUnixで/、Windowsで\を使用し、望ましくない動作につながる可能性があります。常に/を使用する/演算子(例:a / b)は、Windows上で特に\が必要な場合を除き、置き換えとして検討すべきです。 パスaとパスbを結合します。join("foo/bar", "baz")はfoo/bar/bazです。2つ以上の引数を受け入れます。
ファイルシステムアクセス
path_exists(path)- パスが既存のエンティティを指している場合はtrueを返し、そうでない場合はfalseを返します。シンボリックリンクをトラバースし、パスがアクセス不可能または壊れたシンボリックリンクを指している場合はfalseを返します。read(path)<sup>1.39.0</sup> -pathのファイルの内容を文字列として返します。
エラー報告
error(message)- 実行を中止し、エラーmessageをユーザーに報告します。
UUIDおよびハッシュ生成
blake3(string)<sup>1.25.0</sup> -stringのBLAKE3ハッシュを16進数文字列として返します。blake3_file(path)<sup>1.25.0</sup> -pathのファイルのBLAKE3ハッシュを16進数文字列として返します。sha256(string)-stringのSHA-256ハッシュを16進数文字列として返します。sha256_file(path)-pathのファイルのSHA-256ハッシュを16進数文字列として返します。uuid()- ランダムなバージョン4 UUIDを生成します。
ランダム
choose(n, alphabet)<sup>1.27.0</sup> -alphabetからランダムに選択されたn個の文字の文字列を生成します。alphabetは繰り返し文字を含むことができません。例えば、choose('64', HEX)はランダムな64文字の小文字16進数文字列を生成します。
日時
datetime(format)<sup>1.30.0</sup> - ローカル時刻をformatで返します。datetime_utc(format)<sup>1.30.0</sup> - UTC時刻をformatで返します。
datetimeおよびdatetime_utcへの引数はstrftimeスタイルのフォーマット文字列です。詳細についてはchronoライブラリドキュメントを参照してください。
セマンティックバージョン
semver_matches(version, requirement)<sup>1.16.0</sup> - セマンティックversion(例:"0.1.0")がrequirement(例:">=0.1.0")に一致するかどうかを確認し、そうである場合は"true"を返し、そうでない場合は"false"を返します。
スタイル
-
style(name)<sup>1.37.0</sup> -justで使用されている名前付きターミナル表示属性エスケープシーケンスを返します。標準色とスタイルを含むターミナル表示属性エスケープシーケンス定数とは異なり、style(name)はjust自身によって使用されるエスケープシーケンスを返し、レシピ出力をjust自身の出力と一致させるために使用できます。nameの認識値は'command'(エコーされたレシピ行の場合)、error、およびwarningです。例えば、エラーメッセージをスタイルするには:
scary: @echo '{{ style("error") }}OH NO{{ NORMAL }}'
ユーザーディレクトリ<sup>1.23.0</sup>
これらの関数は、設定、データ、キャッシュ、実行ファイル、およびユーザーのホームディレクトリなどのユーザー固有のディレクトリへのパスを返します。
Unixでは、これらの関数はXDG Base Directory Specificationに従います。
MacOSおよびWindowsでは、これらの関数はシステム指定のユーザー固有のディレクトリを返します。例えば、cache_directory()はMacOSで~/Library/Cachesを返し、Windowsで{FOLDERID_LocalAppData}を返します。
詳細については、dirs crateを参照してください。
cache_directory()- ユーザー固有のキャッシュディレクトリ。config_directory()- ユーザー固有の設定ディレクトリ。config_local_directory()- ローカルユーザー固有の設定ディレクトリ。data_directory()- ユーザー固有のデータディレクトリ。data_local_directory()- ローカルユーザー固有のデータディレクトリ。executable_directory()- ユーザー固有の実行ファイルディレクトリ。home_directory()- ユーザーのホームディレクト
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- modAI-systems
- ライセンス
- MIT
- 最終更新
- 2026/5/12
Source: https://github.com/modAI-systems/modAI-chat / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。