Cargo 的 build 和 rustc 命令有什么区别?

Pau*_*erg 9 rust rust-cargo

我是 Rust 的新手,我刚刚通过cargo new my_project. 我注意到cargo 提供了这两个命令行选项:

  • build:编译本地包及其所有依赖项
  • rustc:编译一个包及其所有依赖项

我认为后者可用于编译我机器上的任何项目,而前者只能在当前工作目录中使用。那是对的吗?还有其他区别吗?不带附加参数运行这两个命令会给我完全相同的输出。

nnn*_*mmm 6

工作目录没有区别。区别在于如何将编译器选项传递给rustc,其中许多选项 Cargo 不知道/公开:

cargo build [OPTIONS]:如果你想传递一个标志rustc,通常你不能在命令行上这样做,你需要使用RUSTFLAGS变量或编辑配置文件

cargo rustc [OPTIONS] [-- ARGS]OPTIONS可用的内容或多或少与 for 相同cargo build,但参数被传递给rustc. 所以你可以例如写cargo rustc --release -- -C overflow-checks=yes.


Ens*_*lic 6

差异

为了更好地掌握命令的不同之处,我们可以比较命令的实现。所以,我们首先克隆cargo 回购

git clone https://github.com/rust-lang/cargo.git
Run Code Online (Sandbox Code Playgroud)

然后比较的实现cargo build,并cargo rustc

diff -u -w cargo/src/bin/cargo/commands/build.rs cargo/src/bin/cargo/commands/rustc.rs
Run Code Online (Sandbox Code Playgroud)

由此,很容易看出,cargo buildcargo rustc都是围绕这个内部货物功能的薄包装:

git clone https://github.com/rust-lang/cargo.git
Run Code Online (Sandbox Code Playgroud)

但在暴露的选项类型上有所不同。事实上,人们可以在cargo_compile.rs定义该函数的顶部阅读此注释:

diff -u -w cargo/src/bin/cargo/commands/build.rs cargo/src/bin/cargo/commands/rustc.rs
Run Code Online (Sandbox Code Playgroud)

换句话说,cargo build并且cargo rustc不是围绕同一编译入口点的唯一瘦包装器。

为什么有不同的命令?

那么,为什么cargo背后的人会选择这样做呢?为什么不用一个cargo compile带有大量标志的单个命令来完全公开底层实现?

显然,它必须以易于记录和理解 Rust 生态系统的各种目标受众的方式组织事物。

例如,大多数 Rust 生态系统的新手都不想接触到调整编译器标志的可能性。因此cargo build,在开始时仅将它们及其文档及其特定的编译选项公开是有意义的。

一旦他们成为更高级的用户,他们就会发现使用cargo rustc.