13 个版本

0.0.13 2021 年 10 月 25 日
0.0.12 2021 年 1 月 13 日
0.0.11 2020 年 12 月 21 日
0.0.10 2020 年 10 月 14 日

#225Cargo 插件

40 每月下载量

Apache-2.0

64KB
1.5K SLoC

Crates.io Crates.io

cargo-task

超轻量级无依赖 Rust Cargo 任务运行器。

  • 平台无关 - 在任何 cargo 运行的平台上运行。
  • 无依赖 - 任务管理器本身几乎可以立即安装。
  • Rust 任务逻辑 - 停止编写单独的 bash 和 powershell 脚本。
  • 请查看此仓库中的 '.cargo-task' 目录 中的示例。
cargo install -f cargo-task
cargo help task

创建 cargo-task 自动化任务。

cargo task ct-init
cd .cargo-task
cargo new --bin my-task
cd ..
cargo task my-task
  • cargo task ct-init - 创建 .cargo-task 目录和 .gitignore
  • cargo task my-task - 运行在 .cargo-task 目录中定义的名为 my-task 的包。

就这么简单!

脚本式单文件任务。

如果您不想提交整个目录 / Cargo.toml 等,您可以指定 cargo-task 任务为单文件。

只需在您的 .cargo-task 目录中创建一个名为 my-task.ct.rs 的文件,并像编写 main.rs 一样编写它。

这也会创建一个 my-task cargo 任务。您甚至可以通过 AtAt 指令指定 cargo 包依赖项(见下文)。

自定义任务执行方式。

cargo-task 使用一种名为 AtAt 的元数据格式 - 因为它使用了 @ 符号。

/*
@ct-default@ true @@
@ct-task-deps@
one
two
@@
*/

关于AtAt的一些了解

  • 协议: @key@ value @@
  • 作为键的第一个 @ 必须是行首的第一个字符。
  • 值以两个 @@ 结尾。
  • 值可以包含换行符,也可以单独一行。
  • 你可能希望将其放在Rust的注释块中 : )

这些指令将在解析 .cargo-task 软件包时从你的 main.rs 文件中读取。

默认任务。

/*
@ct-default@ true @@
*/

如果 cargo task 调用中任务列表为空,则将执行默认任务。

引导任务。

/*
@ct-bootstrap@ true @@
*/

引导任务将 始终 在任何任务列表任务之前执行。此外,在执行引导任务后,将重新加载 cargo-task 元数据。您可以使用此功能下载/安装/配置其他任务。

Cargo 依赖。

/*
@ct-cargo-deps@
num_cpus = "1"
serde = { version = "1", features = [ "derive" ] }
@@
*/

像在您的 Cargo.toml 中一样编写它们。

任务依赖。

/*
@ct-task-deps@
my-first-dependency
my-second-dependency
@@
*/

一个由空格分隔的任务列表,必须在当前任务之前运行。可以是单行或多行。

最低 cargo-task 版本。

/*
@ct-min-version@ 0.0.7 @@
*/

如果依赖功能,则要求至少达到最低版本的 cargo-task,以提示用户升级。注意,此指令与 @ct-bootstrap@ 结合使用时效果良好。

神奇的 cargo_task_util 依赖。

此模块将在构建时作为您的软件包根目录可用。要包含它,只需在您的 main.rs 文件中添加一个 mod 指令。具有与此模块相同的 pub 内容的软件包依赖项将在运行时可用。此依赖项将自动添加到脚本类型任务中。

要将其添加到软件包类型任务,只需在您的 Cargo.toml 中包含此依赖项。

[dependencies]
cargo_task_util = "*"
/*
@ct-default@ true @@
*/

use cargo_task_util::*;

fn main() {
    // cargo task metadata env helper
    let env = ct_env();

    // print out some cool cargo-task metadata
    // (this does the same thing as `cargo task ct-meta`)
    println!("{:#?}", env);

    // also includes cargo-task special log helpers
    ct_warn!("ahh, a warning! {:?}", std::time::SystemTime::now());
}

配置任务和 cargo_task_util 软件包以进行直接执行。

因此,您想直接运行 cargo 任务?cargo_task_util 软件包被生成到您的 .cargo-task 目录中,但通过 .cargo-task/.gitignore 文件被 git 忽略。您可以通过删除 .gitignore 中的行来将软件包检入版本控制。

由于 Windows 路径的一个奇怪之处,我们需要使用工作区级别的 [patch] 指令来使此依赖项正常工作。

如果您想有一个根工作区 Cargo.toml,您可以在项目的根目录中创建一个,并包含所有您的软件包和任务软件包。

如果您想要将任务软件包保留在单独的工作区中,您可以在 .cargo-task 目录中放置一个工作区 Cargo.toml 文件。(您还需要从您的 .cargo-task/.gitignore 中删除该行)

此示例针对 .cargo-task/Cargo.toml 工作区。如果您的软件包根目录是不同的目录,您将需要调整路径。

[workspace]
members = [
    "cargo_task_util",
    "my_task_crate",
]

[patch.crates-io]
cargo_task_util = { path = "cargo_task_util" }

导出环境变量以配置其他任务。

cargo_task_util::CTEnv 还包括导出环境变量的实用程序。

如果您只使用rust的std::env::set_var函数,变量将只对当前任务执行设置,但其他任务将看不到它。

相反,您可以使用cargo_task_util::CTEnv::set_env函数。

您可能想在“引导”任务中这样做,以便它对后来运行的其它任务可用。

/*
@ct-bootstrap@ true @@
*/

mod cargo_task_util;
use cargo_task_util::*;

fn main() {
    // cargo task metadata env helper
    let env = ct_env();

    // set a variable that will be available in other tasks.
    env.set_env("MY_VARIABLE", "MY_VALUE");
}

无运行时依赖