Use just
in readme codeblocks (#1447)
This commit is contained in:
parent
5926300678
commit
1119d226fe
228
README.md
228
README.md
@ -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
|
||||
```
|
||||
|
228
README.中文.md
228
README.中文.md
@ -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
|
||||
```
|
||||
|
@ -15,7 +15,7 @@ fn readme() {
|
||||
justfile += "\n";
|
||||
current = Some(justfile);
|
||||
}
|
||||
} else if line == "```make" {
|
||||
} else if line == "```just" {
|
||||
current = Some(String::new());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user