web-dev-qa-db-fra.com

La classe X est implémentée dans <framework> et <application>, l'une des deux sera utilisée, laquelle n'est pas définie

Je reçois cet avertissement:

Class X is implemented in both <framework> and <application> one of the two will be used, which one is undefined

Cet avertissement est couvert un peu sur le Web, mais je n'ai rien trouvé qui réponde au problème spécifique que j'ai.

Scénario

J'ai construit MyFramework et MyApplication (en tant qu'application de test/démo pour MyFramework).

MyFramework utilise un CocoaPod (que j'appellerai CoolPod), que je veux également utiliser dans MyApplication (et il est raisonnable de supposer qu'un consommateur de MyFramework le ferait également).

J'ai besoin de pouvoir distribuer MyFramework en tant que .framework (pour une source fermée). Cependant, cela signifie que MyFramework intègre CoolPod dans sa bibliothèque compilée.

Maintenant, lorsque j'importe MyFramework et CoolPod dans MyApplication, j'obtiens ce conflit (produisant l'avertissement ci-dessus) car les classes de CoolPod sont déjà incluses dans la bibliothèque de MyFramework (car CoolPod est intégré).

Nous avons donc cette structure:

CoolPod -> MyFramework \
                        MyApplication
               CoolPod /

Question

Comment éviter ce conflit?

  • Existe-t-il un moyen pour que MyApplication fournisse CoolPod à MyFramework?
  • Dois-je diriger les en-têtes de CoolPod via MyFramework?

J'ai pensé à inclure les en-têtes de CoolPod (mais pas sa bibliothèque) dans MyApplication, mais cela semble trop complexe pour ce qui devrait être un cas simple.

Toute aide est grandement appréciée, cela me bloque vraiment en ce moment.

Merci,

Indigo

41
Zenton

Ma solution était de prendre le code source de la cacao pod et de créer un Cocoa Touch Framework pour cela. J'ai ensuite lié le framework à mon API et à mon application de test. Ce n'est pas génial mais c'est tout ce que je pouvais faire rapidement. Je crois que Cocoapods travaille sur la prise en charge de cadres de sorte que cette solution puisse devenir obsolète assez tôt.

Mon entreprise utilise également gradle pour les dépendances (Java) et les scripts de génération. J'ai donc créé une tâche de construction groovy/gradle qui construit mon framework et mes frameworks de support (frameworks cocoapod) et crée un framework universel à partir d'eux. Ensuite, il zippe tous les cadres. Cela signifie que je peux distribuer un Zip avec toutes les exigences. Ce n'est évidemment pas la meilleure façon de distribuer (nous allons passer à la distribution via Cocoapods avec des dépendances sur nos frameworks fermés), mais c'est rapide à configurer.

2
Zenton

Pour les bibliothèques statiques à source fermée, nous recommandons cocoapods-packager . Je ne suis pas sûr que ce soit un support pour les frameworks.

2
orta

Si vous voulez une solution rapide - ajoutez simplement votre projet MyFramework en tant que sous-projet au projet MyApplication. Vous pouvez toujours utiliser des cosses cacao à la fois pour votre framework et votre application de test (mais incluez votre bibliothèque "commune" avec des pods uniquement au projet de framework)

1
Robert Fogash

Une solution consiste à activer use_frameworks! dans le Podfile du framework. Ensuite, vous pouvez toujours compiler votre framework et intégrer votre framework dans l'application cible. Les messages d'avertissement disparaîtront (c'est simplement parce que les pods du framework sont conformes à un autre framework, mais vous n'intégrez pas celui-ci dans votre application cible. Ensuite, votre application fera référence au binaire qui lui est propre.)

Mais ce n'est pas une bonne solution pour deux raisons: 1. Vous devez vous assurer que l'application cible inclut les pods nécessaires dont le framework a besoin. 2. L'application peut utiliser une version de pod différente du framework. Si le framework et l'application font référence au même binaire pod, cela peut entraîner un plantage.

Je doute qu'il existe une bonne solution à ce problème.

1
syshen

Vous pouvez créer un Podspec pour votre MyFramework avec CoolPod comme dépendance.


Votre MyFramework.podspec ressemblera à quelque chose comme:

Pod::Spec.new do |spec|
  spec.name          = 'TestFW'
  spec.version       = '1.0.0'
  spec.license       = { :type => 'BSD' }
  spec.homepage      = 'https://github.com/user/TestFW'
  spec.authors       = { 'Auther Name' => '[email protected]' }
  spec.summary       = 'Testing FW Pod with Test App'
  spec.source        = { :git => 'https://github.com/user/TestFW.git' }
  spec.module_name   = 'TestFW'
  spec.ios.source_files   = 'TestFW/*.Swift'

  spec.dependency 'CoolPod'
end

Et le podfile de votre MyApplication ressemblera à ceci:

target 'TestApp' do
  use_frameworks!

  pod 'CoolPod'
  pod 'TestFW'
end
0
Shahrukh Alam