在nightly版本中减少目标目录大小

在nightly版本中减少目标目录大小

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

Cargo将在nightly频道默认启用`-Zembed-metadata=no`,以减少目标目录中重复的crate元数据,从而降低磁盘占用。实测显示,在release配置下可节省约30%空间,dev配置下约5%。用户可通过命令行或配置文件选择退出。若运行顺利,未来将推广至稳定版。

🔎

延伸解读

节省空间的实际效果

根据文章中的实测数据,启用`-Zembed-metadata=no`后,在release配置下目标目录可节省约30%的空间,而在dev配置下仅节省约5%。这是因为dev配置默认启用增量编译和调试信息,这些内容占用的空间远大于crate元数据。因此,该优化对release构建效果更明显,对开发构建帮助有限。

潜在影响与注意事项

文章指出,在绝大多数情况下,使用`-Zembed-metadata=no`不会带来明显变化,但如果你手动链接`.rlib`文件,可能需要额外提供对应的`.rmeta`文件,否则会报错。此外,Cargo目前不会将`.rmeta`文件作为最终构建产物提升到`target/<profile>`目录,需要从嵌套的构建目录中查找。

如何选择退出

如果你在使用nightly版本时遇到问题,可以通过多种方式选择退出该默认行为:在Cargo命令行传递`-Zembed-metadata=yes`,设置环境变量`CARGO_UNSTABLE_EMBED_METADATA=true`,或在`.cargo/config.toml`中配置`[unstable] embed-metadata = true`。注意,该标志是Cargo标志,而非RUSTFLAGS中的编译器标志。

Q&A

Cargo nightly 版本中如何减少 target 目录大小?

Cargo 将在 nightly 频道默认启用 -Zembed-metadata=no 特性,该特性会停止将 crate 元数据嵌入 .rlib 文件,从而减少重复数据,降低 target 目录的磁盘占用。

-Zembed-metadata=no 是如何工作的?

在编译库 crate 时,Cargo 使用流水线编译,会先生成 .rmeta 文件(包含元数据),最终生成的 .rlib 文件同时包含代码和元数据,导致元数据重复存储。使用 -Zembed-metadata=no 后,编译器不再将元数据放入 .rlib 文件,从而减小 .rlib 文件大小,减少磁盘占用。

启用 -Zembed-metadata=no 后,target 目录能节省多少空间?

实测显示,在 release 配置下可节省约 30% 空间,在 dev 配置下约 5%。对于 Cargo 自身,最佳情况下可减少约 33%,接近 300 MiB。

如果遇到问题,如何退出 -Zembed-metadata=no 默认设置?

可以通过三种方式退出:1) 向 Cargo 传递命令行参数 -Zembed-metadata=yes;2) 设置环境变量 CARGO_UNSTABLE_EMBED_METADATA=true;3) 在 .cargo/config.toml 文件中设置 [unstable] embed-metadata = true。

使用 -Zembed-metadata=no 后,手动链接 .rlib 文件时需要注意什么?

如果手动链接 .rlib 文件,可能需要同时传递对应的 .rmeta 文件给编译器(使用 --extern 标志),否则会报错:'only metadata stub found for `rlib` dependency'。另外,Cargo 不会自动提升 .rmeta 文件到最终构建目录,需要从嵌套构建目录中查找。

-Zembed-metadata=no 会推广到稳定版吗?

如果 nightly 频道上运行顺利,没有出现意外问题,Cargo 团队计划先稳定编译器端的特性,然后在稳定工具链上也默认启用 embed-metadata=no 行为。

🏷️

标签

➡️

继续阅读