如何创建一个CocoaPods podspec,其依赖项存在于Specs之外?

Nic*_*rge 49 cocoapods

我有一个已经存在于CocoaPods/Specs中的库的公共分支.在Podfile中,我可以通过执行以下操作来引用此分叉的pod:

pod 'CoolLibrary', :git => 'git@github.com:myname/CoolLibrary-Forked.git', :commit => 'abcdef1234567890abcdef1234567890'
Run Code Online (Sandbox Code Playgroud)

我试着把它放在我的MyLibrary.podspec:

s.dependency 'CoolLibrary', :git => 'git@github.com:myname/CoolLibrary-Forked.git', :commit => 'abcdef1234567890abcdef1234567890'
Run Code Online (Sandbox Code Playgroud)

但是请收到以下错误消息:

-> 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.
Run Code Online (Sandbox Code Playgroud)

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

all*_*loy 69

podspecs不允许这样做,因为允许其他podspecs几乎不可能定义它们所依赖的包和/或其他包可能因意外的API差异而中断.

例如,考虑两个依赖于AFNetworking的pod,但是一个指定外部源位置(Pod A),而另一个指定最小版本要求(Pod B):

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

现在有几个潜在的问题:

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

我希望这清楚地表明为什么我们不能为podspecs引入一种方法来默默地破坏版本的承诺.不过,从Podfile您允许覆盖任何荚的源位置,因为它是谁在控制和不应该有任何最终用户(应用程序开发者)意外断裂.

  • 很好的解释.我理解这个问题,但那么正确的做法是什么呢?让我们说我分叉了一个回购,因为我需要一些改变.我不能以略微不同的名称将它添加到Cocoapods并将我作为podspec中的作者.但是我在Cocoapods的另一个项目中需要它作为s.dependency. (4认同)
  • @Hons通过覆盖你的Podfile中的pod**的位置**,就像OP用`CoolLibrary`做的那样,_ beforefore_你指定任何实际依赖于`CoolLibrary`的依赖. (4认同)
  • 这是可怕的设计。从gradle学习一些东西。 (2认同)

ort*_*rta 5

依赖关系非常简单,只能定义 Pod 的名称和版本说明符。它们不能使用与 Podfile 中的依赖项相同的扩展名进行扩展。