【Rust日报】2024-04-02 如何编写一个既是 bin 又是 lib 的项目
内容提要
本文讨论了在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团队意识到这个问题,并有一些提案正在准备中。
如果不想尝试新方法,应该怎么做?
如果不是为了尝试新方法,最好还是创建两个包,一个用于库,一个用于二进制文件。