web-dev-qa-db-fra.com

Comment créer une podspec CocoaPods dont la dépendance existe en dehors des spécifications?

J'ai un fork public d'une bibliothèque qui existe déjà dans CocoaPods/Specs. Dans un Podfile, je peux référencer ce pod fourchu en faisant ceci:

pod 'CoolLibrary', :git => '[email protected]:myname/CoolLibrary-Forked.git', :commit => 'abcdef1234567890abcdef1234567890'

J'ai essayé de mettre ça dans mon MyLibrary.podspec:

s.dependency 'CoolLibrary', :git => '[email protected]:myname/CoolLibrary-Forked.git', :commit => 'abcdef1234567890abcdef1234567890'

Mais obtenez le message d'erreur suivant:

-> 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.

Est-il possible de spécifier une dépendance dans un .podspec de cette manière (c'est-à-dire pour un pod qui a un podspec, mais qui n'est pas dans CocoaPods/Specs)?

45
Nick Forge

Cela n'est pas autorisé à partir des podspecs, car autoriser ainsi rendrait pratiquement impossible pour les autres podspecs de définir le package dont ils dépendent et/ou d'autres packages pourraient se casser en raison de différences d'API inattendues.

Par exemple, considérez deux pods qui dépendent de AFNetworking, mais l'un spécifie un emplacement de source externe (pod A) tandis que l'autre spécifie uniquement une exigence de version minimale (pod B):

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

Maintenant, il y a quelques problèmes potentiels:

  1. À ce stade, nous n'avons aucune idée de la version du référentiel "Pod A" jusqu'à ce que nous le téléchargions, ce qui représente une perte de temps considérable au cas où les diverses dépendances communes à AFNetworking (par exemple, "Pod B") ne seraient pas satisfaites.
  2. Mais ce qui est encore pire, c'est que "Pod A" correspond aux exigences de version de dépendance des autres pods (par exemple "Pod B"), mais le code AFNetworking est en fait à partir d'un emplacement source fourchu et cela change certaines API essentielles dont dépend le "Pod B". Cela rompra silencieusement la promesse que CocoaPods essaie de faire.

J'espère que cela montre clairement pourquoi nous ne pouvons pas introduire un moyen pour les podspecs de rompre silencieusement les promesses de version. Cependant, à partir de votre Podfile, vous êtes autorisé à remplacer l'emplacement source de tout pod, car c'est l'utilisateur final (le développeur de l'application) qui contrôle et il ne devrait pas y avoir de inattend casse.

68
alloy

Les dépendances sont très simples , n'ayant que la capacité de définir le nom et le spécificateur de version d'un Pod. Ils ne peuvent pas être étendus avec les mêmes extensions qu'une dépendance dans le Podfile.

2
orta