使用 -Zno-embed-metadata 来减小 Cargo 目标目录的大小

主要观点:Rust 的target目录磁盘使用量是常见问题,在去年调查中是第三大紧迫问题,虽基于“从源代码构建一切”模式且dev配置文件默认启用调试信息和增量编译,但target目录难变“精简”小,仍有办法减少其大小,本文介绍新方法。
关键信息

  • 编译不同模式下target目录大小不同,增量编译和调试信息会占大量磁盘空间,且编译 Rust crate 时会生成元数据和对象代码,pipelining 技术可重叠编译提高编译时间但会导致磁盘空间冗余(每个库有两份元数据副本,dylib也含元数据)。
  • 去年@bjorn3提议引入编译器标志-Zembed-metadata=no避免元数据重复,今年作者完成实现并在 Cargo 中实现支持-Zno-embed-metadata,使用后.rlib文件只存“元数据存根”,其余在.rmeta文件,能减少target目录大小,在release模式或无调试信息和增量编译时效果更明显,还能稍减 Rust 编译器工具链标准库.so文件大小。
  • 考虑到可能是向后兼容性破坏,计划在nightly工具链默认使用新行为一段时间以发现潜在问题,再改为可选择退出(原默认是包含元数据),可在rustcCargo跟踪问题中观察其状态。
    重要细节
  • hyperqueue项目为例,不同优化、增量编译和调试信息组合下target目录大小不同。
  • 实现-Zno-embed-metadata需结合--emit=metadata,并传递.rmeta文件路径给最终链接命令,Cargo 中也需相应支持。
  • 若要尝试可使用近期rustc和 Cargo 并通过cargo +nightly build -Zno-embed-metadata构建项目,可参考脚本进行基准测试,尝试后可在 Reddit 分享结果。
阅读 11
0 条评论