代码之家  ›  专栏  ›  技术社区  ›  Nick Forge

我如何创建一个CocoaPods podspec,它有一个存在于Specs之外的依赖项?

  •  58
  • Nick Forge  · 技术社区  · 10 年前

    我有一个已经存在于CocoaPods/Specs中的库的公共分叉。在Podfile中,我可以通过这样做来引用这个分叉的pod:

    pod 'CoolLibrary', :git => 'git@github.com:myname/CoolLibrary-Forked.git', :commit => 'abcdef1234567890abcdef1234567890'
    

    我试着把这个放在我的 MyLibrary.podspec :

    s.dependency 'CoolLibrary', :git => 'git@github.com:myname/CoolLibrary-Forked.git', :commit => 'abcdef1234567890abcdef1234567890'
    

    但会收到以下错误消息:

    -> MyLibrary.podspec
     - ERROR | The specification defined in `MyLibrary.podspec` could not be loaded.
    
    
    [!] Invalid `MyLibrary.podspec` file: [!] Unsupported version requirements. Updating CocoaPods might fix the issue.
    

    是否可以以这种方式在.podspec中指定依赖项(即,对于具有podspec但不在CocoaPods/Specs中的pod)?

    2 回复  |  直到 10 年前
        1
  •  81
  •   alloy    10 年前

    podspec不允许这样做,因为这样做会使其他podspecs几乎不可能定义它们依赖的包和/或其他包可能因为意外的API差异而损坏。

    例如,考虑两个依赖AFNetworking的Pod,但其中一个指定了外部源位置(Pod A),而另一个只指定了最低版本要求(Pod B):

    • 吊舱A: s.dependency 'AFNetworking', :git => 'https://arbitrary/location'
    • 吊舱B: s.dependency 'AFNetworking', '> 2'

    现在有几个潜在的问题:

    1. 目前,我们不知道Pod A回购中的版本是什么,直到我们下载它,如果无法满足对AFNetworking(例如Pod B)的各种常见依赖性,这将浪费大量时间。
    2. 但更糟糕的是,如果Pod A 与其他pods(例如Pod B)的依赖版本要求相匹配,但AFNetworking代码实际上来自分叉的源位置,它改变了Pod B所依赖的一些基本API。这将默默地打破CocoaPods试图做出的承诺。

    我希望这能清楚地说明为什么我们不能为podspec引入一种方式来默默地打破版本承诺。然而,从您的播客文件中 允许覆盖任何pods源位置,因为最终用户(应用程序开发人员)是控制者,不应该有 想不到的 破损

        2
  •  5
  •   orta    10 年前

    依赖项为 very simple ,只能定义Pod的名称和版本说明符。它们不能使用与Podfile中的依赖项相同的扩展名进行扩展。