我已经使用 Rust 超过六个月了。我远非专家,但我偶然发现了很多很多的陷阱,并在此过程中学到了很多很多的东西;我希望这些东西对那些正在学习这种很容易成为我最喜欢的编程语言的人有所帮助。
这是我为像我这样的 Rust 新手撰写的迷你系列文章的第三篇。你可以在以下文章中找到我其他关于 Rust 的探索:
我计划写更多文章,本文是关于 Rust 的包管理器 Cargo。我很惭愧地承认,我没有像应该的那样广泛地使用 Cargo 的强大功能,但研究这篇文章让我更好地了解了其命令的功能。事实上,在我开始更详细地研究之前,我甚至没有意识到某些可用的选项。
对于我的七个顶级 Cargo 命令列表,我假设您对 Cargo 有基本的了解——您已经安装了它,并且可以使用 cargo new <package>
等命令创建一个包。我可以提供更多命令(有很多选项!),但这是我的“幸运 7”。
- cargo help <command>: 您始终可以使用
--help
选项找到有关命令的更多信息。Cargo 本身也是如此:cargo --help
将为您快速介绍可用的内容。要获得有关命令的更多信息(更像是手册页),您可以尝试使用命令new
。例如,cargo help new
将提供有关cargo new
的扩展信息。这种行为在命令行工具中非常典型,尤其是在 Linux/Unix 世界中,但它在 Cargo 中得到了非常明确的实现,您可以使用它快速获取大量信息。 - cargo build --bin <target>: 当您的包中有多个 .rs 文件,但您只想构建其中一个文件时,会发生什么?我有一个名为
test-and-try
的包,我用它来测试和尝试功能、特性、命令和 crate。它大约有十几个不同的文件。默认情况下,cargo build
将尝试构建所有文件,并且由于它们通常处于各种修复状态(其中一些会产生大量警告,有些甚至没有完全编译),这可能非常麻烦。相反,我在我的Cargo.toml
文件中为每个文件放置一个部分,如下所示:
[[bin]] name = "warp-body" path = "src/warp-body.rs"
然后,我可以使用
cargo build --bin warp-body
来构建仅此文件(以及任何依赖项)。然后,我可以使用类似的命令运行它:cargo run --bin warp-body
。 - cargo test: 我承认;我没有像应该的那样勤奋地在我的 Rust 代码中创建自动化测试。这是因为我目前主要编写概念验证而不是生产代码,而且还因为我懒惰。也许改变这种行为应该是新年决心,但是当我确实开始编写测试时,Cargo 会在那里帮助我(就像它帮助您一样)。您需要做的就是在 .rs 文件中的测试代码之前添加一行:
#[cfg(test)]
当您运行
cargo test
时,Cargo 将“神奇地”找到这些测试,运行它们,并告诉您是否有问题。与这里的许多命令一样,您会在网上找到更多信息,但尤其值得熟悉 Rust By Example 部分 中此功能的基础知识。 - cargo search <query>: 这是我在研究这篇文章之前甚至不知道存在的命令之一——如果我早点知道它,它本可以为我节省过去几个月的大量时间。它搜索 Crates.io,Rust 的公共(和有时维护的)包存储库,并告诉您哪些包可能是相关的。(如果您愿意,可以使用直观命名的
--registry
选项指定不同的存储库。)我最近一直在做一些关于非字符串数据的网络协议的工作,所以我一直在使用 Concise Binary Object Representation (CBOR)。这是我使用cargo search
时发生的情况:
(Mike Bursell, CC BY-SA 4.0)
这太棒了!当然,我也可以将此命令与 grep 等工具结合使用,以进一步缩小搜索范围,例如:
cargo search cbor --limit 70 | grep serde
。 - cargo tree: 剧透警告:这一个可能会吓到您。您可能已经注意到,当您第一次构建新包,或者当您添加新依赖项,或者只是执行
cargo clean
然后cargo build
时,您会看到 Cargo 从相关存储库中拉取并编译它们时打印出的长长的 crate 列表。但是,您如何提前知道将拉取哪些 crate 以及它将是什么版本?更重要的是,您如何知道新 crate 将哪些其他依赖项拉入您的构建?答案是cargo tree
。只是提醒您:对于任何稍微复杂的项目,您都可以预期会有很多依赖项。我尝试使用cargo tree | wc -l
来计算我正在处理的一个小型项目的依赖 crate 数量,结果得到了 350!我尝试提供一个示例,但它显示效果不佳,所以我建议您自己尝试一下——为大量的输出做好准备! - cargo clippy: 如果您尝试运行此命令但它不起作用,那是因为我在最后两个命令中作弊了一点:您可能必须显式安装它们(取决于您的设置)。对于这个命令,运行
cargo install clippy
——您会很高兴您这样做了。Clippy 是 Rust 的 linter;它会检查您的代码,寻找通过删除或更改命令来减少和清理代码的方法。我尝试在每次git commit
之前运行cargo clippy
——部分原因是由于我倾向于提交到的 Git 存储库具有拒绝需要 linting 的文件的自动操作,部分原因是为了使我的代码总体上更整洁。这是一个例子:
(Mike Bursell, CC BY-SA 4.0)
让我们面对现实;这不是一个主要问题(尽管如果您在未编译的代码上运行 clippy,它也会发现错误),但这是一个简单的修复,所以您不妨处理它——通过删除代码或在变量前加上下划线。由于我计划稍后使用此变量,但尚未实现使用它的函数,因此我将执行后一种修复。
- cargo readme: 虽然它不是最惊天动地的命令,但这是另一个非常有用的命令(并且,与
cargo clippy
一样,您可能需要显式安装)。如果您在 .rs 文件中添加相关行,则可以从 Cargo 输出 README 文件。例如,我在我的 main.rs 文件的开头有以下几行:
(Mike Bursell, CC BY-SA 4.0)
我将
cargo readme
命令的输出留给读者作为练习,但让我感兴趣的是添加了许可证(或“License”,如果您坚持)声明。使用它为您的用户创建简单的文档,并以最小的努力让他们满意(始终是一个好方法!)。
在本文中,我只是略微触及了 Cargo 的功能;上面所有命令实际上都比我描述的更强大。我衷心建议您花一些时间研究 Cargo,并找出它如何让您的生活更美好。
本文最初发表于 Alice, Eve, and Bob,并经作者许可转载。
2 条评论