天天看点

【Rust 小技巧】指定 target 输出目录

作者:不秃头程序员
【Rust 小技巧】指定 target 输出目录

在 Rust 编程语言中,target 目录是由 Cargo(Rust 的包管理和构建工具)自动生成的。它主要用于存放构建输出的产物文件和相关的编译期产生的中间文件等。但是 target 目录往往会非常大,即使一个简单的 hello world 程序,就已经达到 9 MB 了。

【Rust 小技巧】指定 target 输出目录

可能一个比较简单的项目,会达到 1 GB 多。甚至有些网友调侃——如果电脑硬盘太小,可能学不了 Rust。

0x01 指定 target 目录

另外当电脑中的 Rust 项目太多时,无法管理 target 目录。其实我们可以指定所有项目统一的 target 目录。下面将以 Windows 操作系统为例演示。

首先在 C:\Users\用户名\.cargo\ 目录下,找到 config.toml 文件。如果在该目录下没有 config.toml 文件,则需要创建该文件。如下图所示:

【Rust 小技巧】指定 target 输出目录

注意:config 文件也有可能没有扩展名,如 config,又或者是其它扩展名,如 config.txt,配置文件的扩展名不重要,重要的是文件名称必须是 config。

在文件中添加下面的配置信息:

[build]
target-dir = "D:/my-target"           

上面的配置是指定所有项目的统一 target 目录为 D:/my-target。如下图:

【Rust 小技巧】指定 target 输出目录

我们再次编译项目,查看项目根目录和 D:/my-target 目录,如下图:

【Rust 小技巧】指定 target 输出目录

可以看到,在项目的工程目录已经没有 target 目录,真正的 target 目录已经被我们指定为 D:/my-target 目录了。

0x02 target 目录有什么

下面是一个简单项目的 target 目录,让我们看下它会包含什么呢?

【Rust 小技巧】指定 target 输出目录

target 目录包含以下几个子目录和文件:

target/debug:

  • 存储调试模式下构建的可执行文件和库文件。
  • 包含中间编译产物,如对象文件(.o 文件)和生成的二进制文件。

target/release:

  • 存储发布模式下构建的可执行文件和库文件。
  • 与调试模式相比,发布模式进行了优化,生成的二进制文件通常更小且运行速度更快。

target/doc:

  • 存放项目文档(通常是通过 cargo doc 命令生成的 HTML 文档)。

target/.fingerprint:

  • 存储构建的指纹文件,用于跟踪哪些文件已经被编译以及是否需要重新编译。

target/package:

  • 存放项目打包后的文件,通常用于 cargo publish 命令发布到 crates.io 仓库。

其他临时文件和目录:

  • 包括构建缓存、生成的汇编代码等。

0x03 指定 target 目录的优缺点

统一存放 target 文件既有优点也有缺点:

优点

缓存复用:

如果多个项目使用相同的依赖库,通过指定一个共享的 target 目录,可以复用编译缓存,减少重复编译的时间,大幅提升构建效率。

管理方便:

通过将编译输出集中到一个特定目录,可以更方便地管理和清理编译输出文件。当 Rust 项目过多时,我们可以随时清理 target 文件。

缺点

多个项目共享同一个 target 目录可能会因为不同的依赖版本而产生冲突,当遇到冲突时需要及时清理 target 目录。

0x04 小结

总体上讲,指定 target 目录可以带来显著的构建效率提升,但也需要考虑潜在的版本冲突问题,这个需要根据实际的项目来取舍。