代码之家  ›  专栏  ›  技术社区  ›  Allen Hsu

如何在多个框架子项目中使用CocoaPods

  •  32
  • Allen Hsu  · 技术社区  · 8 年前

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

    假设主项目是main_APP,两个子项目是FRAMEWORK_A和frameworks_B。

    MAIN_APP需要FRAMEWORK_A和frameworka_B,frameworkb也需要framerame_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来构建frameworka_B的设置,并添加了frame_A和frameworkb来构建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并从frameworks_A继承pod依赖项。但似乎我无法使用多个依赖项来完成,例如:

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

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

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

    3 回复  |  直到 4 年前
        1
  •  7
  •   Johannes Fahrenkrug    8 年前

    这是一个很好的问题,我也遇到过类似的情况。这是我的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中更容易实现这些依赖。我知道这并不能真正回答你的问题,但可能会有所帮助。

        2
  •  5
  •   iwasrobbed    6 年前

    我想你也可以通过制造 FrameworkA FrameworkB 进入本地(静态库)pod,它将为您消除所有重复,并将其正确集成到主机应用程序中。

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

    • master 分支显示了重复的类和伞形框架,就像您所拥有的一样
    • deduped branch将内部动态框架转换为本地POD(作为静态LIB),以消除重复并仍然链接到依赖项中
        3
  •  0
  •   Tim Kofoed    5 年前

    我不完全确定你的问题是否与我的问题相同,但我将把我的解决方案留在这里,以防有人有类似的问题。

    我有一个包含多个子项目的项目,我用它来模块化我的代码(并可能准备提取到我自己的私有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