-
Notifications
You must be signed in to change notification settings - Fork 503
/
README.md
4457 lines (3362 loc) · 116 KB
/
README.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<div align=right>Table of Contents↗️</div>
<h1 align=center><code>just</code></h1>
<div align=center>
<a href=https://crates.io/crates/just>
<img src=https://img.shields.io/crates/v/just.svg alt="crates.io version">
</a>
<a href=https://github.com/casey/just/actions>
<img src=https://github.com/casey/just/actions/workflows/ci.yaml/badge.svg alt="build status">
</a>
<a href=https://github.com/casey/just/releases>
<img src=https://img.shields.io/github/downloads/casey/just/total.svg alt=downloads>
</a>
<a href=https://discord.gg/ezYScXR>
<img src=https://img.shields.io/discord/695580069837406228?logo=discord alt="chat on discord">
</a>
<a href=mailto:[email protected]?subject=Thanks%20for%20Just!>
<img src=https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg alt="say thanks">
</a>
</div>
<br>
`just` is a handy way to save and run project-specific commands.
This readme is also available as a [book](https://just.systems/man/en/). The
book reflects the latest release, whereas the
[readme on GitHub](https://github.com/casey/just/blob/master/README.md)
reflects latest master.
(中文文档在 [这里](https://github.com/casey/just/blob/master/README.中文.md),
快看过来!)
Commands, called recipes, are stored in a file called `justfile` with syntax
inspired by `make`:
![screenshot](https://raw.githubusercontent.com/casey/just/master/screenshot.png)
You can then run them with `just RECIPE`:
```console
$ just test-all
cc *.c -o main
./test --all
Yay, all your tests passed!
```
`just` has a ton of useful features, and many improvements over `make`:
- `just` is a command runner, not a build system, so it avoids much of
[`make`'s complexity and idiosyncrasies](#what-are-the-idiosyncrasies-of-make-that-just-avoids).
No need for `.PHONY` recipes!
- Linux, MacOS, Windows, and other reasonable unices are supported with no
additional dependencies. (Although if your system doesn't have an `sh`,
you'll need to [choose a different shell](#shell).)
- Errors are specific and informative, and syntax errors are reported along
with their source context.
- Recipes can accept [command line arguments](#recipe-parameters).
- Wherever possible, errors are resolved statically. Unknown recipes and
circular dependencies are reported before anything runs.
- `just` [loads `.env` files](#dotenv-settings), making it easy to populate
environment variables.
- Recipes can be [listed from the command line](#listing-available-recipes).
- Command line completion scripts are
[available for most popular shells](#shell-completion-scripts).
- Recipes can be written in
[arbitrary languages](#shebang-recipes), like Python or NodeJS.
- `just` can be invoked from any subdirectory, not just the directory that
contains the `justfile`.
- And [much more](https://just.systems/man/en/)!
If you need help with `just` please feel free to open an issue or ping me on
[Discord](https://discord.gg/ezYScXR). Feature requests and bug reports are
always welcome!
Installation
------------
### Prerequisites
`just` should run on any system with a reasonable `sh`, including Linux, MacOS,
and the BSDs.
On Windows, `just` works with the `sh` provided by
[Git for Windows](https://git-scm.com),
[GitHub Desktop](https://desktop.github.com), or
[Cygwin](http://www.cygwin.com).
If you'd rather not install `sh`, you can use the `shell` setting to use the
shell of your choice.
Like PowerShell:
```just
# use PowerShell instead of sh:
set shell := ["powershell.exe", "-c"]
hello:
Write-Host "Hello, world!"
```
…or `cmd.exe`:
```just
# use cmd.exe instead of sh:
set shell := ["cmd.exe", "/c"]
list:
dir
```
You can also set the shell using command-line arguments. For example, to use
PowerShell, launch `just` with `--shell powershell.exe --shell-arg -c`.
(PowerShell is installed by default on Windows 7 SP1 and Windows Server 2008 R2
S1 and later, and `cmd.exe` is quite fiddly, so PowerShell is recommended for
most Windows users.)
### Packages
#### Cross-platform
<table>
<thead>
<tr>
<th>Package Manager</th>
<th>Package</th>
<th>Command</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href=https://asdf-vm.com>asdf</a></td>
<td><a href=https://github.com/olofvndrhr/asdf-just>just</a></td>
<td>
<code>asdf plugin add just</code><br>
<code>asdf install just <version></code>
</td>
</tr>
<tr>
<td><a href=https://www.rust-lang.org>Cargo</a></td>
<td><a href=https://crates.io/crates/just>just</a></td>
<td><code>cargo install just</code></td>
</tr>
<tr>
<td><a href=https://docs.conda.io/projects/conda/en/latest/index.html>Conda</a></td>
<td><a href=https://anaconda.org/conda-forge/just>just</a></td>
<td><code>conda install -c conda-forge just</code></td>
</tr>
<tr>
<td><a href=https://brew.sh>Homebrew</a></td>
<td><a href=https://formulae.brew.sh/formula/just>just</a></td>
<td><code>brew install just</code></td>
</tr>
<tr>
<td><a href=https://nixos.org/nix/>Nix</a></td>
<td><a href=https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/ju/just/package.nix>just</a></td>
<td><code>nix-env -iA nixpkgs.just</code></td>
</tr>
<tr>
<td><a href=https://www.npmjs.com/>npm</a></td>
<td><a href=https://www.npmjs.com/package/rust-just>rust-just</a></td>
<td><code>npm install -g rust-just</code></td>
</tr>
<tr>
<td><a href=https://pypi.org/>PyPI</a></td>
<td><a href=https://pypi.org/project/rust-just/>rust-just</a></td>
<td><code>pipx install rust-just</code></td>
</tr>
<tr>
<td><a href=https://snapcraft.io>Snap</a></td>
<td><a href=https://snapcraft.io/just>just</a></td>
<td><code>snap install --edge --classic just</code></td>
</tr>
</tbody>
</table>
#### BSD
<table>
<thead>
<tr>
<th>Operating System</th>
<th>Package Manager</th>
<th>Package</th>
<th>Command</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href=https://www.freebsd.org>FreeBSD</a></td>
<td><a href=https://www.freebsd.org/doc/handbook/pkgng-intro.html>pkg</a></td>
<td><a href=https://www.freshports.org/deskutils/just/>just</a></td>
<td><code>pkg install just</code></td>
</tr>
</tbody>
</table>
#### Linux
<table>
<thead>
<tr>
<th>Operating System</th>
<th>Package Manager</th>
<th>Package</th>
<th>Command</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href=https://alpinelinux.org>Alpine</a></td>
<td><a href=https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management>apk-tools</a></td>
<td><a href=https://pkgs.alpinelinux.org/package/edge/community/x86_64/just>just</a></td>
<td><code>apk add just</code></td>
</tr>
<tr>
<td><a href=https://www.archlinux.org>Arch</a></td>
<td><a href=https://wiki.archlinux.org/title/Pacman>pacman</a></td>
<td><a href=https://archlinux.org/packages/extra/x86_64/just/>just</a></td>
<td><code>pacman -S just</code></td>
</tr>
<tr>
<td>
<a href=https://debian.org>Debian 13 (unreleased)</a> and
<a href=https://ubuntu.com>Ubuntu 24.04</a> derivatives</td>
<td><a href=https://en.wikipedia.org/wiki/APT_(software)>apt</a></td>
<td><a href=https://packages.debian.org/trixie/just>just</a></td>
<td><code>apt install just</code></td>
</tr>
<tr>
<td><a href=https://debian.org>Debian</a> and <a href=https://ubuntu.com>Ubuntu</a> derivatives</td>
<td><a href=https://mpr.makedeb.org>MPR</a></td>
<td><a href=https://mpr.makedeb.org/packages/just>just</a></td>
<td>
<code>git clone https://mpr.makedeb.org/just</code><br>
<code>cd just</code><br>
<code>makedeb -si</code>
</td>
</tr>
<tr>
<td><a href=https://debian.org>Debian</a> and <a href=https://ubuntu.com>Ubuntu</a> derivatives</td>
<td><a href=https://docs.makedeb.org/prebuilt-mpr>Prebuilt-MPR</a></td>
<td><a href=https://mpr.makedeb.org/packages/just>just</a></td>
<td>
<sup><b>You must have the <a href=https://docs.makedeb.org/prebuilt-mpr/getting-started/#setting-up-the-repository>Prebuilt-MPR set up</a> on your system in order to run this command.</b></sup><br>
<code>apt install just</code>
</td>
</tr>
<tr>
<td><a href=https://getfedora.org>Fedora</a></td>
<td><a href=https://dnf.readthedocs.io/en/latest/>DNF</a></td>
<td><a href=https://src.fedoraproject.org/rpms/rust-just>just</a></td>
<td><code>dnf install just</code></td>
</tr>
<tr>
<td><a href=https://www.gentoo.org>Gentoo</a></td>
<td><a href=https://wiki.gentoo.org/wiki/Portage>Portage</a></td>
<td><a href=https://github.com/gentoo-mirror/guru/tree/master/dev-build/just>guru/dev-build/just</a></td>
<td>
<code>eselect repository enable guru</code><br>
<code>emerge --sync guru</code><br>
<code>emerge dev-build/just</code>
</td>
</tr>
<tr>
<td><a href=https://nixos.org/nixos/>NixOS</a></td>
<td><a href=https://nixos.org/nix/>Nix</a></td>
<td><a href=https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/ju/just/package.nix>just</a></td>
<td><code>nix-env -iA nixos.just</code></td>
</tr>
<tr>
<td><a href=https://opensuse.org>openSUSE</a></td>
<td><a href=https://en.opensuse.org/Portal:Zypper>Zypper</a></td>
<td><a href=https://build.opensuse.org/package/show/Base:System/just>just</a></td>
<td><code>zypper in just</code></td>
</tr>
<tr>
<td><a href=https://getsol.us>Solus</a></td>
<td><a href=https://getsol.us/articles/package-management/basics/en>eopkg</a></td>
<td><a href=https://dev.getsol.us/source/just/>just</a></td>
<td><code>eopkg install just</code></td>
</tr>
<tr>
<td><a href=https://voidlinux.org>Void</a></td>
<td><a href=https://wiki.voidlinux.org/XBPS>XBPS</a></td>
<td><a href=https://github.com/void-linux/void-packages/blob/master/srcpkgs/just/template>just</a></td>
<td><code>xbps-install -S just</code></td>
</tr>
</tbody>
</table>
#### Windows
<table>
<thead>
<tr>
<th>Package Manager</th>
<th>Package</th>
<th>Command</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href=https://chocolatey.org>Chocolatey</a></td>
<td><a href=https://github.com/michidk/just-choco>just</a></td>
<td><code>choco install just</code></td>
</tr>
<tr>
<td><a href=https://scoop.sh>Scoop</a></td>
<td><a href=https://github.com/ScoopInstaller/Main/blob/master/bucket/just.json>just</a></td>
<td><code>scoop install just</code></td>
</tr>
<tr>
<td><a href=https://learn.microsoft.com/en-us/windows/package-manager/>Windows Package Manager</a></td>
<td><a href=https://github.com/microsoft/winget-pkgs/tree/master/manifests/c/Casey/Just>Casey/Just</a></td>
<td><code>winget install --id Casey.Just --exact</code></td>
</tr>
</tbody>
</table>
#### macOS
<table>
<thead>
<tr>
<th>Package Manager</th>
<th>Package</th>
<th>Command</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href=https://www.macports.org>MacPorts</a></td>
<td><a href=https://ports.macports.org/port/just/summary>just</a></td>
<td><code>port install just</code></td>
</tr>
</tbody>
</table>
![just package version table](https://repology.org/badge/vertical-allrepos/just.svg)
![rust:just package version table](https://repology.org/badge/vertical-allrepos/rust:just.svg)
### Pre-Built Binaries
Pre-built binaries for Linux, MacOS, and Windows can be found on
[the releases page](https://github.com/casey/just/releases).
You can use the following command on Linux, MacOS, or Windows to download the
latest release, just replace `DEST` with the directory where you'd like to put
`just`:
```console
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to DEST
```
For example, to install `just` to `~/bin`:
```console
# create ~/bin
mkdir -p ~/bin
# download and extract just to ~/bin/just
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to ~/bin
# add `~/bin` to the paths that your shell searches for executables
# this line should be added to your shells initialization file,
# e.g. `~/.bashrc` or `~/.zshrc`
export PATH="$PATH:$HOME/bin"
# just should now be executable
just --help
```
Note that `install.sh` may fail on GitHub Actions, or in other environments
where many machines share IP addresses. `install.sh` calls GitHub APIs in order
to determine the latest version of `just` to install, and those API calls are
rate-limited on a per-IP basis. To make `install.sh` more reliable in such
circumstances, pass a specific tag to install with `--tag`.
[Releases](https://github.com/casey/just/releases) include a `SHA256SUM` file
which can be used to verify the integrity of pre-built binary archives.
To verify a release, download the pre-built binary archive along with the
`SHA256SUM` file and run:
```sh
shasum --algorithm 256 --ignore-missing --check SHA256SUMS
```
### GitHub Actions
`just` can be installed on GitHub Actions in a few ways.
Using package managers pre-installed on GitHub Actions runners on MacOS with
`brew install just`, and on Windows with `choco install just`.
With [extractions/setup-just](https://github.com/extractions/setup-just):
```yaml
- uses: extractions/setup-just@v2
with:
just-version: 1.5.0 # optional semver specification, otherwise latest
```
Or with [taiki-e/install-action](https://github.com/taiki-e/install-action):
```yaml
- uses: taiki-e/install-action@just
```
### Release RSS Feed
An [RSS feed](https://en.wikipedia.org/wiki/RSS) of `just` releases is available [here](https://github.com/casey/just/releases.atom).
### Node.js Installation
[just-install](https://npmjs.com/package/just-install) can be used to automate
installation of `just` in Node.js applications.
`just` is a great, more robust alternative to npm scripts. If you want to
include `just` in the dependencies of a Node.js application, `just-install`
will install a local, platform-specific binary as part of the `npm install`
command. This removes the need for every developer to install `just`
independently using one of the processes mentioned above. After installation,
the `just` command will work in npm scripts or with npx. It's great for teams
who want to make the set up process for their project as easy as possible.
For more information, see the
[just-install README file](https://github.com/brombal/just-install#readme).
Backwards Compatibility
-----------------------
With the release of version 1.0, `just` features a strong commitment to
backwards compatibility and stability.
Future releases will not introduce backwards incompatible changes that make
existing `justfile`s stop working, or break working invocations of the
command-line interface.
This does not, however, preclude fixing outright bugs, even if doing so might
break `justfiles` that rely on their behavior.
There will never be a `just` 2.0. Any desirable backwards-incompatible changes
will be opt-in on a per-`justfile` basis, so users may migrate at their
leisure.
Features that aren't yet ready for stabilization are marked as unstable and may
be changed or removed at any time. Using unstable features produces an error by
default, which can be suppressed with by passing the `--unstable` flag,
`set unstable`, or setting the environment variable `JUST_UNSTABLE`, to any
value other than `false`, `0`, or the empty string.
Editor Support
--------------
`justfile` syntax is close enough to `make` that you may want to tell your
editor to use `make` syntax highlighting for `just`.
### Vim and Neovim
#### `vim-just`
The [vim-just](https://github.com/NoahTheDuke/vim-just) plugin provides syntax
highlighting for `justfile`s.
Install it with your favorite package manager, like
[Plug](https://github.com/junegunn/vim-plug):
```vim
call plug#begin()
Plug 'NoahTheDuke/vim-just'
call plug#end()
```
Or with Vim's built-in package support:
```console
mkdir -p ~/.vim/pack/vendor/start
cd ~/.vim/pack/vendor/start
git clone https://github.com/NoahTheDuke/vim-just.git
```
#### `tree-sitter-just`
[tree-sitter-just](https://github.com/IndianBoy42/tree-sitter-just) is an
[Nvim Treesitter](https://github.com/nvim-treesitter/nvim-treesitter) plugin
for Neovim.
#### Makefile Syntax Highlighting
Vim's built-in makefile syntax highlighting isn't perfect for `justfile`s, but
it's better than nothing. You can put the following in `~/.vim/filetype.vim`:
```vimscript
if exists("did_load_filetypes")
finish
endif
augroup filetypedetect
au BufNewFile,BufRead justfile setf make
augroup END
```
Or add the following to an individual `justfile` to enable `make` mode on a
per-file basis:
```text
# vim: set ft=make :
```
### Emacs
[just-mode](https://github.com/leon-barrett/just-mode.el) provides syntax
highlighting and automatic indentation of `justfile`s. It is available on
[MELPA](https://melpa.org/) as [just-mode](https://melpa.org/#/just-mode).
[justl](https://github.com/psibi/justl.el) provides commands for executing and
listing recipes.
You can add the following to an individual `justfile` to enable `make` mode on
a per-file basis:
```text
# Local Variables:
# mode: makefile
# End:
```
### Visual Studio Code
An extension for VS Code is [available here](https://github.com/nefrob/vscode-just).
Unmaintained VS Code extensions include
[skellock/vscode-just](https://github.com/skellock/vscode-just) and
[sclu1034/vscode-just](https://github.com/sclu1034/vscode-just).
### JetBrains IDEs
A plugin for JetBrains IDEs by [linux_china](https://github.com/linux-china) is
[available here](https://plugins.jetbrains.com/plugin/18658-just).
### Kakoune
Kakoune supports `justfile` syntax highlighting out of the box, thanks to
TeddyDD.
### Helix
[Helix](https://helix-editor.com/) supports `justfile` syntax highlighting
out-of-the-box since version 23.05.
### Sublime Text
The [Just package](https://github.com/nk9/just_sublime) by
[nk9](https://github.com/nk9) with `just` syntax and some other tools is
available on [PackageControl](https://packagecontrol.io/packages/Just).
### Micro
[Micro](https://micro-editor.github.io/) supports Justfile syntax highlighting
out of the box, thanks to [tomodachi94](https://github.com/tomodachi94).
### Other Editors
Feel free to send me the commands necessary to get syntax highlighting working
in your editor of choice so that I may include them here.
Quick Start
-----------
See [the installation section](#installation) for how to install `just` on your
computer. Try running `just --version` to make sure that it's installed
correctly.
For an overview of the syntax, check out
[this cheatsheet](https://cheatography.com/linux-china/cheat-sheets/justfile/).
Once `just` is installed and working, create a file named `justfile` in the
root of your project with the following contents:
```just
recipe-name:
echo 'This is a recipe!'
# this is a comment
another-recipe:
@echo 'This is another recipe.'
```
When you invoke `just` it looks for file `justfile` in the current directory
and upwards, so you can invoke it from any subdirectory of your project.
The search for a `justfile` is case insensitive, so any case, like `Justfile`,
`JUSTFILE`, or `JuStFiLe`, will work. `just` will also look for files with the
name `.justfile`, in case you'd like to hide a `justfile`.
Running `just` with no arguments runs the first recipe in the `justfile`:
```console
$ just
echo 'This is a recipe!'
This is a recipe!
```
One or more arguments specify the recipe(s) to run:
```console
$ just another-recipe
This is another recipe.
```
`just` prints each command to standard error before running it, which is why
`echo 'This is a recipe!'` was printed. This is suppressed for lines starting
with `@`, which is why `echo 'This is another recipe.'` was not printed.
Recipes stop running if a command fails. Here `cargo publish` will only run if
`cargo test` succeeds:
```just
publish:
cargo test
# tests passed, time to publish!
cargo publish
```
Recipes can depend on other recipes. Here the `test` recipe depends on the
`build` recipe, so `build` will run before `test`:
```just
build:
cc main.c foo.c bar.c -o main
test: build
./test
sloc:
@echo "`wc -l *.c` lines of code"
```
```console
$ just test
cc main.c foo.c bar.c -o main
./test
testing… all tests passed!
```
Recipes without dependencies will run in the order they're given on the command
line:
```console
$ just build sloc
cc main.c foo.c bar.c -o main
1337 lines of code
```
Dependencies will always run first, even if they are passed after a recipe that
depends on them:
```console
$ just test build
cc main.c foo.c bar.c -o main
./test
testing… all tests passed!
```
Examples
--------
A variety of `justfile`s can be found in the
[examples directory](https://github.com/casey/just/tree/master/examples) and on
[GitHub](https://github.com/search?q=path%3A**%2Fjustfile&type=code).
Features
--------
### The Default Recipe
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:
```just
test:
cargo test
```
You can also use dependencies to run multiple recipes by default:
```just
default: lint build test
build:
echo Building…
test:
echo Testing…
lint:
echo Linting…
```
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:
```just
default:
just --list
```
### Listing Available Recipes
Recipes can be listed in alphabetical order with `just --list`:
```console
$ just --list
Available recipes:
build
test
deploy
lint
```
Recipes in [submodules](#modules1190) can be listed with `just --list PATH`,
where `PATH` is a space- or `::`-separated module path:
```
$ cat justfile
mod foo
$ cat foo.just
mod bar
$ cat bar.just
baz:
$ just foo bar
Available recipes:
baz
$ just foo::bar
Available recipes:
baz
```
`just --summary` is more concise:
```console
$ just --summary
build test deploy lint
```
Pass `--unsorted` to print recipes in the order they appear in the `justfile`:
```just
test:
echo 'Testing!'
build:
echo 'Building!'
```
```console
$ just --list --unsorted
Available recipes:
test
build
```
```console
$ just --summary --unsorted
test build
```
If you'd like `just` to default to listing the recipes in the `justfile`, you
can use this as your default recipe:
```just
default:
@just --list
```
Note that you may need to add `--justfile {{justfile()}}` to the line above.
Without it, if you executed `just -f /some/distant/justfile -d .` or
`just -f ./non-standard-justfile`, the plain `just --list` inside the recipe
would not necessarily use the file you provided. It would try to find a
justfile in your current path, maybe even resulting in a `No justfile found`
error.
The heading text can be customized with `--list-heading`:
```console
$ just --list --list-heading $'Cool stuff…\n'
Cool stuff…
test
build
```
And the indentation can be customized with `--list-prefix`:
```console
$ just --list --list-prefix ····
Available recipes:
····test
····build
```
The argument to `--list-heading` replaces both the heading and the newline
following it, so it should contain a newline if non-empty. It works this way so
you can suppress the heading line entirely by passing the empty string:
```console
$ just --list --list-heading ''
test
build
```
### Invoking Multiple Recipes
Multiple recipes may be invoked on the command line at once:
```just
build:
make web
serve:
python3 -m http.server -d out 8000
```
```console
$ just build serve
make web
python3 -m http.server -d out 8000
```
Keep in mind that recipes with parameters will swallow arguments, even if they
match the names of other recipes:
```just
build project:
make {{project}}
serve:
python3 -m http.server -d out 8000
```
```console
$ just build serve
make: *** No rule to make target `serve'. Stop.
```
The `--one` flag can be used to restrict command-line invocations to a single
recipe:
```console
$ just --one build serve
error: Expected 1 command-line recipe invocation but found 2.
```
### Working Directory
By default, recipes run with the working directory set to the directory that
contains the `justfile`.
The `[no-cd]` attribute can be used to make recipes run with the working
directory set to directory in which `just` was invoked.
```just
@foo:
pwd
[no-cd]
@bar:
pwd
```
```console
$ cd subdir
$ just foo
/
$ just bar
/subdir
```
You can override the working directory for all recipes with
`set working-directory := '…'`:
```just
set working-directory := 'bar'
@foo:
pwd
```
```console
$ pwd
/home/bob
$ just foo
/home/bob/bar
```
You can override the working directory for a specific recipe with the
`working-directory` attribute<sup>1.38.0</sup>:
```just
[working-directory: 'bar']
@foo:
pwd
```
```console
$ pwd
/home/bob
$ just foo
/home/bob/bar
```
The argument to the `working-directory` setting or `working-directory`
attribute may be absolute or relative. If it is relative it is interpreted
relative to the default working directory.
### Aliases
Aliases allow recipes to be invoked on the command line with alternative names:
```just
alias b := build
build:
echo 'Building!'
```
```console
$ just b
echo 'Building!'
Building!
```
### Settings
Settings control interpretation and execution. Each setting may be specified at
most once, anywhere in the `justfile`.
For example:
```just
set shell := ["zsh", "-cu"]
foo:
# this line will be run as `zsh -cu 'ls **/*.txt'`
ls **/*.txt
```
#### Table of Settings
| Name | Value | Default | Description |
|------|-------|---------|-------------|
| `allow-duplicate-recipes` | boolean | `false` | Allow recipes appearing later in a `justfile` to override earlier recipes with the same name. |
| `allow-duplicate-variables` | boolean | `false` | Allow variables appearing later in a `justfile` to override earlier variables with the same name. |
| `dotenv-filename` | string | - | Load a `.env` file with a custom name, if present. |
| `dotenv-load` | boolean | `false` | Load a `.env` file, if present. |
| `dotenv-path` | string | - | Load a `.env` file from a custom path and error if not present. Overrides `dotenv-filename`. |
| `dotenv-required` | boolean | `false` | Error if a `.env` file isn't found. |
| `export` | boolean | `false` | Export all variables as environment variables. |
| `fallback` | boolean | `false` | Search `justfile` in parent directory if the first recipe on the command line is not found. |
| `ignore-comments` | boolean | `false` | Ignore recipe lines beginning with `#`. |
| `positional-arguments` | boolean | `false` | Pass positional arguments. |
| `quiet` | boolean | `false` | Disable echoing recipe lines before executing. |
| `script-interpreter`<sup>1.33.0</sup> | `[COMMAND, ARGS…]` | `['sh', '-eu']` | Set command used to invoke recipes with empty `[script]` attribute. |
| `shell` | `[COMMAND, ARGS…]` | - | Set command used to invoke recipes and evaluate backticks. |
| `tempdir` | string | - | Create temporary directories in `tempdir` instead of the system default temporary directory. |
| `unstable`<sup>1.31.0</sup> | boolean | `false` | Enable unstable features. |
| `windows-powershell` | boolean | `false` | Use PowerShell on Windows as default shell. (Deprecated. Use `windows-shell` instead. |
| `windows-shell` | `[COMMAND, ARGS…]` | - | Set the command used to invoke recipes and evaluate backticks. |
| `working-directory`<sup>1.33.0</sup> | string | - | Set the working directory for recipes and backticks, relative to the default working directory. |
Boolean settings can be written as:
```justfile
set NAME
```
Which is equivalent to:
```justfile
set NAME := true
```
#### Allow Duplicate Recipes