Use just in readme codeblocks (#1447)

This commit is contained in:
nico 2022-12-15 21:28:02 +01:00 committed by GitHub
parent 5926300678
commit 1119d226fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 229 additions and 229 deletions

228
README.md
View File

@ -79,7 +79,7 @@ If you'd rather not install `sh`, you can use the `shell` setting to use the she
Like PowerShell:
```make
```just
# use PowerShell instead of sh:
set shell := ["powershell.exe", "-c"]
@ -89,7 +89,7 @@ hello:
…or `cmd.exe`:
```make
```just
# use cmd.exe instead of sh:
set shell := ["cmd.exe", "/c"]
@ -417,7 +417,7 @@ For an overview of the syntax, check out [this cheatsheet](https://cheatography.
Once `just` is installed and working, create a file named `justfile` in the root of your project with the following contents:
```make
```just
recipe-name:
echo 'This is a recipe!'
@ -449,7 +449,7 @@ This is another recipe.
Recipes stop running if a command fails. Here `cargo publish` will only run if `cargo test` succeeds:
```make
```just
publish:
cargo test
# tests passed, time to publish!
@ -458,7 +458,7 @@ publish:
Recipes can depend on other recipes. Here the `test` recipe depends on the `build` recipe, so `build` will run before `test`:
```make
```just
build:
cc main.c foo.c bar.c -o main
@ -505,14 +505,14 @@ Features
When `just` is invoked without a recipe, it runs the first recipe in the `justfile`. This recipe might be the most frequently run command in the project, like running the tests:
```make
```just
test:
cargo test
```
You can also use dependencies to run multiple recipes by default:
```make
```just
default: lint build test
build:
@ -527,7 +527,7 @@ lint:
If no recipe makes sense as the default recipe, you can add a recipe to the beginning of your `justfile` that lists the available recipes:
```make
```just
default:
just --list
```
@ -554,7 +554,7 @@ build test deploy lint
Pass `--unsorted` to print recipes in the order they appear in the `justfile`:
```make
```just
test:
echo 'Testing!'
@ -576,7 +576,7 @@ test build
If you'd like `just` to default to listing the recipes in the `justfile`, you can use this as your default recipe:
```make
```just
default:
@just --list
```
@ -613,7 +613,7 @@ $ just --list --list-heading ''
Aliases allow recipes to be invoked with alternative names:
```make
```just
alias b := build
build:
@ -633,7 +633,7 @@ Settings control interpretation and execution. Each setting may be specified at
For example:
```make
```just
set shell := ["zsh", "-cu"]
foo:
@ -658,13 +658,13 @@ foo:
Boolean settings can be written as:
```mf
```justfile
set NAME
```
Which is equivalent to:
```mf
```justfile
set NAME := true
```
@ -672,7 +672,7 @@ set NAME := true
If `allow-duplicate-recipes` is set to `true`, defining multiple recipes with the same name is not an error and the last definition is used. Defaults to `false`.
```make
```just
set allow-duplicate-recipes
@foo:
@ -695,7 +695,7 @@ If `dotenv-load` is `true`, a `.env` file will be loaded if present. Defaults to
The `export` setting causes all `just` variables to be exported as environment variables. Defaults to `false`.
```make
```just
set export
a := "hello"
@ -717,7 +717,7 @@ If `positional-arguments` is `true`, recipe arguments will be passed as position
For example, running this recipe:
```make
```just
set positional-arguments
@foo bar:
@ -737,7 +737,7 @@ When using an `sh`-compatible shell, such as `bash` or `zsh`, `$@` expands to th
This example recipe will print arguments one by one on separate lines:
```make
```just
set positional-arguments
@test *args='':
@ -756,7 +756,7 @@ $ just test foo "bar baz"
The `shell` setting controls the command used to invoke recipe lines and backticks. Shebang recipes are unaffected.
```make
```just
# use python3 to execute recipe lines and backticks
set shell := ["python3", "-c"]
@ -774,7 +774,7 @@ foo:
`just` uses `sh` on Windows by default. To use a different shell on Windows, use `windows-shell`:
```make
```just
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
hello:
@ -789,7 +789,7 @@ See [powershell.just](https://github.com/casey/just/blob/master/examples/powersh
`just` uses `sh` on Windows by default. To use `powershell.exe` instead, set `windows-powershell` to true.
```make
```just
set windows-powershell := true
hello:
@ -798,37 +798,37 @@ hello:
##### Python 3
```make
```just
set shell := ["python3", "-c"]
```
##### Bash
```make
```just
set shell := ["bash", "-uc"]
```
##### Z Shell
```make
```just
set shell := ["zsh", "-uc"]
```
##### Fish
```make
```just
set shell := ["fish", "-c"]
```
##### Nushell
```make
```just
set shell := ["nu", "-c"]
```
If you want to change the default table mode to `light`:
```make
```just
set shell := ['nu', '-m', 'light', '-c']
```
@ -838,7 +838,7 @@ set shell := ['nu', '-m', 'light', '-c']
Comments immediately preceding a recipe will appear in `just --list`:
```make
```just
# build stuff
build:
./bin/build
@ -869,7 +869,7 @@ SERVER_PORT=1337
And your `justfile` contains:
```make
```just
set dotenv-load
serve:
@ -889,7 +889,7 @@ Starting server with database localhost:6379 on port 1337…
Variables, strings, concatenation, path joining, and substitution using `{{…}}` are supported:
```make
```just
tmpdir := `mktemp`
version := "0.2.7"
tardir := tmpdir / "awesomesauce-" + version
@ -908,7 +908,7 @@ publish:
The `/` operator can be used to join two strings with a slash:
```make
```just
foo := "a" / "b"
```
@ -919,7 +919,7 @@ a/b
Note that a `/` is added even if one is already present:
```make
```just
foo := "a/"
bar := foo / "b"
```
@ -931,7 +931,7 @@ a//b
Absolute paths can also be constructed<sup>1.5.0</sup>:
```make
```just
foo := / "b"
```
@ -946,7 +946,7 @@ The `/` operator uses the `/` character, even on Windows. Thus, using the `/` op
To write a recipe containing `{{`, use `{{{{`:
```make
```just
braces:
echo 'I {{{{LOVE}} curly braces!'
```
@ -955,14 +955,14 @@ braces:
Another option is to put all the text you'd like to escape inside of an interpolation:
```make
```just
braces:
echo '{{'I {{LOVE}} curly braces!'}}'
```
Yet another option is to use `{{ "{{" }}`:
```make
```just
braces:
echo 'I {{ "{{" }}LOVE}} curly braces!'
```
@ -971,7 +971,7 @@ braces:
Double-quoted strings support escape sequences:
```make
```just
string-with-tab := "\t"
string-with-newline := "\n"
string-with-carriage-return := "\r"
@ -994,7 +994,7 @@ string-with-tab := " "
Strings may contain line breaks:
```make
```just
single := '
hello
'
@ -1006,7 +1006,7 @@ goodbye
Single-quoted strings do not recognize escape sequences:
```make
```just
escapes := '\t\n\r\"\\'
```
@ -1017,7 +1017,7 @@ escapes := "\t\n\r\"\\"
Indented versions of both single- and double-quoted strings, delimited by triple single- or triple double-quotes, are supported. Indented string lines are stripped of leading whitespace common to all non-blank lines:
```make
```just
# this string will evaluate to `foo\nbar\n`
x := '''
foo
@ -1038,7 +1038,7 @@ Similar to unindented strings, indented double-quoted strings process escape seq
Normally, if a command returns a non-zero exit status, execution will stop. To continue execution after a command, even if it fails, prefix the command with `-`:
```make
```just
foo:
-cat foo
echo 'Done!'
@ -1064,7 +1064,7 @@ Done!
For example:
```make
```just
system-info:
@echo "This is an {{arch()}} machine".
```
@ -1080,7 +1080,7 @@ The `os_family()` function can be used to create cross-platform `justfile`s that
- `env_var(key)` — Retrieves the environment variable with name `key`, aborting if it is not present.
```make
```just
home_dir := env_var('HOME')
test:
@ -1100,14 +1100,14 @@ $ just
For example, to call `rustfmt` on files just under the "current directory" (from the user/invoker's perspective), use the following rule:
```make
```just
rustfmt:
find {{invocation_directory()}} -name \*.rs -exec rustfmt {} \;
```
Alternatively, if your command needs to be run from the current directory, you could use (e.g.):
```make
```just
build:
cd {{invocation_directory()}}; ./some_script_that_needs_to_be_run_from_here
```
@ -1120,7 +1120,7 @@ build:
For example, to run a command relative to the location of the current `justfile`:
```make
```just
script:
./{{justfile_directory()}}/scripts/some_script
```
@ -1131,7 +1131,7 @@ script:
For example:
```make
```just
executable:
@echo The executable is at: {{just_executable()}}
```
@ -1225,7 +1225,7 @@ which operating system they run on. The `run` recipe in this `justfile` will
compile and run `main.c`, using a different C compiler and using the correct
output binary name for that compiler depending on the operating system:
```make
```just
[unix]
run:
cc main.c
@ -1247,7 +1247,7 @@ directory.
For exmaple, this `commit` recipe:
```make
```just
[no-cd]
commit file:
git add {{file}}
@ -1262,7 +1262,7 @@ Can be used with paths that are relative to the current directory, because
Backticks can be used to store the result of commands:
```make
```just
localhost := `dumpinterfaces | cut -d: -f2 | sed 's/\/.*//' | sed 's/ //g'`
serve:
@ -1271,7 +1271,7 @@ serve:
Indented backticks, delimited by three backticks, are de-indented in the same manner as indented strings:
````make
````just
# This backtick evaluates the command `echo foo\necho bar\n`, which produces the value `foo\nbar\n`.
stuff := ```
echo foo
@ -1287,7 +1287,7 @@ Backticks may not start with `#!`. This syntax is reserved for a future upgrade.
`if`/`else` expressions evaluate different branches depending on if two expressions evaluate to the same value:
```make
```just
foo := if "2" == "2" { "Good!" } else { "1984" }
bar:
@ -1301,7 +1301,7 @@ Good!
It is also possible to test for inequality:
```make
```just
foo := if "hello" != "goodbye" { "xyz" } else { "abc" }
bar:
@ -1315,7 +1315,7 @@ xyz
And match against regular expressions:
```make
```just
foo := if "hello" =~ 'hel+o' { "match" } else { "mismatch" }
bar:
@ -1331,13 +1331,13 @@ Regular expressions are provided by the [regex crate](https://github.com/rust-la
Conditional expressions short-circuit, which means they only evaluate one of their branches. This can be used to make sure that backtick expressions don't run when they shouldn't.
```make
```just
foo := if env_var("RELEASE") == "true" { `get-something-from-release-database` } else { "dummy-value" }
```
Conditionals can be used inside of recipes:
```make
```just
bar foo:
echo {{ if foo == "bar" { "hello" } else { "goodbye" } }}
```
@ -1346,7 +1346,7 @@ Note the space after the final `}`! Without the space, the interpolation will be
Multiple conditionals can be chained:
```make
```just
foo := if "hello" == "goodbye" {
"xyz"
} else if "a" == "a" {
@ -1368,7 +1368,7 @@ abc
Execution can be halted with the `error` function. For example:
```
```just
foo := if "hello" == "goodbye" {
"xyz"
} else if "a" == "b" {
@ -1390,7 +1390,7 @@ error: Call to function `error` failed: 123
Variables can be overridden from the command line.
```make
```just
os := "linux"
test: build
@ -1428,7 +1428,7 @@ $ just --set os bsd
Assignments prefixed with the `export` keyword will be exported to recipes as environment variables:
```make
```just
export RUST_BACKTRACE := "1"
test:
@ -1438,7 +1438,7 @@ test:
Parameters prefixed with a `$` will be exported as environment variables:
```make
```just
test $RUST_BACKTRACE="1":
# will print a stack trace if it crashes
cargo test
@ -1446,13 +1446,13 @@ test $RUST_BACKTRACE="1":
Exported variables and parameters are not exported to backticks in the same scope.
```make
```just
export WORLD := "world"
# This backtick will fail with "WORLD: unbound variable"
BAR := `echo hello $WORLD`
```
```make
```just
# Running `just a foo` will fail with "A: unbound variable"
a $A $B=`echo $A`:
echo $A $B
@ -1464,7 +1464,7 @@ When [export](#export) is set, all `just` variables are exported as environment
Environment variables from the environment are passed automatically to the recipes.
```make
```just
print_home_folder:
echo "HOME is: '${HOME}'"
```
@ -1486,7 +1486,7 @@ See [environment-variables](#environment-variables).
Recipes may have parameters. Here recipe `build` has a parameter called `target`:
```make
```just
build target:
@echo 'Building {{target}}…'
cd {{target}} && make
@ -1502,7 +1502,7 @@ cd my-awesome-project && make
To pass arguments to a dependency, put the dependency in parentheses along with the arguments:
```make
```just
default: (build "main")
build target:
@ -1512,7 +1512,7 @@ build target:
Variables can also be passed as arguments to dependencies:
```make
```just
target := "main"
_build version:
@ -1524,7 +1524,7 @@ build: (_build target)
A command's arguments can be passed to dependency by putting the dependency in parentheses along with the arguments:
```make
```just
build target:
@echo "Building {{target}}…"
@ -1534,7 +1534,7 @@ push target: (build target)
Parameters may have default values:
```make
```just
default := 'all'
test target tests=default:
@ -1560,7 +1560,7 @@ Testing server:unit…
Default values may be arbitrary expressions, but concatenations or path joins must be parenthesized:
```make
```just
arch := "wasm"
test triple=(arch + "-unknown-unknown") input=(arch / "input.dat"):
@ -1569,7 +1569,7 @@ test triple=(arch + "-unknown-unknown") input=(arch / "input.dat"):
The last parameter of a recipe may be variadic, indicated with either a `+` or a `*` before the argument name:
```make
```just
backup +FILES:
scp {{FILES}} me@server.com:
```
@ -1585,21 +1585,21 @@ GRAMMAR.md 100% 1666 1.6KB/s 00:00
Variadic parameters prefixed with `*` accept _zero or more_ arguments and expand to a string containing those arguments separated by spaces, or an empty string if no arguments are present:
```make
```just
commit MESSAGE *FLAGS:
git commit {{FLAGS}} -m "{{MESSAGE}}"
```
Variadic parameters can be assigned default values. These are overridden by arguments passed on the command line:
```make
```just
test +FLAGS='-q':
cargo test {{FLAGS}}
```
`{{…}}` substitutions may need to be quoted if they contain spaces. For example, if you have the following recipe:
```make
```just
search QUERY:
lynx https://www.google.com/?q={{QUERY}}
```
@ -1614,14 +1614,14 @@ $ just search "cat toupee"
You can fix this by adding quotes:
```make
```just
search QUERY:
lynx 'https://www.google.com/?q={{QUERY}}'
```
Parameters prefixed with a `$` will be exported as environment variables:
```make
```just
foo $bar:
echo $bar
```
@ -1632,7 +1632,7 @@ Normal dependencies of a recipes always run before a recipe starts. That is to s
A recipe can also have subsequent dependencies, which run after the recipe and are introduced with an `&&`:
```make
```just
a:
echo 'A!'
@ -1664,7 +1664,7 @@ D!
`just` doesn't support running recipes in the middle of another recipe, but you can call `just` recursively in the middle of a recipe. Given the following `justfile`:
```make
```just
a:
echo 'A!'
@ -1699,7 +1699,7 @@ Recipes that start with `#!` are called shebang recipes, and are executed by
saving the recipe body to a file and running it. This lets you write recipes in
different languages:
```make
```just
polyglot: python js perl sh ruby
python:
@ -1756,7 +1756,7 @@ the final argument.
If you're writing a `bash` shebang recipe, consider adding `set -euxo pipefail`:
```make
```just
foo:
#!/usr/bin/env bash
set -euxo pipefail
@ -1782,7 +1782,7 @@ On Windows, shebang interpreter paths containing a `/` are translated from Unix-
For example, to execute this recipe on Windows:
```make
```just
echo:
#!/bin/sh
echo "Hello!"
@ -1804,7 +1804,7 @@ foo:
It is possible to use shell variables, but there's another problem. Every recipe line is run by a new shell instance, so variables set in one line won't be set in the next:
```make
```just
foo:
x=hello && echo $x # This works!
y=bye
@ -1813,7 +1813,7 @@ foo:
The best way to work around this is to use a shebang recipe. Shebang recipe bodies are extracted and run as scripts, so a single shell instance will run the whole thing:
```make
```just
foo:
#!/usr/bin/env bash
set -euxo pipefail
@ -1829,7 +1829,7 @@ Each line of each recipe is executed by a fresh shell, so it is not possible to
Some tools, like [Python's venv](https://docs.python.org/3/library/venv.html), require loading environment variables in order to work, making them challenging to use with `just`. As a workaround, you can execute the virtual environment binaries directly:
```make
```just
venv:
[ -d foo ] || python3 -m venv foo
@ -1841,7 +1841,7 @@ run: venv
Each recipe line is executed by a new shell, so if you change the working directory on one line, it won't have an effect on later lines:
```make
```just
foo:
pwd # This `pwd` will print the same directory…
cd bar
@ -1850,14 +1850,14 @@ foo:
There are a couple ways around this. One is to call `cd` on the same line as the command you want to run:
```make
```just
foo:
cd bar && pwd
```
The other is to use a shebang recipe. Shebang recipe bodies are extracted and run as scripts, so a single shell instance will run the whole thing, and thus a `pwd` on one line will affect later lines, just like a shell script:
```make
```just
foo:
#!/usr/bin/env bash
set -euxo pipefail
@ -1896,19 +1896,19 @@ To work around this, you can write conditionals on one line, escape newlines wit
#### `if` statements
```make
```just
conditional:
if true; then echo 'True!'; fi
```
```make
```just
conditional:
if true; then \
echo 'True!'; \
fi
```
```make
```just
conditional:
#!/usr/bin/env sh
if true; then
@ -1918,19 +1918,19 @@ conditional:
#### `for` loops
```make
```just
for:
for file in `ls .`; do echo $file; done
```
```make
```just
for:
for file in `ls .`; do \
echo $file; \
done
```
```make
```just
for:
#!/usr/bin/env sh
for file in `ls .`; do
@ -1940,19 +1940,19 @@ for:
#### `while` loops
```make
```just
while:
while `server-is-dead`; do ping -c 1 server; done
```
```make
```just
while:
while `server-is-dead`; do \
ping -c 1 server; \
done
```
```make
```just
while:
#!/usr/bin/env sh
while `server-is-dead`; do
@ -1986,7 +1986,7 @@ Run `just --help` to see all the options.
Recipes and aliases whose name starts with a `_` are omitted from `just --list`:
```make
```just
test: _test-helper
./bin/test
@ -2009,7 +2009,7 @@ test
The `[private]` attribute<sup>master</sup> may also be used to hide recipes without needing to change the name:
```make
```just
[private]
foo:
@ -2028,7 +2028,7 @@ This is useful for helper recipes which are only meant to be used as dependencie
A recipe name may be prefixed with `@` to invert the meaning of `@` before each line:
```make
```just
@quiet:
echo hello
echo goodbye
@ -2046,7 +2046,7 @@ goodbye
Shebang recipes are quiet by default:
```make
```just
foo:
#!/usr/bin/env bash
echo 'Foo!'
@ -2059,7 +2059,7 @@ Foo!
Adding `@` to a shebang recipe name makes `just` print the recipe before executing it:
```make
```just
@bar:
#!/usr/bin/env bash
echo 'Bar!'
@ -2076,7 +2076,7 @@ Bar!
messages can be suppressed using the `[no-exit-message]` attribute. You may find
this especially useful with a recipe that recipe wraps a tool:
```make
```just
git *args:
@git {{args}}
```
@ -2090,7 +2090,7 @@ error: Recipe `git` failed on line 2 with exit code 128
Add the attribute to suppress the exit error message when the tool exits with a
non-zero code:
```make
```just
[no-exit-message]
git *args:
@git {{args}}
@ -2115,7 +2115,7 @@ The chooser is invoked in the same way as recipe lines. For example, if the choo
If you'd like `just` to default to selecting recipes with a chooser, you can use this as your default recipe:
```make
```just
default:
@just --choose
```
@ -2167,7 +2167,7 @@ With the above shebang, `just` will change its working directory to the location
Note: Shebang line splitting is not consistent across operating systems. The previous examples have only been tested on macOS. On Linux, you may need to pass the `-S` flag to `env`:
```make
```just
#!/usr/bin/env -S just --justfile
default:
@ -2190,7 +2190,7 @@ This feature is currently unstable, and so must be enabled with the
As an example, suppose the current directory contains this `justfile`:
```make
```just
set fallback
foo:
echo foo
@ -2198,7 +2198,7 @@ foo:
And the parent directory contains this `justfile`:
```make
```just
bar:
echo bar
```
@ -2214,7 +2214,7 @@ bar
Given this `justfile`:
```make
```just
foo argument:
touch {{argument}}
```
@ -2233,7 +2233,7 @@ There are a few ways to avoid this: quoting, positional arguments, and exported
Quotes can be added around the `{{argument}}` interpolation:
```make
```just
foo argument:
touch '{{argument}}'
```
@ -2244,7 +2244,7 @@ This preserves `just`'s ability to catch variable name typos before running, for
The `positional-arguments` setting causes all arguments to be passed as positional arguments, allowing them to be accessed with `$1`, `$2`, …, and `$@`, which can be then double-quoted to avoid further splitting by the shell:
```make
```just
set positional-arguments
foo argument:
@ -2257,7 +2257,7 @@ This defeats `just`'s ability to catch typos, for example if you type `$2`, but
All arguments are exported when the `export` setting is set:
```make
```just
set export
foo argument:
@ -2266,7 +2266,7 @@ foo argument:
Or individual arguments may be exported by prefixing them with `$`:
```make
```just
foo $argument:
touch "$argument"
```
@ -2389,7 +2389,7 @@ alias .j='just --justfile ~/.user.justfile --working-directory ~'
The following export statement gives `just` recipes access to local Node module binaries, and makes `just` recipe commands behave more like `script` entries in Node.js `package.json` files:
```make
```just
export PATH := "./node_modules/.bin:" + env_var('PATH')
```
@ -2449,7 +2449,7 @@ Frequently Asked Questions
One example is that under some circumstances, `make` won't actually run the commands in a recipe. For example, if you have a file called `test` and the following makefile:
```make
```just
test:
./test
```

View File

@ -77,7 +77,7 @@ Yay, all your tests passed!
比如 PowerShell
```make
```just
# 使用 PowerShell 替代 sh:
set shell := ["powershell.exe", "-c"]
@ -87,7 +87,7 @@ hello:
…或者 `cmd.exe`:
```make
```just
# 使用 cmd.exe 替代 sh:
set shell := ["cmd.exe", "/c"]
@ -413,7 +413,7 @@ Kakoune 已经内置支持 `justfile` 语法高亮,这要感谢 TeddyDD。
一旦 `just` 安装完毕并开始工作,在你的项目根目录创建一个名为 `justfile` 的文件,内容如下:
```make
```just
recipe-name:
echo 'This is a recipe!'
@ -445,7 +445,7 @@ This is another recipe.
如果一个命令失败,配方就会停止运行。这里 `cargo publish` 只有在 `cargo test` 成功后才会运行:
```make
```just
publish:
cargo test
# 前面的测试通过才会执行 publish!
@ -454,7 +454,7 @@ publish:
配方可以依赖其他配方。在这里,`test` 配方依赖于 `build` 配方,所以 `build` 将在 `test` 之前运行:
```make
```just
build:
cc main.c foo.c bar.c -o main
@ -501,14 +501,14 @@ testing… all tests passed!
`just` 被调用而没有传入任何配方时,它会运行 `justfile` 中的第一个配方。这个配方可能是项目中最常运行的命令,比如运行测试:
```make
```just
test:
cargo test
```
你也可以使用依赖关系来默认运行多个配方:
```make
```just
default: lint build test
build:
@ -523,7 +523,7 @@ lint:
在没有合适配方作为默认配方的情况下,你也可以在 `justfile` 的开头添加一个配方,用于列出可用的配方:
```make
```just
default:
just --list
```
@ -550,7 +550,7 @@ build test deploy lint
传入 `--unsorted` 选项可以按照它们在 `justfile` 中出现的顺序打印配方:
```make
```just
test:
echo 'Testing!'
@ -572,7 +572,7 @@ test build
如果你想让 `just` 默认列出 `justfile` 中的配方,你可以使用这个作为默认配方:
```make
```just
default:
@just --list
```
@ -609,7 +609,7 @@ $ just --list --list-heading ''
别名允许你用其他名称来调用配方:
```make
```just
alias b := build
build:
@ -629,7 +629,7 @@ Building!
例如:
```make
```just
set shell := ["zsh", "-cu"]
foo:
@ -654,13 +654,13 @@ foo:
Bool 类型设置可以写成:
```mf
```just
set NAME
```
这就相当于:
```mf
```just
set NAME := true
```
@ -668,7 +668,7 @@ set NAME := true
如果 `allow-duplicate-recipes` 被设置为 `true`,那么定义多个同名的配方就不会出错,而会使用最后的定义。默认为 `false`
```make
```just
set allow-duplicate-recipes
@foo:
@ -691,7 +691,7 @@ bar
`export` 设置使所有 `just` 变量作为环境变量被导出。默认值为 `false`
```make
```just
set export
a := "hello"
@ -713,7 +713,7 @@ goodbye
例如,运行这个配方:
```make
```just
set positional-arguments
@foo bar:
@ -733,7 +733,7 @@ hello
这个例子的配方将逐行打印参数:
```make
```just
set positional-arguments
@test *args='':
@ -752,7 +752,7 @@ $ just test foo "bar baz"
`shell` 设置控制用于调用执行配方代码行和反引号内指令的命令。Shebang 配方不受影响。
```make
```just
# use python3 to execute recipe lines and backticks
set shell := ["python3", "-c"]
@ -770,7 +770,7 @@ foo:
`just` 在 Windows 上默认使用 `sh`。要在 Windows 上使用不同的 Shell请使用`windows-shell`
```make
```just
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
hello:
@ -785,7 +785,7 @@ hello:
`just` 在 Windows 上默认使用 `sh`。要使用 `powershell.exe` 作为替代,请将 `windows-powershell` 设置为 `true`
```make
```just
set windows-powershell := true
hello:
@ -794,37 +794,37 @@ hello:
##### Python 3
```make
```just
set shell := ["python3", "-c"]
```
##### Bash
```make
```just
set shell := ["bash", "-uc"]
```
##### Z Shell
```make
```just
set shell := ["zsh", "-uc"]
```
##### Fish
```make
```just
set shell := ["fish", "-c"]
```
##### Nushell
```make
```just
set shell := ["nu", "-c"]
```
如果你想设置默认的表格显示模式为 `light`:
```make
```just
set shell := ['nu', '-m', 'light', '-c']
```
@ -834,7 +834,7 @@ set shell := ['nu', '-m', 'light', '-c']
紧接着配方前面的注释将出现在 `just --list` 中:
```make
```just
# build stuff
build:
./bin/build
@ -865,7 +865,7 @@ SERVER_PORT=1337
而你的 `justfile` 包含:
```make
```just
set dotenv-load
serve:
@ -885,7 +885,7 @@ Starting server with database localhost:6379 on port 1337…
支持在变量、字符串、拼接、路径连接和替换中使用 `{{…}}`
```make
```just
tmpdir := `mktemp`
version := "0.2.7"
tardir := tmpdir / "awesomesauce-" + version
@ -904,7 +904,7 @@ publish:
`/` 操作符可用于通过斜线连接两个字符串:
```make
```just
foo := "a" / "b"
```
@ -915,7 +915,7 @@ a/b
请注意,即使已经有一个 `/`,也会添加一个 `/`
```make
```just
foo := "a/"
bar := foo / "b"
```
@ -927,7 +927,7 @@ a//b
也可以构建绝对路径<sup>1.5.0</sup>:
```make
```just
foo := / "b"
```
@ -942,7 +942,7 @@ $ just --evaluate foo
想要写一个包含 `{{` 的配方,可以使用 `{{{{`
```make
```just
braces:
echo 'I {{{{LOVE}} curly braces!'
```
@ -951,14 +951,14 @@ braces:
另一个选择是把所有你想转义的文本都放在插值里面:
```make
```just
braces:
echo '{{'I {{LOVE}} curly braces!'}}'
```
然而,另一个选择是使用 `{{ "{{" }}`
```make
```just
braces:
echo 'I {{ "{{" }}LOVE}} curly braces!'
```
@ -967,7 +967,7 @@ braces:
双引号字符串支持转义序列:
```make
```just
string-with-tab := "\t"
string-with-newline := "\n"
string-with-carriage-return := "\r"
@ -990,7 +990,7 @@ string-with-tab := " "
字符串可以包含换行符:
```make
```just
single := '
hello
'
@ -1002,7 +1002,7 @@ goodbye
单引号字符串不支持转义序列:
```make
```just
escapes := '\t\n\r\"\\'
```
@ -1013,7 +1013,7 @@ escapes := "\t\n\r\"\\"
支持单引号和双引号字符串的缩进版本,以三个单引号或三个双引号为界。缩进的字符串行被删除了所有非空行所共有的前导空白:
```make
```just
# 这个字符串执行结果为 `foo\nbar\n`
x := '''
foo
@ -1034,7 +1034,7 @@ y := """
通常情况下,如果一个命令返回一个非零的退出状态,将停止执行。要想在一个命令之后继续执行,即使它失败了,需要在命令前加上 `-`
```make
```just
foo:
-cat foo
echo 'Done!'
@ -1060,7 +1060,7 @@ Done!
例如:
```make
```just
system-info:
@echo "This is an {{arch()}} machine".
```
@ -1076,7 +1076,7 @@ This is an x86_64 machine
- `env_var(key)` — 获取名称为 `key` 的环境变量,如果不存在则终止。
```make
```just
home_dir := env_var('HOME')
test:
@ -1096,14 +1096,14 @@ $ just
例如,要对 "当前目录" 下的文件调用 `rustfmt`(从用户/调用者的角度看),使用以下规则:
```make
```just
rustfmt:
find {{invocation_directory()}} -name \*.rs -exec rustfmt {} \;
```
另外,如果你的命令需要从当前目录运行,你可以使用如下方式:
```make
```just
build:
cd {{invocation_directory()}}; ./some_script_that_needs_to_be_run_from_here
```
@ -1116,7 +1116,7 @@ build:
例如,运行一个相对于当前 `justfile` 位置的命令:
```make
```just
script:
./{{justfile_directory()}}/scripts/some_script
```
@ -1127,7 +1127,7 @@ script:
例如:
```make
```just
executable:
@echo The executable is at: {{just_executable()}}
```
@ -1214,7 +1214,7 @@ The executable is at: /bin/just
这可以用来编写因运行的操作系统不同,其行为也不同的 `justfile`。以下 `justfile` 中的 `run` 配方将编译和运行 `main.c`并且根据操作系统的不同而使用不同的C编译器同时使用正确的二进制产物名称
```make
```just
[unix]
run:
cc main.c
@ -1232,7 +1232,7 @@ run:
例如这个 `commit` 配方:
```make
```just
[no-cd]
commit file:
git add {{file}}
@ -1245,7 +1245,7 @@ commit file:
反引号可以用来存储命令的求值结果:
```make
```just
localhost := `dumpinterfaces | cut -d: -f2 | sed 's/\/.*//' | sed 's/ //g'`
serve:
@ -1254,7 +1254,7 @@ serve:
缩进的反引号,以三个反引号为界,与字符串缩进的方式一样,会被去掉缩进:
````make
````just
# This backtick evaluates the command `echo foo\necho bar\n`, which produces the value `foo\nbar\n`.
stuff := ```
echo foo
@ -1270,7 +1270,7 @@ stuff := ```
`if` / `else` 表达式评估不同的分支,取决于两个表达式是否评估为相同的值:
```make
```just
foo := if "2" == "2" { "Good!" } else { "1984" }
bar:
@ -1284,7 +1284,7 @@ Good!
也可以用于测试不相等:
```make
```just
foo := if "hello" != "goodbye" { "xyz" } else { "abc" }
bar:
@ -1298,7 +1298,7 @@ xyz
还支持与正则表达式进行匹配:
```make
```just
foo := if "hello" =~ 'hel+o' { "match" } else { "mismatch" }
bar:
@ -1314,13 +1314,13 @@ match
条件表达式是短路的,这意味着它们只评估其中的一个分支。这可以用来确保反引号内的表达式在不应该运行的时候不会运行。
```make
```just
foo := if env_var("RELEASE") == "true" { `get-something-from-release-database` } else { "dummy-value" }
```
条件语句也可以在配方中使用:
```make
```just
bar foo:
echo {{ if foo == "bar" { "hello" } else { "goodbye" } }}
```
@ -1329,7 +1329,7 @@ bar foo:
多个条件语句可以被连起来:
```make
```just
foo := if "hello" == "goodbye" {
"xyz"
} else if "a" == "a" {
@ -1351,7 +1351,7 @@ abc
可以用 `error` 函数停止执行。比如:
```
```just
foo := if "hello" == "goodbye" {
"xyz"
} else if "a" == "b" {
@ -1373,7 +1373,7 @@ error: Call to function `error` failed: 123
变量可以从命令行进行覆盖。
```make
```just
os := "linux"
test: build
@ -1411,7 +1411,7 @@ $ just --set os bsd
`export` 关键字为前缀的赋值将作为环境变量导出到配方中:
```make
```just
export RUST_BACKTRACE := "1"
test:
@ -1421,7 +1421,7 @@ test:
`$` 为前缀的参数将被作为环境变量导出:
```make
```just
test $RUST_BACKTRACE="1":
# 如果它崩溃了,将打印一个堆栈追踪
cargo test
@ -1429,13 +1429,13 @@ test $RUST_BACKTRACE="1":
导出的变量和参数不会被导出到同一作用域内反引号包裹的表达式里。
```make
```just
export WORLD := "world"
# This backtick will fail with "WORLD: unbound variable"
BAR := `echo hello $WORLD`
```
```make
```just
# Running `just a foo` will fail with "A: unbound variable"
a $A $B=`echo $A`:
echo $A $B
@ -1447,7 +1447,7 @@ a $A $B=`echo $A`:
来自环境的环境变量会自动传递给配方:
```make
```just
print_home_folder:
echo "HOME is: '${HOME}'"
```
@ -1470,7 +1470,7 @@ HOME is '/home/myuser'
配方可以有参数。这里的配方 `build` 有一个参数叫 `target`:
```make
```just
build target:
@echo 'Building {{target}}…'
cd {{target}} && make
@ -1486,7 +1486,7 @@ cd my-awesome-project && make
要向依赖配方传递参数,请将依赖配方和参数一起放在括号里:
```make
```just
default: (build "main")
build target:
@ -1496,7 +1496,7 @@ build target:
变量也可以作为参数传递给依赖:
```make
```just
target := "main"
_build version:
@ -1508,7 +1508,7 @@ build: (_build target)
命令的参数可以通过将依赖与参数一起放在括号中的方式传递给依赖:
```make
```just
build target:
@echo "Building {{target}}…"
@ -1518,7 +1518,7 @@ push target: (build target)
参数可以有默认值:
```make
```just
default := 'all'
test target tests=default:
@ -1544,7 +1544,7 @@ Testing server:unit…
默认值可以是任意的表达式,但字符串或路径拼接必须放在括号内:
```make
```just
arch := "wasm"
test triple=(arch + "-unknown-unknown") input=(arch / "input.dat"):
@ -1553,7 +1553,7 @@ test triple=(arch + "-unknown-unknown") input=(arch / "input.dat"):
配方的最后一个参数可以是变长的,在参数名称前用 `+``*` 表示:
```make
```just
backup +FILES:
scp {{FILES}} me@server.com:
```
@ -1569,21 +1569,21 @@ GRAMMAR.md 100% 1666 1.6KB/s 00:00
`*` 为前缀的变长参数接受 _0个或更多_ 参数,并展开为一个包含这些参数的字符串,以空格分隔,如果没有参数,则为空字符串:
```make
```just
commit MESSAGE *FLAGS:
git commit {{FLAGS}} -m "{{MESSAGE}}"
```
变长参数可以被分配默认值。这些参数被命令行上传递的参数所覆盖:
```make
```just
test +FLAGS='-q':
cargo test {{FLAGS}}
```
`{{…}}` 的替换可能需要加引号,如果它们包含空格。例如,如果你有以下配方:
```make
```just
search QUERY:
lynx https://www.google.com/?q={{QUERY}}
```
@ -1598,14 +1598,14 @@ $ just search "cat toupee"
你可以通过添加引号来解决这个问题:
```make
```just
search QUERY:
lynx 'https://www.google.com/?q={{QUERY}}'
```
`$` 为前缀的参数将被作为环境变量导出:
```make
```just
foo $bar:
echo $bar
```
@ -1616,7 +1616,7 @@ foo $bar:
一个配方也可以有后续的依赖,它们在配方之后运行,用 `&&` 表示:
```make
```just
a:
echo 'A!'
@ -1648,7 +1648,7 @@ D!
`just` 不支持在配方的中间运行另一个配方,但你可以在一个配方的中间递归调用 `just`。例如以下 `justfile`
```make
```just
a:
echo 'A!'
@ -1681,7 +1681,7 @@ B end!
`#!` 开头的配方被称为 Shebang 配方,它通过将配方主体保存到文件中并运行它来执行。这让你可以用不同的语言来编写配方:
```make
```just
polyglot: python js perl sh ruby
python:
@ -1728,7 +1728,7 @@ Windows 不支持 Shebang 行。在 Windows 上,`just` 将 Shebang 行分割
如果你正在写一个 `bash` Shebang 配方,考虑加入 `set -euxo pipefail`
```make
```just
foo:
#!/usr/bin/env bash
set -euxo pipefail
@ -1754,7 +1754,7 @@ foo:
例如,要在 Windows 上执行这个配方:
```make
```just
echo:
#!/bin/sh
echo "Hello!"
@ -1776,7 +1776,7 @@ foo:
使用 Shell 变量是可能的,但还有一个问题:每一行配方都由一个新的 Shell 实例运行,所以在一行中设置的变量不会在下一行中生效:
```make
```just
foo:
x=hello && echo $x # 这个没问题!
y=bye
@ -1785,7 +1785,7 @@ foo:
解决这个问题的最好方法是使用 Shebang 配方。Shebang 配方体被提取出来并作为脚本运行,所以一个 Shell 实例就可以运行整个配方体:
```make
```just
foo:
#!/usr/bin/env bash
set -euxo pipefail
@ -1801,7 +1801,7 @@ foo:
一些工具,像 [Python 的 venv](https://docs.python.org/3/library/venv.html),需要加载环境变量才能工作,这使得它们在使用 `just` 时具有挑战性。作为一种变通方法,你可以直接执行虚拟环境二进制文件:
```make
```just
venv:
[ -d foo ] || python3 -m venv foo
@ -1813,7 +1813,7 @@ run: venv
每一行配方都由一个新的 Shell 执行,所以如果你在某一行改变了工作目录,对后面的行不会有影响:
```make
```just
foo:
pwd # This `pwd` will print the same directory…
cd bar
@ -1822,14 +1822,14 @@ foo:
有几个方法可以解决这个问题。一个是在你想运行的命令的同一行调用 `cd`
```make
```just
foo:
cd bar && pwd
```
另一种方法是使用 Shebang 配方。Shebang 配方体被提取并作为脚本运行,因此一个 Shell 实例将运行整个配方体,所以一行的 `pwd` 改变将影响后面的行,就像一个 Shell 脚本:
```make
```just
foo:
#!/usr/bin/env bash
set -euxo pipefail
@ -1868,19 +1868,19 @@ error: Recipe line has extra leading whitespace
#### `if` 语句
```make
```just
conditional:
if true; then echo 'True!'; fi
```
```make
```just
conditional:
if true; then \
echo 'True!'; \
fi
```
```make
```just
conditional:
#!/usr/bin/env sh
if true; then
@ -1890,19 +1890,19 @@ conditional:
#### `for` 循环
```make
```just
for:
for file in `ls .`; do echo $file; done
```
```make
```just
for:
for file in `ls .`; do \
echo $file; \
done
```
```make
```just
for:
#!/usr/bin/env sh
for file in `ls .`; do
@ -1912,19 +1912,19 @@ for:
#### `while` 循环
```make
```just
while:
while `server-is-dead`; do ping -c 1 server; done
```
```make
```just
while:
while `server-is-dead`; do \
ping -c 1 server; \
done
```
```make
```just
while:
#!/usr/bin/env sh
while `server-is-dead`; do
@ -1958,7 +1958,7 @@ polyglot: python js perl sh ruby
名字以 `_` 开头的配方和别名将在 `just --list` 中被忽略:
```make
```just
test: _test-helper
./bin/test
@ -1981,7 +1981,7 @@ test
`[private]` 属性<sup>master</sup>也可用于隐藏配方,而不需要改变名称:
```make
```just
[private]
foo:
@ -2000,7 +2000,7 @@ Available recipes:
配方名称可在前面加上 `@`,可以在每行反转行首 `@` 的含义:
```make
```just
@quiet:
echo hello
echo goodbye
@ -2018,7 +2018,7 @@ goodbye
Shebang 配方默认是安静的:
```make
```just
foo:
#!/usr/bin/env bash
echo 'Foo!'
@ -2031,7 +2031,7 @@ Foo!
在 Shebang 配方名称前面添加 `@`,使 `just` 在执行配方前打印该配方:
```make
```just
@bar:
#!/usr/bin/env bash
echo 'Bar!'
@ -2046,7 +2046,7 @@ Bar!
`just` 在配方行失败时通常会打印错误信息,这些错误信息可以通过 `[no-exit-message]` 属性来抑制。你可能会发现这在包装工具的配方中特别有用:
```make
```just
git *args:
@git {{args}}
```
@ -2059,7 +2059,7 @@ error: Recipe `git` failed on line 2 with exit code 128
添加属性,当工具以非零代码退出时抑制退出错误信息:
```make
```just
[no-exit-message]
git *args:
@git {{args}}
@ -2084,7 +2084,7 @@ fatal: not a git repository (or any of the parent directories): .git
如果你希望 `just` 默认用选择器来选择配方,你可以用这个作为你的默认配方:
```make
```just
default:
@just --choose
```
@ -2136,7 +2136,7 @@ foo
注意Shebang 的行分隔在不同的操作系统中并不一致。前面的例子只在 macOS 上进行了测试。在 Linux 上,你可能需要向 `env` 传递 `-S` 标志:
```make
```just
#!/usr/bin/env -S just --justfile
default:
@ -2155,7 +2155,7 @@ default:
举个例子,假设当前目录包含这个 `justfile`
```make
```just
set fallback
foo:
echo foo
@ -2163,7 +2163,7 @@ foo:
而父目录包含这个 `justfile`
```make
```just
bar:
echo bar
```
@ -2179,7 +2179,7 @@ bar
考虑这个 `justfile`:
```make
```just
foo argument:
touch {{argument}}
```
@ -2198,7 +2198,7 @@ $ just foo "some argument.txt"
可以在 `{{argument}}` 的周围加上引号,进行插值:
```make
```just
foo argument:
touch '{{argument}}'
```
@ -2209,7 +2209,7 @@ foo argument:
设置 `positional-arguments` 使所有参数作为位置参数传递,允许用 `$1`, `$2`, …, 和 `$@` 访问这些参数,然后可以用双引号避免被 Shell 进一步分割:
```make
```just
set positional-arguments
foo argument:
@ -2222,7 +2222,7 @@ foo argument:
当设置 `export` 时,所有参数都被导出:
```make
```just
set export
foo argument:
@ -2231,7 +2231,7 @@ foo argument:
或者可以通过在参数前加上 `$` 来导出单个参数:
```make
```just
foo $argument:
touch "$argument"
```
@ -2354,7 +2354,7 @@ alias .j='just --justfile ~/.user.justfile --working-directory ~'
下面的导出语句使 `just` 配方能够访问本地 Node 模块二进制文件,并使 `just` 配方命令的行为更像 Node.js `package.json` 文件中的 `script` 条目:
```make
```just
export PATH := "./node_modules/.bin:" + env_var('PATH')
```
@ -2414,7 +2414,7 @@ Release x.y.z
一个例子是,在某些情况下,`make` 不会实际运行配方中的命令。例如,如果你有一个名为 `test` 的文件和以下 makefile
```make
```just
test:
./test
```

View File

@ -15,7 +15,7 @@ fn readme() {
justfile += "\n";
current = Some(justfile);
}
} else if line == "```make" {
} else if line == "```just" {
current = Some(String::new());
}
}