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

Luk*_* In 6 xcode dependency-management static-linking cocoapods

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

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

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

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

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

    pod 'MBProgressHUD',            '0.9'

    link_with 'PodDummy'
end
Run Code Online (Sandbox Code Playgroud)

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


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

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

我想只包括pod文件中的主项目,并让子项目手动引用标题的"Pods"目录.

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

  1. https://github.com/CocoaPods/CocoaPods/issues/1335
  2. https://github.com/CocoaPods/CocoaPods/issues/840
  3. iOS静态库+ CocoaPods和重复符号错误
  4. Kiwi和CocoaPods带有静态共享库

one*_*sec 0

CocoaPods 非常适合使用 Pod 的人。当您开发 pod 时,使用它会困难得多,或者更糟糕的是,当您与 (a) librar(y)ies 一起开发应用程序时,这些库都是 pods\xe2\x80\xa6 (也可能依赖于 pod)。

\n\n

你必须知道的是,CocoaPods 是用来解决依赖关系的。在我看来,你的问题是你完全绕过了这个功能,将你的 pod in dev 已经放在你的工作区中了!当然,如果您在项目目录中执行 \xe2\x80\x9cpod install\xe2\x80\x9d ,则 \xe2\x80\x99 将得到一堆依赖关系,其中包括 Pod 根据 Podfile 安装的内容和您自己的 pod 代码库就位于同一文件夹树中。

\n\n

我所做的就是单独开发 pod(这可能会或不依赖于其他 pod)。最好不要位于应用程序的同一个 \xe2\x80\x9cworkspace\xe2\x80\x9d 中。您可以使用演示应用程序开发您的 Pod。

\n\n

在主应用程序的目录中,我在 Podfile 中指出了我自己的 pod 的 \xe2\x80\x9cdevelop\xe2\x80\x9d 分支。因此,该应用程序的开发依赖于 Pod,就好像这些 Pod 已正式发布一样。只是它们也只是处于开发阶段。

\n\n

当然,它会迫使您将各个部分分开,当您需要更改应用程序的 pod 代码中的某些内容时,这不太好。

\n\n

两种可能性(都不是很好)。首先,更改您的 pod,然后在您的应用程序文件夹中创建 \xe2\x80\x9cpod update\xe2\x80\x9d。

\n\n

其次,直接在应用程序工作区中使用 pod 代码(pod 代码已通过 pod update 命令导入)。一旦满意,将修改向后移植到原始 pod 代码以进行提交。

\n\n

很多来来回回,但我还没有找到比这更好的\xe2\x80\x99。

\n