{"id":15893845,"url":"https://github.com/chinanf-boy/just-zh","last_synced_at":"2025-03-20T14:30:43.589Z","repository":{"id":90548461,"uuid":"158552580","full_name":"chinanf-boy/just-zh","owner":"chinanf-boy","description":"中文翻译:\u003ccasey/just\u003e 是保存和运行项目的特定命令的简便方法. :heart: 校对 ✅","archived":false,"fork":false,"pushed_at":"2019-10-08T05:48:54.000Z","size":39,"stargazers_count":29,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-17T17:05:17.994Z","etag":null,"topics":["command","docs","just","rust","zh"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chinanf-boy.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-21T13:31:41.000Z","updated_at":"2023-02-12T11:42:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"d69b17e9-5044-4135-8244-adafbd6b7c28","html_url":"https://github.com/chinanf-boy/just-zh","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fjust-zh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fjust-zh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fjust-zh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chinanf-boy%2Fjust-zh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chinanf-boy","download_url":"https://codeload.github.com/chinanf-boy/just-zh/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244630015,"owners_count":20484300,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command","docs","just","rust","zh"],"created_at":"2024-10-06T08:13:52.909Z","updated_at":"2025-03-20T14:30:43.575Z","avatar_url":"https://github.com/chinanf-boy.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# casey/just [![explain]][source] [![translate-svg]][translate-list]\n\n\u003c!-- [![size-img]][size] --\u003e\n\n[explain]: http://llever.com/explain.svg\n[source]: https://github.com/chinanf-boy/Source-Explain\n[translate-svg]: http://llever.com/translate.svg\n[translate-list]: https://github.com/chinanf-boy/chinese-translate-list\n[size-img]: https://packagephobia.now.sh/badge?p=Name\n[size]: https://packagephobia.now.sh/result?p=Name\n\n「 `just`是保存和运行项目的特定命令的简便方法. 」\n\n[中文](./readme.md) | [english](https://github.com/casey/just)\n\n---\n\n## 更新 ✅\n\n\u003c!-- doc-templite START generated --\u003e\n\u003c!-- repo = 'casey/just' --\u003e\n\u003c!-- commit = 'ab11740104a6c4f545bc1b35a1bc002044e0fd59' --\u003e\n\u003c!-- time = '2019-10-07' --\u003e\n翻译的原文 | 与日期 | 最新更新 | 更多\n---|---|---|---\n[commit] | ⏰ 2019-10-07 | ![last] | [中文翻译][translate-list]\n\n[last]: https://img.shields.io/github/last-commit/casey/just.svg\n[commit]: https://github.com/casey/just/tree/ab11740104a6c4f545bc1b35a1bc002044e0fd59\n\n\u003c!-- doc-templite END generated --\u003e\n\n### 贡献\n\n欢迎 👏 勘误/校对/更新贡献 😊 [具体贡献请看](https://github.com/chinanf-boy/chinese-translate-list#贡献)\n\n## 生活\n\n[If help, **buy** me coffee —— 营养跟不上了，给我来瓶营养快线吧! 💰](https://github.com/chinanf-boy/live-need-money)\n\n---\n\n### 目录\n\n\u003cdetails\u003e\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n- [`just`](#just)\n  - [使用手册](#%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C)\n  - [安装](#%E5%AE%89%E8%A3%85)\n    - [预先构建的 二进制文件](#%E9%A2%84%E5%85%88%E6%9E%84%E5%BB%BA%E7%9A%84-%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6)\n    - [Homebrew](#homebrew)\n    - [Scoop](#scoop)\n  - [Arch Linux](#arch-linux)\n  - [Void Linux](#void-linux)\n  - [Nix](#nix)\n  - [Cargo](#cargo)\n- [让我们快速开始](#%E8%AE%A9%E6%88%91%E4%BB%AC%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B)\n  - [特性](#%E7%89%B9%E6%80%A7)\n    - [列出可用的配方](#%E5%88%97%E5%87%BA%E5%8F%AF%E7%94%A8%E7%9A%84%E9%85%8D%E6%96%B9)\n  - [Aliases](#aliases)\n    - [文档注释](#%E6%96%87%E6%A1%A3%E6%B3%A8%E9%87%8A)\n    - [变量和替代](#%E5%8F%98%E9%87%8F%E5%92%8C%E6%9B%BF%E4%BB%A3)\n      - [转义 `{{`](#%E8%BD%AC%E4%B9%89-)\n    - [Strings](#strings)\n    - [函数](#%E5%87%BD%E6%95%B0)\n      - [系统信息](#%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF)\n      - [环境变量](#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F)\n      - [调用 目录](#%E8%B0%83%E7%94%A8-%E7%9B%AE%E5%BD%95)\n      - [Dotenv 集成](#dotenv-%E9%9B%86%E6%88%90)\n    - [执行命令可使用反引号](#%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%BC%95%E5%8F%B7)\n    - [使用命令行工具，设置变量](#%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7%E8%AE%BE%E7%BD%AE%E5%8F%98%E9%87%8F)\n    - [环境变量](#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F-1)\n    - [配方 参数](#%E9%85%8D%E6%96%B9-%E5%8F%82%E6%95%B0)\n    - [用其他语言来写配方](#%E7%94%A8%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E6%9D%A5%E5%86%99%E9%85%8D%E6%96%B9)\n  - [多行结构语句](#%E5%A4%9A%E8%A1%8C%E7%BB%93%E6%9E%84%E8%AF%AD%E5%8F%A5)\n    - [`if` statements](#if-statements)\n    - [`for` loops](#for-loops)\n    - [`while` loops](#while-loops)\n    - [命令行选项](#%E5%91%BD%E4%BB%A4%E8%A1%8C%E9%80%89%E9%A1%B9)\n    - [私有配方](#%E7%A7%81%E6%9C%89%E9%85%8D%E6%96%B9)\n    - [安静配方](#%E5%AE%89%E9%9D%99%E9%85%8D%E6%96%B9)\n    - [在其他目录调用 Justfiles](#%E5%9C%A8%E5%85%B6%E4%BB%96%E7%9B%AE%E5%BD%95%E8%B0%83%E7%94%A8-justfiles)\n  - [Just 脚本](#just-%E8%84%9A%E6%9C%AC)\n  - [杂记(炸鸡?)](#%E6%9D%82%E8%AE%B0%E7%82%B8%E9%B8%A1)\n    - [搭配工具](#%E6%90%AD%E9%85%8D%E5%B7%A5%E5%85%B7)\n    - [Shell Alias(别名)](#shell-alias%E5%88%AB%E5%90%8D)\n    - [语法 高亮](#%E8%AF%AD%E6%B3%95-%E9%AB%98%E4%BA%AE)\n      - [Vim](#vim)\n      - [Vim 和 Emacs](#vim-%E5%92%8C-emacs)\n      - [Visual Studio Code](#visual-studio-code)\n      - [Kakoune](#kakoune)\n      - [其他编辑器](#%E5%85%B6%E4%BB%96%E7%BC%96%E8%BE%91%E5%99%A8)\n    - [语法](#%E8%AF%AD%E6%B3%95)\n    - [just.sh](#justsh)\n    - [无定向项目的 Justfile](#%E6%97%A0%E5%AE%9A%E5%90%91%E9%A1%B9%E7%9B%AE%E7%9A%84-justfile)\n  - [Janus](#janus)\n  - [FAQ](#faq)\n    - [make 的什么不良癖好，just 避免了？](#make-%E7%9A%84%E4%BB%80%E4%B9%88%E4%B8%8D%E8%89%AF%E7%99%96%E5%A5%BDjust-%E9%81%BF%E5%85%8D%E4%BA%86)\n    - [just 和 cargo build 脚本有一腿吗?](#just-%E5%92%8C-cargo-build-%E8%84%9A%E6%9C%AC%E6%9C%89%E4%B8%80%E8%85%BF%E5%90%97)\n  - [进一步漫谈](#%E8%BF%9B%E4%B8%80%E6%AD%A5%E6%BC%AB%E8%B0%88)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n# `just`\n\n![crates.io version](https://img.shields.io/crates/v/just.svg) ![build\nstatus](https://travis-ci.org/casey/just.svg?branch=master) ![chat on\ngitter](https://badges.gitter.im/just-because/Lobby.svg) ![say\nthanks](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)\n\n`just`是保存和运行项目的特定命令的简便方法。\n\n命令存储在一个名为`justfile`，语法启发自`make`:\n\n```make\nbuild:\n    cc *.c -o main\n\n# test everything\ntest-all: build\n    ./test --all\n\n# run a specific test\ntest TEST: build\n    ./test --test {{TEST}}\n```\n\n然后可以使用`just \u003cCOMMAND\u003e`运行它们:\n\n```sh\n$ just test-all\ncc *.c -o main\n./test --all\nYay, all your tests passed!\n```\n\n\u003e 有些困惑，没事，下面就帮你理清一切\n\n`just`产生详细的错误消息，并避免`make`不良癖好，因此调试一个 justfile 比调试一个 markfile 文件更容易，也更少惊吓。\n\n如果你需要帮助`just`，请随时打开一个问题或让我知道[gitter](https://gitter.im/just-because/Lobby)。 始终欢迎功能请求和错误报告!\n\n## 使用手册\n\n## 安装\n\n`just`应该能在，具有合理`sh`的任何系统上运行，包括 Linux、MACOS 和 BSD。\n\n在 Windows 上，`just`能与由[Git for Windows](https://git-scm.com)，[GitHub Desktop](https://desktop.github.com)和[Cygwin](http://www.cygwin.com)提供的`sh`一起工作。\n\n### 预先构建的 二进制文件\n\nLinux、MacOS 和 Windows 的预构建二进制文件，在[releases 页面](https://github.com/casey/just/releases)。\n\n您可以使用以下命令，下载 Mac OS 或 Windows 的最新二进制文件，只需将`DESTINATION_DIRECTORY`替换成你想放置`just`的目录:\n\n```sh\ncurl -LSfs https://japaric.github.io/trust/install.sh | \\\n  sh -s -- --git casey/just --to DESTINATION_DIRECTORY\n```\n\n在 Linux 上，使用:\n\n```sh\ncurl -LSfs https://japaric.github.io/trust/install.sh | \\\n  sh -s -- --git casey/just --target x86_64-unknown-linux-musl --to DESTINATION_DIRECTORY\n```\n\n### Homebrew\n\n关于 MacOS,`just`可以使用[Homebrew 包管理器](https://brew.sh)安装。 若还没有 Homebrew 可使用[这里](https://brew.sh)的命令安装，然后运行:\n\n```\nbrew install just\n```\n\n### Scoop\n\n在 Windows 上,`just`可以使用[Scoop 包管理器](https://scoop.sh)安装。 若还没有 Scoop 可使用[这里](https://scoop.sh/)的指令安装，然后运行:\n\n```powershell\nscoop install just\n```\n\n## Arch Linux\n\n在 Arch Linux, `just`  作为 AUR包\n[just](https://aur.archlinux.org/packages/just/),  [Arch User\nRepository](https://aur.archlinux.org)。几个可以从 AUR 下载包的工具, 包括 [yay](https://github.com/Jguer/yay)\n和 [yaourt](https://github.com/archlinuxfr/yaourt).\n\n## Void Linux\n\n在 Void Linux, `just` can be installed with:\n\n```sh\nsudo xbps-install -S just\n```\n\n## Nix\n\nOn NixOS, Linux, and MacOS, `just` 的安装，可使用[Nix\npackage manager](https://nixos.org/nix/). Install\n[Nix](https://nixos.org/nix/download.html) or\n[NixOS](https://nixos.org/nixos/download.html), then run:\n\n```sh\nnix-env -i just\n```\n\n## Cargo\n\n在 Windows、Linux 和 MACOS 上,`just`可使用 Cargo 安装, 它是[rust 语言 包管理器](https://www.rust-lang.org). 可使用[这里](https://www.rustup.rs)的说明书安装 Cargo，然后运行:\n\n```\ncargo install just\n```\n\n(您可能还需要添加`~/.cargo/bin`到你的`$PATH`。 如果安装后不能运行，请在 shell 配置文件中运行`export PATH=\"$HOME/.cargo/bin:$PATH\"`)\n\n# 让我们快速开始\n\n在[安装](#安装)章节中安装了`just`后。试运行`just --version`确保安装正确.\n\n一旦`just`成功安装和工作, 在项目的根目录中，创建一个名为`justfile`的文件，具有以下内容:\n\n```make\nrecipe-name:\n    echo 'This is a recipe!'\n\n\n# 这是一个注释\nanother-recipe:\n    @echo 'This is another recipe.'\n```\n\n当你调用`just`，它会在当前目录和向上层目录，寻找一个`justfile`，因此您可以在项目的任何子目录调用它(它就是那么方便)。\n\n若在没有参数的情况下运行`just`，那当你选择运行`justfile`的第一个配方(`recipe`/或者叫‘食谱’也行，反正听上去都好吃):\n\n```sh\n$ just\necho 'This is a recipe!'\nThis is a recipe!\n```\n\n一个或多个参数，就会指定要运行的配方(们):\n\n```sh\n$ just another-recipe\nThis is another recipe.\n```\n\n`just`会在运行真正命令之前，将每个命令打印到标准错误(stderr)，这就是为什么`echo 'This is a recipe!'`会被打印。当然你可以使用`@`作为行开头，这样会抑制打印。`echo 'Another recipe.'`也就没有打印。\n\n如果命令失败，配方将停止运行。下面的`cargo publish`只在`cargo test`成功后运行:\n\n```make\npublish:\n    cargo test\n    # tests passed, time to publish!\n    cargo publish\n```\n\n配方可以依赖其他配方。这里`test`配方依赖`build`配方，所以`build`会在`test`之前运行:\n\n```make\nbuild:\n    cc main.c foo.c bar.c -o main\n\ntest: build\n    ./test\n\nsloc:\n    @echo \"`wc -l *.c` lines of code\"\n```\n\n```sh\n$ just test\ncc main.c foo.c bar.c -o main\n./test\ntesting... all tests passed!\n```\n\n若是没有依赖关系的配方，将按照命令行上的顺序运行:\n\n```sh\n$ just build sloc\ncc main.c foo.c bar.c -o main\n1337 lines of code\n```\n\n依赖关系，总是先运行，即使它们(`build`)在依赖于它们的配方(`test`)之后传递:\n\n```sh\n$ just test build\ncc main.c foo.c bar.c -o main\n./test\ntesting... all tests passed!\n```\n\n## 特性\n\n### 列出可用的配方\n\n`just --list`可以列出配方:\n\n```sh\n$ just --list\nAvailable recipes:\n  build\n  test\n  deploy\n  lint\n```\n\n`just --summary`则更简洁:\n\n```sh\n$ just --summary\nbuild test deploy lint\n```\n\n## Aliases\n\nAliases 让配方拥有替代名称:\n\n```make\nalias b := build\n\nbuild:\n  echo 'Building!'\n```\n\n```sh\n$ just b\nbuild\necho 'Building!'\nBuilding!\n```\n\n### 文档注释\n\n`just --list`会让配方之前的相近注释，出现:\n\n```make\n# build stuff\nbuild:\n  ./bin/build\n\n\n# test stuff\ntest:\n  ./bin/test\n```\n\n```sh\n$ just --list\nAvailable recipes:\n    build # build stuff\n    test # test stuff\n```\n\n### 变量和替代\n\n变量、字符串、concatenation 和 substitution ，都通过使用`{{…​}}`支持:\n\n```make\nversion := \"0.2.7\"\ntardir  := \"awesomesauce-\" + version\ntarball := tardir + \".tar.gz\"\n\npublish:\n    rm -f {{tarball}}\n    mkdir {{tardir}}\n    cp README.md *.c {{tardir}}\n    tar zcvf {{tarball}} {{tardir}}\n    scp {{tarball}} me@server.com:release/\n    rm -rf {{tarball}} {{tardir}}\n```\n\n#### 转义 `{{`\n\n写一份包含`{{`的配方，要使用`{{ \"{{\" }}`:\n\n```make\nbraces:\n\techo 'I {{ \"{{\" }}LOVE}} curly braces!'\n```\n\n(上面 LOVE 旁边的，未闭合的`}}`会忽略,因此不需要转义).\n\n另一个选择是把所有你想转义的文本，插入到插槽(`{{中}}`)中:\n\n```make\nbraces:\n\techo '{{'I {{LOVE}} curly braces!'}}'\n```\n\n### Strings\n\n双引号字符串支持转义序列:\n\n\n```make\nstring-with-tab             := \"\\t\"\nstring-with-newline         := \"\\n\"\nstring-with-carriage-return := \"\\r\"\nstring-with-double-quote    := \"\\\"\"\nstring-with-slash           := \"\\\\\"\n```\n\n```sh\n$ just --evaluate\n\"tring-with-carriage-return := \"\nstring-with-double-quote    := \"\"\"\nstring-with-newline         := \"\n\"\nstring-with-slash           := \"\\\"\nstring-with-tab             := \"     \"\n```\n\n单引号字符串不识别转义序列,可能包含空格行:\n\n```make\nescapes := '\\t\\n\\r\\\"\\\\'\n\nline-breaks := 'hello\nthis\nis\n  a\n     raw\nstring!\n'\n```\n\n```sh\n$ just --evaluate\nescapes := \"\\t\\n\\r\\\"\\\\\"\n\nline-breaks := \"hello\nthis\nis\n  a\n     raw\nstring!\n\"\n```\n\n### 函数\n\n只提供一些内置函数，在编写配方时可能有用.\n\n#### 系统信息\n\n- `arch()` - 系统指令体系结构，可能的值是:`\"aarch64\"`,`\"arm\"`,`\"asmjs\"`,`\"hexagon\"`,`\"mips\"`,`\"msp430\"`,`\"powerpc\"`,`\"powerpc64\"`,`\"s390x\"`,`\"sparc\"`,`\"wasm32\"`,`\"x86\"`,`\"x86_64\"`和`\"xcore\"`.\n\n- `os()` - 操作系统，可能的值是:`\"android\"`,`\"bitrig\"`,`\"dragonfly\"`,`\"emscripten\"`,`\"freebsd\"`,`\"haiku\"`,`\"ios\"`,`\"linux\"`,`\"macos\"`,`\"netbsd\"`,`\"openbsd\"`,`\"solaris\"`和`\"windows\"`.\n\n- `os_family()`操作系统家族; 可能的价值是:`\"unix\"`和`\"windows\"`.\n\n例如:\n\n```make\nsystem-info:\n\t@echo \"This is an {{arch()}} machine\".\n```\n\n```\n$ just system-info\nThis is an x86_64 machine\n```\n\n#### 环境变量\n\n- `env_var(key)` - 用名称`key`检索环境变量，如果不存在会中止.\n\n- `env_var_or_default(key, default)` - 用名称`key`检索环境变量，如果它不存在则返回`default`值.\n\n#### 调用 目录\n\n- `invocation_directory()` - 检索当前工作目录的路径, 在`just`执行命令更改它(用 chdir)之前。\n\n例如，调用`rustfmt`只作用于\"当前目录\"下的文件(从用户/调用方的角度)，使用以下规则:\n\n```\nrustfmt:\n    find {{invocation_directory()}} -name \\*.rs -exec rustfmt {} \\;\n```\n\n或者，如果您的命令需要从当前目录运行，您可以使用(例如):\n\n```\nbuild:\n    cd {{invocation_directory()}}; ./some_script_that_needs_to_be_run_from_here\n```\n\n#### Dotenv 集成\n\n`just`将从名为`.env`文件中，加载环境变量。 此文件可以与您的 justfile 位于同一个目录中, 或是父目录。这些变量都是环境变量, 因不是`just`变量，所以在配方和反引号中必须要使用`$VARIABLE_NAME`获取。\n\n例如,如果你`.env`文件包含:\n\n```\n# 注释，会被忽略\nDATABASE_ADDRESS=localhost:6379\nSERVER_PORT=1337\n```\n\n你的 justfile 包含:\n\n```make\nserve:\n  @echo \"Starting server with database $DATABASE_ADDRESS on port $SERVER_PORT...\"\n  ./server --database $DATABASE_ADDRESS --port $SERVER_PORT\n```\n\n`just serve`会输出:\n\n```sh\n$ just serve\nStarting server with database localhost:6379 on port 1337...\n./server --database $DATABASE_ADDRESS --port $SERVER_PORT\n```\n\n### 执行命令可使用反引号\n\n反引号可用来存储命令的结果:\n\n```make\nlocalhost := `dumpinterfaces | cut -d: -f2 | sed 's/\\/.*//' | sed 's/ //g'`\n\nserve:\n    ./serve {{localhost}} 8080\n```\n\n### 使用命令行工具，设置变量\n\n变量可以通过命令行重写.\n\n```make\nos := \"linux\"\n\ntest: build\n    ./test --test {{os}}\n\nbuild:\n    ./build {{os}}\n```\n\n```sh\n$ just\n./build linux\n./test --test linux\n```\n\n在配方之前的任意数量参数，可用过`NAME=VALUE`设置:\n\n```sh\n$ just os=plan9\n./build plan9\n./test --test plan9\n```\n\n或者你可以使用` --set`:\n\n```sh\n$ just --set os bsd\n./build bsd\n./test --test bsd\n```\n\n### 环境变量\n\n`export`关键字会将作为环境变量，导入到配方中:\n\n```make\nexport RUST_BACKTRACE := \"1\"\n\ntest:\n    # will print a stack trace if it crashes\n    cargo test\n```\n\n### 配方 参数\n\n配方可能有参数。这里的`build`配方有一个参数叫做`target`:\n\n```make\nbuild target:\n    @echo 'Building {{target}}...'\n    cd {{target}} \u0026\u0026 make\n```\n\n其他配方可能不依赖带有参数的配方.\n\n为了传递参数,把它们放在配方名称后面:\n\n```sh\n$ just build my-awesome-project\nBuilding my-awesome-project...\ncd my-awesome-project \u0026\u0026 make\n```\n\n参数也可具有默认值:\n\n\n```make\ndefault := 'all'\n\ntest target tests=default:\n    @echo 'Testing {{target}}:{{tests}}...'\n    ./test --tests {{tests}} {{target}}\n```\n\n可以省略，具有默认值的参数:\n\n```sh\n$ just test server\nTesting server:all...\n./test --tests all server\n```\n\n或提供:\n\n```sh\n$ just test server unit\nTesting server:unit...\n./test --tests unit server\n```\n\n默认值可以是任意表达式，但 concatenations 必须被圆括号包裹:\n\n```make\narch := \"wasm\"\n\ntest triple=(arch + \"-unknown-unknown\"):\n  ./test {{triple}}\n```\n\n配方的最后一个参数可以是变量。这在参数名称之前，用`+`表示:\n\n```make\nbackup +FILES:\n  scp {{FILES}} me@server.com:\n```\n\n变量参数接受一个或多个参数，并由包含空格分隔的参数字符串，扩展:\n\n```sh\n$ just backup FAQ.md GRAMMAR.md\nscp FAQ.md GRAMMAR.md me@server.com:\nFAQ.md                  100% 1831     1.8KB/s   00:00\nGRAMMAR.md              100% 1666     1.6KB/s   00:00\n```\n\n具有默认参数的变量参数，可接受零个或多个参数:\n\n```make\ncommit MESSAGE +FLAGS='':\n  git commit {{FLAGS}} -m \"{{MESSAGE}}\"\n```\n\n`{{…​}}`替换可能需要引号,如果它们包含空格。例如,如果你有以下配方:\n\n```make\nsearch QUERY:\n    lynx https://www.google.com/?q={{QUERY}}\n```\n\n你的类型是:\n\n```sh\n$ just search \"cat toupee\"\n```\n\n`Just`会运行命令`lynx [https://www.google.com/?q=cat](https://www.google.com/?q=cat) toupee`，将被`sh`解析为`lynx`,`[https://www.google.com/?q=cat](https://www.google.com/?q=cat)`和`toupee`，而不是你想的`lynx`和`[https://www.google.com/?q=cat](https://www.google.com/?q=cat) toupee`。\n\n你可以通过添加引号来修正这个问题:\n\n```make\nsearch QUERY:\n    lynx 'https://www.google.com/?q={{QUERY}}'\n```\n\n\u003c!-- HERE --\u003e\n\n### 用其他语言来写配方\n\n以一个`#!`开始的配方会作为脚本执行，所以你可以用其他语言编写:\n\n```make\npolyglot: python js perl sh ruby\n\npython:\n    #!/usr/bin/env python3\n    print('Hello from python!')\n\njs:\n    #!/usr/bin/env node\n    console.log('Greetings from justfile!')\n\nperl:\n    #!/usr/bin/env perl\n    print \"Larry Wall says Hi!\\n\";\n\nsh:\n    #!/usr/bin/env sh\n    hello='Yo'\n    echo \"$hello from a shell script!\"\n\nruby:\n    #!/usr/bin/env ruby\n    puts \"Hello from ruby!\"\n```\n\n```sh\n$ just polyglot\nHello from python!\nGreetings from justfile!\nLarry Wall says Hi!\nYo from a shell script!\nHello from ruby!\n```\n\n\n## 多行结构语句\n\n配方没有执行一个初始 shebang，并且是一行一行运行的。这意味着，多行结构语句的运行，可能不是你想的那样。\n\n例如, 下面的 justfile:\n\n```\n    conditional:\n        if true; then\n            echo 'True!'\n        fi\n```\n\n`conditional`语句下的缩进空格，\n会给出解析错误:\n\n```\n    $ just conditional\n    error: Recipe line has extra leading whitespace\n      |\n    3 |         echo 'True!'\n      |     ^^^^^^^^^^^^^^^^\n```\n\n要使这个工作，你要把条件语句放在同一行，用`\\`转为新行，或是添加一个 shebang 到你的配方中。下面有些参考。\n\n### `if` statements\n\n```make\nconditional:\n    if true; then echo 'True!'; fi\n```\n\n```make\nconditional:\n    if true; then \\\n        echo 'True!'; \\\n    fi\n```\n\n```make\nconditional:\n    #!/usr/bin/env sh\n    if true; then\n        echo 'True!'\n    fi\n```\n\n### `for` loops\n\n```make\nfor:\n    for file in `ls .`; do echo $file; done\n```\n\n```make\nfor:\n    for file in `ls .`; do \\\n        echo $file; \\\n    done\n```\n\n```make\nfor:\n    #!/usr/bin/env sh\n    for file in `ls .`; do\n        echo $file\n    done\n```\n\n### `while` loops\n\n```make\nwhile:\n    while `server-is-dead`; do ping -c 1 server; done\n```\n\n```make\nwhile:\n    while `server-is-dead`; do \\\n        ping -c 1 server; \\\n    done\n```\n\n```make\nwhile:\n    #!/usr/bin/env sh\n    while `server-is-dead`; do\n        do ping -c 1 server\n    done\n```\n\n\n### 命令行选项\n\n`just`支持许多有用的命令行选项,用于列表，倒腾和调试配方和变量:\n\n```sh\n$ just --list\nAvailable recipes:\n  js\n  perl\n  polyglot\n  python\n  ruby\n$ just --show perl\nperl:\n    #!/usr/bin/env perl\n    print \"Larry Wall says Hi!\\n\";\n$ just --show polyglot\npolyglot: python js perl sh ruby\n```\n\n运行`just --help`查看所有选项.\n\n### 私有配方\n\n名称以一个`_`开头的配方和 aliases，`just --list`会省略:\n\n```make\ntest: _test-helper\n  ./bin/test\n\n_test-helper:\n  ./bin/super-secret-test-helper-stuff\n```\n\n```sh\n$ just --list\nAvailable recipes:\n  test\n```\n\n`just --summary`也是:\n\n```sh\n$ just --summary\ntest\n```\n\n这对于配方帮手来说是有用的,因为它们只是用来作为其他配方的依赖.\n\n### 安静配方\n\n配方名称可以用\"@\"前缀,在每行之前反转\"@\"的含义:\n\n```make\n@quiet:\n  echo hello\n  echo goodbye\n  @# all done!\n```\n\n现在,只有用\"@\"开头的台词会回响:\n\n```sh\n$ j quiet\nhello\ngoodbye\n# all done!\n```\n\n### 在其他目录调用 Justfiles\n\n如果第一个参数传递给`just`包含一个`/`，那会发生以下情况:\n\n1.  参数以最后一个`/`，拆分.\n\n2.  拆分后的，前半部分被视为目录。`just`会开始在那里搜索 justfile，而不是在当前目录中搜索。\n\n3.  后部分被当作一个普通的参数，或者，若它是空的，则被忽略。\n\n这看起来有点奇怪，但是如果您希望运行子目录中的 justfile 中的命令，这是很有用的。\n\n例如，如果您在包含名为`foo`子目录，其中包含一个带有`build`(也是默认配方)配方的 justfile，以下每条命令都是相等的:\n\n```sh\n$ (cd foo \u0026\u0026 just build)\n$ just foo/build\n$ just foo/\n```\n\n\n## Just 脚本\n\n通过添加一个 shebang 到一个 justfile 文件的顶部，就能让它可执行化。`just` 就作为了脚本执行器:\n\n```sh\n$ cat \u003e script \u003c\u003cEOF\n#!/usr/bin/env just --justfile\n\nfoo:\n  echo foo\nEOF\n$ chmod +x script\n$ ./script foo\necho foo\nfoo\n```\n\n若一个执行脚本带有一个 shebang, 系统会提供一个脚本的路径，作为命令参数。 所以，`#!/usr/bin/env just --justfile`, 这个命令完整是\n`/usr/bin/env just --justfile PATH_TO_SCRIPT`。\n\n使用上面的 shebang, `just` 会将工作目录改为脚本所在的目录。 如果不想改变工作目录, 使用 `#!/usr/bin/env just --working-directory . --justfile`。\n\n## 杂记(炸鸡?)\n\n\u003e 好'译'名\n\n### 搭配工具\n\n与`just`很好搭配的工具，包括:\n\n- [`watchexec`](https://github.com/mattgreen/watchexec)-一个简单的工具,它监视路径，并在检测到修改时，运行命令.\n\n### Shell Alias(别名)\n\n为了闪电般的命令运行，把`alias j=just`放在 shell 的配置文件中.\n\n### 语法 高亮\n\n`justfile`语法足够接近`make`，您可能希望告诉编辑器使用 make 语法高亮显示。\n\n#### Vim\n\n对于 Vim,您可以将以下内容放入`~/.vim/filetype.vim`:\n\n```vimscript\nif exists(\"did_load_filetypes\")\n  finish\nendif\n\naugroup filetypedetect\n  au BufNewFile,BufRead Justfile,justfile setf make\naugroup END\n```\n\n#### Vim 和 Emacs\n\n在一个`justfile`中包括以下内容，能在 Vim 和 Emacs 中启用语法高亮显示:\n\n```\n# Local Variables:\n# mode: makefile\n# End:\n# vim: set ft=make :\n```\n\n#### Visual Studio Code\n\nVS 代码的[skellock](https://github.com/skellock)扩展是[可用的哦](https://marketplace.visualstudio.com/items?itemName=skellock.just). ([github 库](https://github.com/skellock/vscode-just))\n\n您可以通过运行命令安装它:\n\n```\ncode --install-extension skellock.just\n```\n\n#### Kakoune\n\nKakoune 支持`justfile`语法高亮出笼啦,感谢 TeddyDD.\n\n#### 其他编辑器\n\n请随时给我发送必要的命令,使语法高亮工作在您的编辑器的选择,以便我可以在这里包括他们.\n\n### 语法\n\njustfile 的非规范语法可以在[GRAMMAR.md](GRAMMAR.zh.md).\n\n### just.sh\n\n以前的`just`是一个花哨的 Rust 程序，它是一个小小的 shell 脚本，其调用`make`. 您可以在[extras/just.sh](extras/just.sh)中找到旧版本。\n\n### 无定向项目的 Justfile\n\n如果你想要一些命令在任何地方都可用，把它们放进去.`~/.justfile`，并将下列内容添加到 shell 初始化文件中:\n\n```sh\nalias .j='just --justfile ~/.justfile --working-directory ~'\n```\n\n或者，如果你宁愿他们运行在当前目录:\n\n```sh\nalias .j='just --justfile ~/.justfile --working-directory .'\n```\n\n我敢肯定没有人真正使用这个功能,但它在那里.\n\n¯\\\\\\_(ツ)\\_/¯\n\n\n## Janus\n\n[Janus](https://github.com/casey/janus) 是收集和分析 justfiles 的工具，并确定新版 `just` 更新与变化，对现有 justfiles 的解析。\n\n在合并一个格外大的变更之前, 要运行 Janus 确保没有破坏。 不要担心 Janus 的运行有多麻烦, Casey(原作者) 会为你，在需要它时，对变更运行 Janus。\n\n## FAQ\n\n### make 的什么不良癖好，just 避免了？\n\nmake 有一些混淆或复杂的行为，或者说，使它不适合用作一般的命令运行器.\n\n一个例子是，有时 make 不会在配方中运行命令。例如，如果有一个文件叫`test`，例子如下且运行它:\n\n```make\ntest:\n  ./test\n```\n\nMake 实际上，会拒绝运行它:\n\n```sh\n$ make test\nmake: `test' is up to date.\n```\n\nMake 发觉这个`test`配方，并假定它产生一个名为`test`的文件。 然后， 该文件已存在，因此假定配方不需要运行。\n\n公平地说，当使用 make 作为构建系统时，这种行为是可取的，但是当使用它作为命令运行程序时，则不是那么回事。\n\n其他一些例子，包括必须理解`=`和`:=`赋值两者之间的区别；弄乱 makefile 的话，产生混乱的错误消息；不得不通过`$$`，在配方中使用环境变量；以及 Make 不同风格的配方之间的不相容性。\n\n### just 和 cargo build 脚本有一腿吗?\n\n[Cargo build 脚本](http://doc.crates.io/build-script.html)有一个非常具体的用途，这是控制 Cargo ， 正确建立你的 Rust 项目。这可能包括将命令行参数添加到`rustc`中调用，建立外部依赖，或运行某种代码生成步骤.\n\n`just`，则控制另一方面，是开发过程中部分，需要运行的所有其他杂项命令。比如在不同的配置中运行测试、链接代码、将构建工件推送到服务器、删除临时文件等等.\n\n而且，虽然`just`写于 Rust 语言，但它可以被使用在许多地方，而不在意你的项目使用的语言或构建系统.\n\n## 进一步漫谈\n\n我个人觉得写了`justfile`很有用，它几乎用到每一个项目,无论大小.\n\n在一个有多个贡献者的大型项目中,拥有一个包含所有命令的文件来处理项目是非常有用的.\n\n可能需要测试、构建、lint、部署等不同的命令,将它们全部放在一个地方很有用,并且减少了告诉人们要运行哪些命令，以及如何键入命令的时间.\n\n而且,有了一个易于放置命令的地方,您很可能会想到其他有用的，项目集体智慧的部分东西，但智慧被集中在一起，没有到处扔，像：神秘命令需要修订控制工作流程的某些部分一样；安装所有项目的依赖项，或者您可能需要传递给构建系统的所有随机参数.\n\n配方的一些想法:\n\n- 部署/发布项目\n\n- 发布模式与调试模式的构建\n\n- 运行调试模式或启用日志记录\n\n- 复杂的 git 工作流\n\n- 更新依赖关系\n\n- 运行不同的测试集,例如快速测试和完整测试,或者用详细的输出来运行它们.\n\n- 任何复杂的命令集，如果只是为了能够记得它们，你就应该写在某个地方(当然是 justfile 啦).\n\n即使对于小型的个人项目，能够按名称记住命令也是很好的，而不是`^反向搜索` shell 历史记录。也许在神秘(莫名其妙)的构建系统，使用未知语言编写的旧项目， 若是使用`just`，那`justfile`可是会知道您需要执行，还是想要的所有命令，这对于您来说是巨大的好处。如果你输入`just`可能会发生一些有用(或至少有趣!)的事情.\n\n有关配方的建议，请查看[这个项目的`justfile`](https://github.com/casey/just/blob/master/justfile)或者一些`justfile`[野花](https://github.com/search?utf8=%E2%9C%93\u0026q=filename%3Ajustfile).\n\n无论如何,这是我认为的赞，且详细的 README 文件.\n\n我希望你喜欢用`just`，并在您的所有计算体系工作中找到巨大的成功和满足感!\n\n😸\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fjust-zh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchinanf-boy%2Fjust-zh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchinanf-boy%2Fjust-zh/lists"}