myfreax

Javascript开发者的Rust教程cargo依赖管理

cargo是Rust的包管理器,其操作类似于node的npm。Cargo默认从crates.io下载第三方依赖crate箱子,crate的中文翻译箱子

6 min read
By myfreax
Javascript开发者的Rust教程cargo依赖管理

cargo是Rust的包管理器,其操作类似于node的npm。Cargo默认从crates.io下载第三方依赖crate箱子,crate的中文翻译箱子。您可以像在npmjs.com上一样注册帐户并发布模块。

你可以对cargo命令做一些快捷的映射,您几乎可以将您在npm使用的命令转换为Rust的cargo的命令。

在node.js你有package.json管理依赖的模块或者库。在Rust中使用Cargo.toml。管理你的Rust项目的依赖。Cargo的配置文件格式是toml,而不是你经常使用npm的package.json的JSON格式。

Cargo使用Cargo.toml文件来了解要下载哪些依赖的模块/库、如何运行测试以及如何构建您的项目。

在本教程中,将说明使用cargo初始化项目,安装依赖/模块,cargo install全局安装,cargo test运行测试,cargo publish发布模块,运行任务,使用cargo-workspaces创建多个独立Rust项目,cargo-expand展开rust宏代码或者编译后的代码。

初始化项目

在node.js中是npm init。在Rust中,你有两个命令可以初始化一个Rust项目。分别是cargo initcargo new

cargo initcargo new区别是cargo init在当前目录初始化项目。cargo new在新目录中初始化项目,当运行cargo new my-rust时my-rust目录将会被创建。

Cargo安装依赖/模块

在Node.JS中是安装依赖/模块的命令是npm install dep-name。但在Rust的cargo并没有快捷的子命令让你添加依赖。

但是如果您可以安装cargo-edit来扩展cargo的子命令。这样你就可以使用cargo子命令添加依赖。

例如,cargo add regex@0.1.41 --dev将添加依赖到开发依赖中。cargo add gcc --build将添加依赖到构建依赖中。除此之外还为您提供了四个新命令addrmupgradeset-version

全局安装

在node.js中是npm install --global。在Rust中对应的命令是cargo install

使用cargo install将在cargo的bin目录中下载、构建和存储可执行文件。如果您是通过官方的默认方式安装rust/rustup

那么这些文件将放置在用户的家目录中,对于Linux/Mac OS用户通常是~/.cargo/bin。由于安全问题,请不要使用sudo cargo install

运行测试

在Node.JS中运行测试命令通常是npm test,因为很多项目都是如此声明在Package.json中。在Rust中对应的命令cargo test

cargo test命令通过Cargo自动运行单元测试、集成测试和文档测试。Rust测试有很多内容,我们将在稍后的文章中介绍。

发布模块

在Node.JS中发布模块的命令是npm publish。在Rust中对应的命令是cargo publish

如果需要发布模块。您需要首先在crates.io上注册一个帐户并设置身份验证信息。cargo会帮助您发布模块到crates.io

运行任务

在Node.JS中运行任务的命令是npm run xxx。在Rust中,您有用于常见任务的命令,但你可以添加自己的任务。

在Node.JS中,您可能会使用npm run start来运行您的服务器或可执行文件。但0在 Rust中,你可以使用cargo run。您还可以使用cargo run --example xxx来自动运行示例代码。

在Node.JS中,您可能会使用npm run benchmarks来分析您的代码。在Rust中对应的命令是cargo bench.

在Node.JS中,您可能会使用npm run build来运行webpack、tsc或其它命令。在Rust中对应的命令是cargo build

在Node.JS中,您可能会使用它npm run clean来删除临时文件或生成的文件。在Rust中对应的命令是cargo clean它会清除你的构建文件夹,默认情况下target目录。

在Node.JS中,您可能会使用npm run docs来生成文档。在Rust中对应的命令是cargo doc

对于代码生成或预构建步骤,cargo 支持在构建之前运行的构建脚本。默认情况下涵盖了您的许多用例,但是对于其它事情,您都必须自己解决。

npm的内置任务运行器是Makefile。这是您在JavaScript项目中很少看到的原因之一。

在Rust生态系统中,你就没那么幸运了。Makefile仍然很常见,但你可以使用just 来简化运行指定的命令。这相当于为Makefile命令创建快捷方式。

just它是一个不错的选择,也是流行的解决方式。Makefile它在保持相似语法的同时消除了它的许多奇怪之处。

以下cargo命令将会安装just到你的~/.cargo/bin目录中,即全局安装:

$ cargo install just

cargo-workspaces

cargo workspacescargo ws简化了工作区及其成员的创建和管理。它的灵感来自 Node.JS项目的lerna

cargo workspaces最有价值的功能之一是自动发布工作区,用已发布的版本替换本地依赖。

以下cargo命令将会安装cargo-workspaces到你的~/.cargo/bin目录中,即全局安装:

$ cargo install cargo-workspaces

cargo-expand

在Rust中的宏是非常普遍的存在,以至于您的第一个Hello World应用程序中很多逻辑都将被打包成一个宏。

宏可让你您不重复编写代码,但它会使代码难以阅读和排除故障。cargo expand可帮助你展开rust的宏。

以下cargo命令将会全局安装cargo-expand,安装后您可以运行cargo expand [item]以打印rustc编译器编译后生成的源代码。

$ cargo install cargo-expand

cargo expand采用模块命名,而不是文件路径。运行cargo expand main不会扩展src/main.rs,它会展开项目根目录中main函数。

它使用通用rust模块方式展开指定的代码,要指定在文件中找到模块,如src/some_module/another.rs,您将运行cargo expand some_module::another。

如果你运行cargo new创建的项目,然后使用cargo expand命令来测试,这可能就是你的src/main.rs样子。println!()是一个宏。

$ cargo expand main
fn main() {
    {
        ::std::io::_print(::core::fmt::Arguments::new_v1(
            &["Hello, world!\n"],
            &match () {
                () => [],
            },
        ));
    };
}
cargo expand生成的代码