使用Rust Cargo作为构建系统的软件的配置/安装计划方式是什么?

26

现有的构建系统通常都有某种安装目标,这些目标可以手动使用(安装到/usr/local或其他用户可访问的位置),也可以自动使用(通过基于二进制的发行版的软件包构建系统或基于源代码的软件包管理器)。

使用Cargo的软件的预期安装方式是什么?类似make install的模拟应该是什么样子的?

Cargo本身使用额外的configure/make工具来处理配置、检测系统依赖项、运行cargo build和安装等操作。

对于使用Cargo构建的任何其他软件来说,这是正确的方法吗?这意味着是否有计划由Cargo本身来完成这些任务,还是将Cargo仅用作提取依赖关系和编译而不进行任何配置/检测已安装依赖项/安装的工具?

或者,是否有计划添加此功能?


这个功能尚未实现,我不知道是否有计划。我会在IRC上联系人们(#cargo on irc.mozilla.org)。 - huon
dbaupp:谢谢,我已经联系过他们了。所以我的问题不是关于已经实现了什么,而是关于打算/计划中的内容。我已经编辑了问题以使其更加清晰明了。 - Jaŭhien Piatlicki
是的,计划中的正是我所问的。 - huon
2个回答

34

cargo install

Rust 1.5开始,您可以使用cargo install二进制包安装到您的系统上。您可以从以下位置安装包:

  • crates.io(默认),使用cargo install crate_name
  • 任何git存储库,使用cargo install --git repository_url
  • 任何目录,使用cargo install --path /path/to/crate

前两个选项还有其他可指定的选项:

  • 对于crates.io,您可以使用--vers指定包版本。
  • 对于git存储库,您可以使用--branch设置要安装的分支,--tag指定要使用的标记版本,以及--rev从特定提交构建。

安装位置:

cargo install 可以通过以下方法配置以安装到自定义目录,按优先级排序(最高优先级在前):

  • 通过传递 --root /path/to/directory(此路径可以是相对路径)
  • 通过设置 $CARGO_INSTALL_ROOT 环境变量
  • 通过设置 install.root 配置键
  • 通过设置 $CARGO_HOME 环境变量(这将影响 cargo install 的安装目录以外的更多内容)

如果上述任何一项都不存在,则 cargo 将在 ~/.cargo/bin 中安装 crates。

在上述所有情况下,输出文件实际上将放置在 bin 子目录中(例如,--root /path/to/directory 实际上会将输出放置在 /path/to/directory/bin 中)。

卸载

cargo uninstall 可以用于删除先前安装的 crate。如果您安装了多个同名的 crate,则可以指定 --root 仅删除该目录中的版本。

示例:我想使用 rustfmt

我可以使用 crates.io 上的版本:

  • cargo install rustfmt

我喜欢使用原始版本:

  • cargo install rustfmt --vers 0.0.1

我希望将其安装在 /opt/rust_crates 中:

  • cargo install rustfmt --root /opt/rust_crates

我真的需要使用最新版本:

  • cargo install --git https://github.com/rust-lang-nursery/rustfmt.git

最新提交中有一个错误!

  • cargo install --git https://github.com/rust-lang-nursery/rustfmt.git --rev f5bd7b76e0185e8dd37ae6b1b5fb5e11187f0b8c

我真的希望使用 git 子模块来处理依赖关系的版本:

  • cargo install --git https://github.com/rust-lang-nursery/rustfmt.git --branch submods

我已经克隆了它并进行了一些编辑:

  • cargo install --path ~/my_rustfmt

实际上,我坚持完全手动进行格式化:

  • cargo uninstall rustfmt

如果您在我发布此内容后很长时间才阅读它,并且发现有过时的地方,请留下评论让我知道。 - user1038550

7

(本回答适用于想要分发自己的程序的开发人员,而不是收到 Cargo 项目并需要在自己的系统上安装的用户;那是 Toby 的回答所涉及的领域)。

除了Toby's Answer之外:

Cargo 的安装功能并不是分发 Rust 程序的主要方式。它仅设计用于向其他 Rust 开发人员分发。使用此功能存在一些缺点:

  • Cargo 要求最终用户首先安装完整的 Rust 工具链。
  • 用户必须在本地构建程序,这可能会很慢,特别是在 Rust 中。
  • 没有支持升级程序一旦安装(除非使用附加工具)。
  • 目前没有办法包含资产,如文档。
  • 除非传递了标志给cargo install,否则软件包将仅为当前用户安装。
换句话说,cargo install 是 Cargo 程序的 make && sudo make install;除非主要面向 Rust 程序员,否则这不是分发 Rust 程序的理想方式。
那么正确的方式是什么呢?
让我们看看其他选择。
手动分发 tarball/zip 您可以通过简单地使用 cargo build --release 复制 cargo install 的效果。这将在 target/release/crate_name 中放置一个(大多数情况下,请参见下面的缺点)静态链接的 crate 二进制文件,可以将其重新打包成 .tar.gz.zip 并分发给其他用户。
优点:
  • 不需要用户安装 Rust 或自行构建程序。
  • 允许开发者将资产复制到 tarball/zip 中,并随程序本身一起分发。
缺点:
  • 安装.tar.gz/.zip是不标准的,通常不被大多数用户认为是理想的。
  • 如果创建需要除libc之外的任何系统依赖项,则会因难以理解的错误而无法加载它们。
  • 这需要开发人员手动构建每个版本和平台组合的软件包才能发布。

使用CI服务构建发布版

可以使用基于云的CI服务重新创建这些方法。例如,使用Travis CI,您可以使用Trust项目自动部署,方式与从tarball相同,但只需要标记即可自动完成。

优点:

(所有tarball的优点,加上)

  • 开发人员不必手动发布程序,只需打一个标签即可。
  • 作为副作用,可以同时为程序支持的每个软件包构建。

缺点:

  • 如果流程没有正确运行,由于对服务器的控制有限,调试过程可能会很令人沮丧。
  • 构建过程与服务绑定,这意味着如果发布时服务停机,就可能错过版本发布。
  • 使用Trust或类似工具,你仍然最终要分发一个.tar.gz/.zip,这意味着用户仍然会遇到不便,而且缺乏系统依赖管理。

除了Travis,还可以考虑AppveyorGitHub Actions作为可能的构建平台。

提供软件包

这被认为是许多终端用户的理想方法,也是分发任何程序(不仅是Cargo程序)的标准方式。这几乎消除了tarball方法的所有问题,但也存在一些问题。

优点:

  • 像其他程序一样包含在系统中。
  • 可以提交到Linux发行版仓库中,以便通过一个命令安装程序。
  • 允许更新、卸载和资产包含。
  • 跟踪系统依赖项,对GUI应用特别有帮助。

缺点:

  • 迄今为止这些选项中最复杂的。
  • 需要为每个支持的平台单独构建一个软件包(可以通过CI来缓解,但是以这种方式设置将更加复杂)。

这种方法最好使用其他工具处理:

  • cargo-deb:为Debian和Ubuntu构建软件包。
  • cargo-rpm:为Fedora、Red Hat和CentOS构建软件包。
  • cargo-aur:为Arch Linux构建软件包。
  • cargo-wix:制作Windows安装程序包。

这些通常是开发人员运行的工具,用于创建用于生成软件包的文件。有关更多信息,请参阅它们自己的文档。

Source: https://rust-cli.github.io/book/tutorial/packaging.html 的来源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接