【问题标题】:Overlapping pod dependencies重叠的 pod 依赖项
【发布时间】:2016-07-10 17:51:19
【问题描述】:

我正在使用 cocoapods 0.39。我将 Cocoa Touch 框架“MyFramework”作为一个单独的目标添加到我的 Swift 项目中。该框架使用 Firebase 作为 Cocoapod 依赖项。我在应用程序中使用 MyFramework。当我尝试构建应用程序时,出现多个错误:

class … is implemented in both …/MyFramework.framework/MyFramework and …/MyApp.app/MyApp. One of the two will be used. Which one is undefined.

我了解此错误的含义,但我无法修复它。如果我从 MyApp 目标中删除 Firebase,那么我不能在应用程序中使用 MyFramework,因为它依赖于它。这看起来像是一个常见问题,但不幸的是我无法让它工作。

我的 Podfile 看起来像这样:

use_frameworks!

target 'MyApp' do
    pod 'Firebase'
end

target 'MyAppTests' do

end

target 'MyFramework' do
    pod 'Firebase'
end

target 'MyFrameworkTests' do
    pod 'Firebase'
end

【问题讨论】:

    标签: swift firebase cocoapods


    【解决方案1】:

    您正在链接 Firebase 两次。

    您可以在 Podfile 中使用 inherit! :search_patchs 指令(需要 Cocoapods 1.0 或更高版本)让 MyApp 知道依赖关系,而无需实际链接它们:

    use_frameworks!
    
    target 'MyFramework' do
        pod 'Firebase'
        pod 'FirebaseAnalytics'
    
        target 'MyApp' do
            inherit! :search_paths
    
        end
    end
    

    这要求您在Podfile明确声明依赖关系,以使它们在MyApp 目标中可用。例如,添加 pod 'Firebase' 不会使 using FirebaseAnalytics 在您的应用程序中可用。


    您还可以将MyFramework 转换为 CocoaPod 依赖项,让 CocoaPods 为您处理依赖项。为此,请为您的框架创建一个 Podspec 文件,如下所示:

    Pod::Spec.new do |s|
    
    # Meta data
    s.name         = "MyFramework"
    s.version      = "1.0.0"
    s.platform     = :ios
    s.ios.deployment_target = '8.0'
    s.summary      = "-"
    s.homepage     = "-"
    s.license      = { :type => "MIT" }
    s.author       = { "Me" => "-" }
    s.platform     = :ios
    s.ios.deployment_target = '8.0'
    s.source       = { :path => "MyFramework" }
    
    # Source configuration
    s.source_files  = "MyFramework/**/*.swift"
    s.resources = "MyFramework/**/*.{png,jpeg,jpg,storyboard,xib,strings}"
    
    s.requires_arc = true
    
    # Dependencies
    
    # Firebase for iOS
    s.dependency 'Firebase', '~> 3.0'
    
    end
    

    然后,您可以在您的应用程序Podfile 中向MyFramework 添加开发依赖项并删除Firebase 依赖项:

    target 'MyApp' do
        pod 'MyFramework', :path => '.'
    end
    

    如果需要,将. 更新到MyFramework.podspec 位置。

    【讨论】:

    • 感谢您的回答。这次我不想将 MyFramework 用作 CocoaPod。你能解释一下“post_install hook”吗?
    • @sash 显式声明依赖关系并添加inherit! search_paths 使标头在编译时可用。请参阅我的更新以获取仅限 Podfile 的解决方案。
    • 仅供参考,此答案适用于 Cocoapods 1.0.0 及更高版本。对于 0.39,你真的想升级,但如果你需要保持 0.39,你想使用link_with
    • @HugoTunius 我应该更清楚地说明第一个选项需要 0.39,感谢您指出这一点
    • 不幸的是,解决方案应该是 0.39。 @HugoTunius你能解释一下link_with解决方案吗?我试过了,但我仍然看到错误/警告。
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2021-03-06
    • 2015-06-18
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多