#cargo #xtask #github #bash #com-matklad-cargo-xtask

app cargo-xtask

占位符,请访问 https://github.com/matklad/cargo-xtask

1 个不稳定版本

0.1.0 2019年10月18日

#10#xtask

Download history 59/week @ 2024-03-13 104/week @ 2024-03-20 72/week @ 2024-03-27 68/week @ 2024-04-03 42/week @ 2024-04-10 32/week @ 2024-04-17 79/week @ 2024-04-24 79/week @ 2024-05-01 65/week @ 2024-05-08 46/week @ 2024-05-15 39/week @ 2024-05-22 48/week @ 2024-05-29 68/week @ 2024-06-05 53/week @ 2024-06-12 50/week @ 2024-06-19 54/week @ 2024-06-26

每月 236 次下载

MIT/Apache

2KB

cargo xtask

cargo-xtask 是向 Rust 项目添加自由形式自动化的一种方法,类似于 makenpm run 或定制 bash 脚本。

xtask 的两个显著特点是

  • 它不需要除了 cargorustc 以外的任何其他二进制文件,它完全从它们自举
  • 与 bash 不同,它更容易跨平台,因为它不使用 shell。

它是如何工作的?

cargo-xtask 是 cargo workflows 功能的一个 polyfill。它是一种扩展标准、稳定的 cargo 的自定义命令(xtasks)的方法,这些命令是用 Rust 编写的。

这个 polyfill 不需要任何代码,只需要一个 cargo 项目的特定配置。这个仓库是这个配置的规范。

状态

cargo-xtask 不是一个官方推荐的流程,但它是在生态系统中的一个相对常见的模式。值得注意的是,Cargo 本身 使用了 xtasks

它可能或可能不会适用于您的用例!

定义 xtasks

创建 xtask 的最佳方式是在 Cargo 工作区内部进行。如果您还没有工作区,您可以在您的包内部创建一个,将内容移动到一个新目录中。假设我们的包名为 "testing"。我们首先将所有内容移动到一个子目录中

$ mkdir testing

# then move all of the stuff except your .git directory into the new testing directory:
$ mv src testing
$ mv Cargo.toml testing
$ mv .gitignore testing
$ mv README.md testing

# Don't forget anything else your package may have.

然后,添加一个名为 xtask 的新包

$ cargo new --bin xtask

然后,我们需要为我们的工作区创建一个 Cargo.toml

[workspace]
members = [
    "testing",
    "xtask",
]

如果您之前有一个工作区,您将把 xtask 添加到您现有的工作区 Cargo.toml 中。

然后,别名。 这是魔法发生的地方。创建一个 .cargo

$ mkdir .cargo

并在其中创建一个名为 config.toml 的文件,内容如下

[alias]
xtask = "run --package xtask --"

示例目录结构

/testing
  .git
  .cargo/
    config.toml
  Cargo.toml
  testing/
    Cargo.toml
    .gitignore
    src/
      lib.rs
  xtask/
    Cargo.toml
    src/
      main.rs

xtask 目录和 .cargo/config 都应该提交到版本控制系统。

如果您不想使用工作区,可以使用以下别名:run --manifest-path ./xtask/Cargo.toml --,但这不建议使用。

xtask 二进制文件应至少期望一个位置参数,即要执行的任务名称。任务是用 Rust 实现的,可以使用来自 crates.io 的任意 crate。任务可以执行 cargo(建议使用 CARGO 环境变量以获取正确的 cargo)。

xtask crate 可能是主工作区的一部分,也可能不是。通常情况下,工作区设置更好。如果 xtask 是工作区的一部分,您可以在 xtask 和主 crate 之间共享依赖项,并且依赖项更新过程更简单。此外,您还可以使用 xtask = "run --package xtask --" 作为别名,它在 Cargo 的工作目录无关的情况下也能工作。如果 xtask 不是工作区的一部分,您可以为共享依赖项使用不同的功能集,并且您可以在 CI 上更容易地缓存 xtask/target。建议将 xtask 锁文件提交到存储库。

建议最小化 xtasks 的编译时间。

您可以在本存储库的 ./examples 目录中找到一些 xtasks 的示例。

当前建议是将各种任务定义为单个 xtask 二进制文件的子命令。另一种选择是为每个任务使用单独的二进制文件和 .cargo/config 中的单独条目。

外部示例

更多示例可以通过例如 Github Code search 等方式找到。

限制

xtasks 不与 Cargo 生命周期集成。如果您需要在 cargo build 之后进行自定义后处理,则需要定义和调用 cargo xtask build 任务,该任务内部调用 cargo build。无法拦截标准的 cargo build 命令。

无法使用依赖项中的 xtasks,xtasks 是项目本地的。然而,可以将实现常见 xtasks 的逻辑作为 crates.io 软件包共享。

如果 xtask 不是工作空间成员,则 cargo xtask 仅从项目的根目录中工作。

使用 xtasks

使用 cargo xtask task-name 命令来运行任务。

示例

cargo xtask deploy

请注意,这不需要任何额外的设置,除了克隆存储库,它将在第一次运行时自动构建 xtask 二进制文件。

不使用 xtasks

xtasks 完全可选,您不必使用它们!特别是,如果 cargo buildcargo test 对您来说足够了,则无需使用 xtasks。如果您更喜欢编写短的 bash 脚本,并且不需要支持 Windows,那么也不需要使用 xtasks。

标准 xtasks

理论上,可能有益于为一些常见任务指定一种约定,以启用高级工具。例如,如果许多 CLI 应用程序可以提供 cargo xtask dist,它构建应用程序的分发版(编译后的二进制文件 + man 页面 + shell 完整性 + 其他任何辅助资源),那么这可以被下游 Linux 发行版以统一的方式重新用于打包 Rust 应用程序。

据我所知,迄今为止还没有出现这样的常规 xtasks。如果您认为将某些重复模式编码化是一个好主意,请考虑发布您自己的规范(例如,创建 cargo-xtask-dist 存储库)。如果它得到了人们的关注(由不同的作者管理的至少三个不同项目使用),请向此文档发送带有规范链接的 PR。

有关讨论,请参阅 #1

工具

  • devx:有用的实用程序集合(生成进程、git 预提交钩子等)
  • xshell:在 Rust 中进行“bash”脚本编写的舒适方式
  • duct:一个用于运行子进程的库,支持管道和 IO 重定向

如果您为 xtasks 编写工具或库,请向此文档发送 PR。一些可能的想法

  • cargo 子命令用于生成 xtask 模板
  • 常见 xtasks 的实现,如“检查代码是否以 rustfmt 格式化”或“为 clap 应用程序构建完成”,作为库。

背景

据我所知,xtask 的想法最初是在 这篇帖子 中提出的。在某种意义上,本文档只是对原始想法的一些约定进行了规范。

选择 xtask 这个名字是为了避免与潜在的未来内置 cargo 任务功能冲突。

无运行时依赖项