如何将CocoaPods与多个Framework子项目一起使用

All*_*Hsu 27 xcode dependencies ios cocoapods

首先,我打开了use_framework!在Podfile中.

假设主项目是MAIN_APP,两个子项目是FRAMEWORK_A和FRAMEWORK_B.

MAIN_APP需要FRAMEWORK_A和FRAMEWORK_B,FRAMEWORK_B也需要FRAMEWORK_A.

所有项目/目标都使用CocoaPods来管理第三方库.

现在,我的Podfile看起来像:

target :MAIN_APP do
    project 'MAIN_APP'
    pod 'PodA'
end

target :FRAMEWORK_A do
    project 'FRAMEWORK_A'
    pod 'PodB'
end

target :FRAMEWORK_B do
    project 'FRAMEWORK_B'
    pod 'PodC'
end
Run Code Online (Sandbox Code Playgroud)

我手动添加了FRAMEWORK_A来构建FRAMEWORK_B的设置,以及FRAMEWORK_A和FRAMEWORK_B来构建MAIN_APP的设置.

所有代码都编译得很好,但是在运行MAIN_APP时崩溃是因为它无法加载PodB的Framework.

我知道我也可以手动将PodB添加到MAIN_APP和FRAMEWORK_B,但是可以在Podfile中定义这种目标依赖吗?

顺便说一下,pod install我收到了警告:

[!] Podfile包含框架目标,Podfile不包含主机目标(嵌入框架的目标).

如果此项目用于进行框架开发,则可以忽略此消息.否则,将目标添加到嵌入这些框架的Podfile中,以使此消息消失(例如测试目标).

据我所知,我可以使用嵌套目标作为主机目标,如:

target :FRAMEWORK_A
    target :MAIN_APP
    end
end
Run Code Online (Sandbox Code Playgroud)

因此CocoaPods将设置MAIN_APP以使用FRAMEWORK_A并从FRAMEWORK_A继承pod依赖项.但似乎我不能用多个依赖项来做到这一点:

target :FRAMEWORK_A
    target :MAIN_APP
    end
end
target :FRAMEWORK_B
    target :MAIN_APP
    end
end
Run Code Online (Sandbox Code Playgroud)

因为target:MAIN_APP不能声明两次.

有没有更好的解决方案,而不是将pod依赖项定义为Podfile中的函数并包含在所有目标中?

Joh*_*rug 7

这是一个很好的问题,我也遇到过类似的情况。这是我的 PodFile:

platform :ios, '8.0'

workspace 'mygreatapp.xcworkspace'

project 'app/MyGreatApp/MyGreatApp.xcodeproj'
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'

abstract_target 'This can say whatever you want' do

    target 'MyGreatApp' do
        project 'app/MyGreatApp/MyGreatApp.xcodeproj'
        pod 'AFNetworking', '~> 2.6.0'
        pod 'PromiseKit', '~> 1.5'
        pod 'PromiseKit/Join'
        pod 'KVOController', '~> 1.0'
        pod 'FLAnimatedImage', '~> 1.0'
        pod 'Crashlytics', '~> 3.3'
        pod 'SSZipArchive'
    end

    target 'MyGreatAppTests' do
        project 'app/MyGreatApp/MyGreatApp.xcodeproj'
        pod 'OCMock', '~> 3.1'
    end

    target 'MyGreatFramework' do
        project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
        pod 'SSZipArchive'
    end

    target 'MyGreatFrameworkTests' do
        project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
        pod 'OCMock', '~> 3.1'
    end

    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
      end
    end
end
Run Code Online (Sandbox Code Playgroud)

如您所见,我没有使用框架,而是使用 anabstract_target将它们组合在一起。我希望在 CocoaPods 中更容易实现这些类型的依赖。我知道这并不能真正回答你的问题,但它可能会有所帮助。

  • 我不确定这是否是一个实际的答案,而只是另一个示例 Podfile? (2认同)
  • 我的 Podfile 和你的一样。问题是当target 'MyGreatFramework' do pod 'Crashlytics' .`objc[15419]: Class xxx 在app和framework中都实现了,会使用两者之一。哪个未定义`,我在应用程序启动时收到警告。您有解决方案吗? (2认同)

iwa*_*bed 6

我认为您也可以通过制作本地(静态库)pod 来解决这个问题FrameworkAFrameworkB它会为您删除所有内容的重复项并将其正确集成到主机应用程序中。

示例: https: //github.com/rob-keepsafe/PodFrameworksIssue

  • master分支显示重复的类和伞框架,就像你一样
  • deduped分支将内部动态框架放入本地 Pod(作为静态库)以消除重复并仍然链接到依赖项