静态库依赖项的最佳实践

dea*_*rne 31 objective-c ios

我正在编写一个静态库,它依赖于其他库(在我的例子中是SBJSON和ASIHTTPRequest).

如果我编译这些外部依赖关系到我的库,然后我并不能拒绝那些在编译这些类其他库.由于我的目标是建立一套对我公司静态库,可以导入到任何新的应用程序,这些编译依赖于库显然不是一种选择.

有没有人有任何建议/最佳实践来创建具有共同依赖关系的共享静态库套件?

Ben*_*man 13

静态库只是目标文件的集合.在您的情况下,您不希望将SBJSON和ASIHTTPRequest的目标文件包含在静态库中 - 您希望将该作业保留在最终应用程序中.静态lib需要的唯一东西是SBJSON和ASIHTTPRequest的头文件.

由于这些项目都作为源文件(.h和.m文件)分发,因此您只需要告诉Xcode不要为静态库目标构建SBJSON/ASIHTTPRequest .m文件.

最简单的方法是只将这些项目的.h头文件导入Xcode项目.或者,您可以导入.h和.m文件,但要确保.m文件不包含在静态库目标的"编译源"构建阶段中

其他一些相关的SO主题:

如何使用共享静态库避免xcode中的"重复符号"错误?

重复符号:在静态库B中包含静态库A,在XCode项目中也包含库A和B.


Jas*_*ues 9

您可以使用像CocoaPodsVendorKit这样的依赖项管理器来引入所需的库,以及它所有的传递依赖项 - 库所依赖的库.

依赖管理器的任务是管理传递依赖中的任何冲突 - 例如,如果两个库都使用不同版本的SBJSON,它将解决该怎么做.您所要做的就是在配置文件中声明您想要的顶级库,它将确定需要哪些子库并将它们引入您的Xcode项目.

CocoaPods有一个很好的方法来管理它,通过将所有库作为源提取,然后将它们全部编译到一个静态库中 - 在一个单独的项目中.然后通过工作区将其链接到您的项目中.

VendorKit采用类似的方法,但使用单个项目文件.

CocoaPods和VendorKit都允许您轻松地将库发布到中央存储库.如果您愿意,CocoaPods允许您维护自己的中央仓库的私有或公共分支 - 即作为企业存储库.

大多数情况下,这会让你摆脱困境.在极少数情况下,您的库可能依赖于另一个公共库的非常特定的旧版本.在这种情况下,您可以使用工具重命名该库中的所有头/ impl文件以避免冲突.

[编辑]:截至2013年1月,还有一个新的竞争者 - Maven Xcode插件.