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

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

Cargo本身使用额外的configure/make功能来处理配置、系统依赖性检测、运行和安装.

对于任何其他使用Cargo构建的软件来说,这是正确的方法吗?这意味着是否有计划通过Cargo本身来完成这些任务,或者Cargo只是作为依赖项获取和编译的工具,而不需要对已安装的DEP/安装进行任何配置/检测?

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

推荐答案

cargo install

Rust 1.5开始,您可以使用cargo install在系统上安装binary crates.您可以从以下位置安装 crate :

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

前两个选项还可以指定:

  • 用 crate .io,可以使用--vers指定 crate 版本.
  • 使用git存储库,可以使用--branch来设置要从中安装的分支,使用--tag来指定要使用的标记版本,使用--rev来从特定提交进行构建.

Installation location:

可以通过以下方法将cargo install配置为安装在自定义目录中,按优先顺序(最高优先):

  • 通过--root /path/to/directory(这条路径是相对的)
  • 通过设置$CARGO_INSTALL_ROOT环境变量
  • 通过设置install.root configuration key
  • 通过设置$CARGO_HOME环境变量(这将影响cargo install的安装目录)

如果没有上述内容,cargo将在~/.cargo/bin个集装箱中安装 crate .

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

Uninstallation

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

Example: I want to use rustfmt:

我可以在 crate 上使用这个版本.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

最新的提交有一个bug!

  • 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

Rust相关问答推荐

什么样的 struct 可以避免使用RefCell?

为什么类型需要在这个代码中手动指定,在rust?

rust 蚀生命周期 行为

捕获FnMut闭包的时间不够长

无法从流中读取Redis请求

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

作为1字节位掩码的布尔值 struct

如何go 除多余的(0..)在迭代中,当它不被使用时?

为什么Deref类特征不构成?

减少指示ProgressBar在Rust中的开销

带引脚和不带引脚的比较功能

为什么这个闭包没有实现Fn?

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

枚举的利基优化如何在 Rust 中工作?

内部值发生变化时 Rc 的行为

没有分号的返回表达式的性能是否比使用返回更好?在Rust ?

从 Cranelift 发出 ASM

tokio async rust 的 yield 是什么意思?

如何制作具有关联类型的特征的类型擦除版本?

为什么可以从不可变 struct 的字段中移动?