使用cocoapods管理静态库中的依赖项

时间:2014-10-01 14:01:45

标签: xcode cocoapods dependency-management static-linking

我在一个app上使用CocoaPods,其中工作区由一个主应用程序项目组成,一些静态库作为子项目,每个都有自己的依赖项。静态库在编译时链接到主项目中,主要作为封装和组织代码的手段。

出现了一个问题,CocoaPods将依赖项链接到子项目的静态库中。如果这些静态库中的两个或多个具有相同的依赖关系,则它们不能同时链接到主项目中,因为这样做会导致重复的符号。

我目前的解决方法是创建一个"虚拟"每个子项目中的目标,并将其设置为pod文件中的链接目标。真正的目标使用CocoaPods生成的xcconfig文件,而不会链接任何依赖项。

虽然这确实有效,并且是我能找到的最简单的解决方案,但它仍然带来了在每个项目中拥有虚拟目标的额外不必要的负担,例如:

xcodeproj 'MyApp/MyApp.xcodeproj'
target :'MyApp' do
    xcodeproj 'MyApp/MyApp.xcodeproj'

    pod 'MBProgressHUD',            '0.9'

    link_with 'PodDummy'
end

这种方法的另一个缺点是仍然需要在主项目中指定所有依赖项,以便它们与最终的可执行文件链接。


所以我的问题是:如何在静态库项目中使用CocoaPods,而不将依赖项链接到二进制文件中?

或者更好的是:我是否可以仅在静态库子项目中指定依赖项,并让CocoaPods找出主项目中需要链接的内容,解决过程中的重复项?

我想要只在pod文件中包含主要项目,并且让子项目手动参考" Pods"标题目录。

过去似乎已经围绕这个问题进行了一些讨论,但我看不出它是什么,如果有的话。相关讨论是:

  1. https://github.com/CocoaPods/CocoaPods/issues/1335
  2. https://github.com/CocoaPods/CocoaPods/issues/840
  3. iOS Static Library + CocoaPods and the duplicate symbols error
  4. Kiwi and CocoaPods with a static shared library

1 个答案:

答案 0 :(得分:0)

CocoaPods适用于使用pod的用户。在开发pod时使用它会更加困难,或者更糟糕的是,当你开发一个应用程序以及(a)librar(y),这些都是pods(也可能还取决于pod)。

你必须知道的是CocoaPods来解决依赖关系。在我看来,你的问题是你完全绕过了这个功能,让你的pod已经在你的工作区中了!当然,如果你在项目目录中进行“pod安装”,你将会在Pod将根据Podfile安装的内容和你自己的pod代码库之间的相同文件夹树中获得一堆依赖关系。

我所做的是分开开发豆荚(可能与否取决于其他豆荚)。最好不要在应用程序的同一“工作区”中。您可以使用演示应用程序开发pod。

在主应用程序的目录中,我在Podfile中指出了我自己的pod的“develop”分支。因此,该应用程序正在开发与pods的倾向,就好像这些pod正式发布。除了他们只是在开发中。

它迫使你当然要分开,当你需要更改你的应用程序的pod代码中的某些东西时,这不是很好。

两种可能性(它们都不是很好)。首先,更改您的pod,然后在您的app文件夹中进行“pod update”。

其次,将pod代码直接播放到应用程序工作区(pod代码已由pod update命令导入)。并且一旦满意,就将修改恢复到原始pod代码以进行提交。

很多来回,但我找不到比这更好的了。