【Rust日报】2024-04-02 如何编写一个既是 bin 又是 lib 的项目

💡 原文中文,约1300字,阅读约需4分钟。
📝

内容提要

本文讨论了在Rust项目中同时包含lib.rs和main.rs文件的技巧,使得一个包既可以是库又可以是二进制文件。作者尝试使用Cargo的optional dependencies和features来实现依赖分离,但效果不如预期。最终建议创建两个独立的包,一个用于库,一个用于二进制文件。

🔎

延伸解读

为何不推荐单包同时提供 lib 和 bin

文章指出,虽然一个包可以同时包含 lib.rs 和 main.rs,但通过 optional dependencies 和 features 分离依赖的效果并不理想。default features 可能影响库用户的体验,因为用户可能无意中启用二进制所需的依赖。作者最终建议创建两个独立包,以便为库和二进制分别设置特性和依赖,避免相互干扰。

Cargo 的现状与未来改进

文章提到 Cargo 团队已经意识到单包同时作为库和二进制时依赖管理的痛点,并有一些提案正在准备中。这意味着未来 Cargo 可能会提供更好的原生支持。但就目前而言,作者建议如果不是为了尝试新方法,最好还是创建两个包,以规避现有机制的局限性。

对开发者的实践启示

对于需要同时发布库和可执行文件的 Rust 项目,直接使用两个独立包是更稳妥的选择。这样可以分别为库和二进制指定不同的依赖和特性,避免因 default features 导致库用户被迫引入不必要的依赖。如果坚持单包方案,需仔细测试 feature 组合,并关注 Cargo 后续提案的进展。

❓

Q&A

如何在Rust项目中同时使用lib.rs和main.rs文件?

可以通过在Rust项目中同时包含lib.rs和main.rs文件,使得一个包既可以是库又可以是二进制文件。

使用Cargo的optional dependencies和features有什么问题?

尝试使用Cargo的optional dependencies和features来实现依赖分离的效果不如预期,可能会影响库的用户体验。

为什么建议创建两个独立的包?

建议创建两个独立的包,一个用于库,另一个用于二进制文件,以便为两者设置不同的特性和依赖。

default features对库的用户体验有什么影响?

default features可能会影响库的用户体验,因此在设计时需要谨慎考虑。

Cargo团队对这个问题有什么反应?

Cargo团队意识到这个问题,并有一些提案正在准备中。

如果不想尝试新方法,应该怎么做?

如果不是为了尝试新方法,最好还是创建两个包,一个用于库,一个用于二进制文件。

🏷️

标签

➡️

继续阅读