主要观点:Rust 的target
目录磁盘使用量是常见问题,在去年调查中是第三大紧迫问题,虽基于“从源代码构建一切”模式且dev
配置文件默认启用调试信息和增量编译,但target
目录难变“精简”小,仍有办法减少其大小,本文介绍新方法。
关键信息:
- 编译不同模式下
target
目录大小不同,增量编译和调试信息会占大量磁盘空间,且编译 Rust crate 时会生成元数据和对象代码,pipelining 技术可重叠编译提高编译时间但会导致磁盘空间冗余(每个库有两份元数据副本,dylib
也含元数据)。 - 去年
@bjorn3
提议引入编译器标志-Zembed-metadata=no
避免元数据重复,今年作者完成实现并在 Cargo 中实现支持-Zno-embed-metadata
,使用后.rlib
文件只存“元数据存根”,其余在.rmeta
文件,能减少target
目录大小,在release
模式或无调试信息和增量编译时效果更明显,还能稍减 Rust 编译器工具链标准库.so
文件大小。 - 考虑到可能是向后兼容性破坏,计划在
nightly
工具链默认使用新行为一段时间以发现潜在问题,再改为可选择退出(原默认是包含元数据),可在rustc
和Cargo
跟踪问题中观察其状态。
重要细节: - 以
hyperqueue
项目为例,不同优化、增量编译和调试信息组合下target
目录大小不同。 - 实现
-Zno-embed-metadata
需结合--emit=metadata
,并传递.rmeta
文件路径给最终链接命令,Cargo 中也需相应支持。 - 若要尝试可使用近期
rustc
和 Cargo 并通过cargo +nightly build -Zno-embed-metadata
构建项目,可参考脚本进行基准测试,尝试后可在 Reddit 分享结果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。