(此答案适用于想要分发自己的程序的开发人员,而不是已收到 Cargo 项目并需要将其安装在自己的系统上的用户;这是 Toby 的答案的领域)。
Cargo 的安装功能并不是分发 Rust 程序的主要方式。它旨在仅用于分发给其他 Rust 开发人员。使用此功能有几个缺点:
- Cargo 要求最终用户首先安装整个 Rust 工具链。
- 用户必须在本地构建程序,这可能会很慢,尤其是在 Rust 中。
- 安装后不支持升级程序(无需额外工具)。
- (目前)没有办法包含资产,例如文档。
- 除非将标志传递给
cargo install
.
换句话说,cargo install
是make && sudo make install
Cargo 程序;这不是分发 Rust 程序的理想方式,除非它主要是为 Rust 程序员设计的。
那么正确的方法是什么?
让我们看看替代方案。
手动分发 tarball/zip
cargo install
您可以通过简单地使用来复制 的效果cargo build --release
。这将在 中放置一个(主要是,请参阅下面的缺点)静态链接的 crate 二进制文件target/release/crate_name
,并且可以将其重新打包成.tar.gz
or.zip
并分发给其他用户。
优点:
- 不需要用户安装 Rust 或自己构建程序。
- 允许开发人员将资产复制到 tarball/zip 中,并将它们与程序本身一起分发。
缺点:
- 安装
.tar.gz
/.zip
是非标准的,对于大多数用户来说通常不被认为是理想的。
- 如果 crate 需要任何系统依赖项超出
libc
,它将无法加载它们并出现难以理解的错误。
- 这需要开发人员为每个版本和平台组合手动构建要发布的包。
使用 CI 服务构建发布
可以使用基于云的 CI 服务重新创建任何这些方法。例如,使用Travis CI,您可以使用Trust项目以与 tarball 几乎相同的方式自动部署,但只需要一个标记即可自动部署。
优点:
(压缩包的所有优点,加上)
- 开发人员不必手动发布程序,他们只需要标记发布即可。
- 作为副作用,可以一次为程序支持的每个包构建。
缺点:
- 如果无法正常工作,调试过程可能会令人沮丧,因为对服务器的控制有限。
- 构建过程与服务相关联,这意味着如果服务在发布时关闭,则可能会错过发布。
- 使用 Trust 或类似工具,您最终仍会分发
.tar.gz
/ .zip
,这意味着仍然会给用户带来不便,并且缺乏系统依赖管理。
除了 Travis,请参阅Appveyor和GitHub Actions作为可能的构建平台。
提供一个包
这被认为是许多最终用户的理想方法,并且是分发任何程序的标准方式,而不仅仅是 Cargo 程序。这缓解了 tarball 方法的几乎所有问题,尽管它本身也存在一些问题。
优点:
- 像任何其他程序一样包含在系统中。
- 可以提交到 Linux 发行版存储库,以允许仅在一个命令中安装程序。
- 允许更新、删除和资产包含。
- 跟踪系统依赖关系,这对 GUI 应用程序特别有用。
缺点:
- 到目前为止,这些选项中最复杂的。
- 需要为每个受支持的平台单独构建一个包(这可以通过 CI 缓解,但以这种方式设置会更加复杂。)
这种方法最好使用其他工具来处理:
这些通常是由开发人员运行的工具,用于创建用于生成包的文件。有关更多信息,请参阅他们自己的文档。
来源:https ://rust-cli.github.io/book/tutorial/packaging.html