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

时间:2016-12-23 03:04:53

标签: ios xcode dependencies 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

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

所有代码编译良好,但运行MAIN_APP时崩溃,因为它无法加载PodB的框架。

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

顺便说一句,当pod install时,我收到了警告:

  

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

     

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

据我所知,我可以将嵌套目标用于主机目标,例如:

target :FRAMEWORK_A
    target :MAIN_APP
    end
end

因此CocoaPods将设置MAIN_APP以使用FRAMEWORK_A并从FRAMEWORK_A继承pod依赖项。但似乎我不能用多个依赖项来做,如:

target :FRAMEWORK_A
    target :MAIN_APP
    end
end
target :FRAMEWORK_B
    target :MAIN_APP
    end
end

因为目标:MAIN_APP不能被声明两次。

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

3 个答案:

答案 0 :(得分:2)

这是一个很好的问题,我也遇到过类似情况。这是我的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

正如您所看到的,我没有使用框架,我使用abstract_target将它们组合在一起。我希望在CocoaPods中更容易做这些依赖。我知道这并没有真正回答你的问题,但它可能会有所帮助。

答案 1 :(得分:1)

我认为您也可以通过将FrameworkAFrameworkB放入本地(静态库)窗格中来解决此问题,它将为您删除重复数据,并将其正确集成到主机应用程序中。

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

  • master分支显示重复的类和类似的伞形框架
  • deduped分支将内部动态框架转换为本地pod(作为静态库)以进行重复数据删除并仍然链接依赖关系

答案 2 :(得分:0)

我不能完全确定您的问题与我的问题相同,但是如果有人遇到类似问题,我将在这里保留我的解决方案。

我有一个项目,其中包含多个子项目,这些项目用于模块化我的代码(并可能准备提取到我自己的私有pod中)。 我遇到的一个问题是,将一个外部Pod导入到一个子项目中,并由于“图像丢失”而收到一个dyld错误。

我找到了这篇中型文章,从中得出结论,我必须始终将pod包含在主项目中,以便子项目能够找到它们。我的两个外部Pod均未在主项目中使用。 (https://medium.com/@akfreas/how-to-use-cocoapods-with-your-internal-ios-frameworks-192aa472f64b) (我可能没有尽可能正确或有效地编写Podfile,但这似乎可以解决我的问题)

因此,我的podfile如下:

abstract_target "RandomName" do

    target "MainProject" do
        inherit! :complete
        workspace './MainProject.xcodeproj'
        pod 'Moya', '~> 13.0'
        pod 'KeychainSwift', '~> 17.0'
    end

    target "ModuleA" do
      project './ModuleA/ModuleA.xcodeproj'
      workspace './ModuleA/ModuleA.xcodeproj'
      pod 'Moya', '~> 13.0'
    end

    target "ModuleB" do
      project './ModuleB/ModuleB.xcodeproj'
      workspace './ModuleB/ModuleB.xcodeproj'
      pod 'KeychainSwift', '~> 17.0'
    end
end