今天,我很高兴地宣布 crates.io 上线并准备就绪。该网站是发现/下载 Rust crate 的中心位置,Cargo 今天就可以开始向其发布内容。在接下来的几个月里,我们请求勇敢的早期采用者 帮助我们 对注册表进行实战测试。
在 Rust 本身于明年年初稳定之前,注册表依赖项需要经常更新。生产用户可能希望在那之前继续使用 git 依赖项。
什么是 Cargo?
Cargo 是一个 Rust 的包管理器,用 Rust 编写。管理依赖项是一个根本困难的问题,但幸运的是,在过去的十年中,包管理器的设计取得了很大进展。Cargo 由 Carl Lerche 和 Yehuda Katz 设计,它遵循了像 Bundler 和 NPM 这样的成功案例的传统。
-
Cargo 利用 crates.io 来促进一个蓬勃发展的 crate 社区,这些 crate 可以轻松地相互操作,并能持续多年。
-
Cargo 使开发人员无需担心管理依赖项,并确保所有协作者都构建相同的代码。
-
Cargo 让您的依赖项说明它们应该如何构建,并为您管理整个构建过程。
Cargo 上的社区
为了了解 Cargo 如何实现其目标,让我们来看看它的一些核心机制。
声明依赖项
Cargo 使依赖第三方代码就像依赖标准库一样容易。当使用 Cargo 时,每个 crate 都会有一个相关的 清单 来描述它自身及其依赖项。添加新的依赖项现在就像在清单中添加一行一样简单,这种便利使得 Cargo 在短短几个月内能够实现一个庞大且不断增长的 Rust 项目和库的网络,这在以前是根本不可能的。
然而,仅靠 Cargo 本身并不能完全解决问题。发现依赖项仍然很困难,并且确保这些依赖项在未来几年内可用也不能保证。
crates.io
为了配合 Cargo,中央 crates.io 网站充当发布和发现库的单一位置。该存储库充当 crate 发布版本的永久存储,以确保项目始终可以使用多年后完全相同的版本进行构建。到目前为止,Cargo 的用户主要只是直接从 GitHub 源代码存储库下载依赖项,但主要来源现在将转移到 crates.io。
其他编程语言社区在这种形式的中央存储库方面已经相当成功。例如,rubygems.org 是您的 Bundler 依赖项的一站式商店,而 npmjs.org 仅在本月就已下载超过 6 亿次!我们希望 crates.io 为 Rust 发挥类似的作用,作为 Rust 在 1.0 版本的长期稳定性故事 的关键基础设施。
版本控制和可重现的构建
在过去的几年里,语义化版本控制 的概念越来越受欢迎,作为一种让库开发人员在进行重大更改时轻松清晰地与用户沟通的方式。语义化版本控制的核心思想很简单:每个新版本都分为次要版本或主要版本,并且只有主要版本才能引入破坏性更改。Cargo 允许您为依赖项指定版本范围,默认含义为“兼容”。
在指定版本范围时,应用程序通常最终会请求单个 crate 的多个版本,而 Cargo 通过选择所请求的每个主要版本的最高版本(“稳定代码”)来解决此问题。这高度鼓励使用稳定发行版,同时仍然允许不稳定代码的重复(例如 pre-1.0 和 git)。
一旦计算出依赖项集及其版本,Cargo 就会生成一个 Cargo.lock
来编码此信息。然后,将此“锁定文件”分发给应用程序的协作者,以确保正在构建的 crate 在不同时间、机器和环境中保持不变。
构建代码
到目前为止,我们已经了解了 Cargo 如何促进社区项目的发现和重用,同时管理要使用的版本。现在,Cargo 只需要处理实际编译所有这些代码的问题!
凭借对其构建的 Rust 代码的深刻理解,Cargo 能够提供一些不错的标准功能以及一些 Rust 特有的功能
-
默认情况下,Cargo 会尽可能并行地构建多个 crate。这不仅适用于并行构建的上游依赖项,还适用于本地 crate 的项目,如测试套件、二进制文件和单元测试。
-
Cargo 支持开箱即用的单元测试,包括 crate 本身以及集成测试的形式。这甚至包括示例程序,以确保它们不会失效。
-
Cargo 为依赖关系图中的所有 crate 生成文档,它甚至可以运行 Rust 的文档测试,以确保文档中的示例保持最新。
-
Cargo 可以在编译任何 crate 之前运行一个 构建脚本,以执行代码生成、编译本机依赖项或检测本地系统上的本机依赖项等任务。
-
Cargo 支持开箱即用的交叉编译。只需指定一个
--target
选项即可完成交叉编译,Cargo 将管理诸如为正确的平台编译插件和其他构建依赖项等任务。
还有什么要推出的?
crates.io 的推出是推动 Cargo 生态系统向前发展的关键一步,但故事并没有就此结束。crates.io 的使用是基于稳定的编译器架构的,该编译器应该 即将推出!crates.io 还有许多扩展,例如托管文档服务或 CI 构建基础设施钩子,可以使用 crates.io API 构建。
这只是 crates.io 的开始,我很高兴开始从一个位置找到所有 Rust crate。我迫不及待地想看到 1.0 版本的注册表是什么样子,我只能想象 1.0 之后它会是什么样子!