我是个新手,我刚刚通过cargo new my_project
创建了一个新项目.我注意到cargo提供了以下两个命令行选项:
- 编译:编译一个本地包及其所有依赖项
- rustc:编译一个包及其所有依赖项
我推测后者可以用于在我的机器上编译任何项目,而前者只能在当前工作目录中使用.对吗?还有其他区别吗?在没有附加参数的情况下运行这两个命令可以得到完全相同的输出.
我是个新手,我刚刚通过cargo new my_project
创建了一个新项目.我注意到cargo提供了以下两个命令行选项:
我推测后者可以用于在我的机器上编译任何项目,而前者只能在当前工作目录中使用.对吗?还有其他区别吗?在没有附加参数的情况下运行这两个命令可以得到完全相同的输出.
我们可以比较不同命令的执行情况.所以我们先用
git clone https://github.com/rust-lang/cargo.git
然后将cargo build
和cargo rustc
的实现与
diff -u -w cargo/src/bin/cargo/commands/build.rs cargo/src/bin/cargo/commands/rustc.rs
由此可以看出,cargo build
和cargo rustc
都是围绕this个内部Cargo 功能的薄包装:
pub fn compile<'a>(ws: &Workspace<'a>, options: &CompileOptions) -> CargoResult<Compilation<'a>> {
// ...
}
但在expose 的选项方面存在差异.事实上,你可以在cargo_compile.rs
条注释的顶部阅读该注释,该注释定义了该函数:
//! This module contains the entry point for starting the compilation process
//! for commands like `build`, `test`, `doc`, `rustc`, etc.
换句话说,cargo build
和cargo rustc
并不是围绕同一编译入口点的唯一薄包装.
那么,为什么cargo背后的人会 Select 这样做呢?为什么不使用一个cargo compile
个带有大量标志的命令来完全公开底层实现呢?
显然,这必须是以一种易于记录和理解的方式来组织事情的问题,以满足Rust生态系统的各种目标受众.
例如,大多数Rust生态系统的新手都不想expose 在调整编译器标志的可能性之下.因此,在一开始只向cargo build
及其文档公开它们是有意义的,因为它具有特殊的编译选项风格.
一旦他们成为更高级的用户,他们会发现,他们可以通过cargo rustc
个用户对编译过程产生更详细的影响.