web-dev-qa-db-fra.com

Comment utiliser CocoaPods avec plusieurs sous-projets Framework

Tout d'abord, j'ai activé use_framework! dans Podfile.

Supposons que le projet principal est MAIN_APP et que les deux sous-projets sont FRAMEWORK_A et FRAMEWORK_B.

MAIN_APP nécessite FRAMEWORK_A et FRAMEWORK_B, et FRAMEWORK_B nécessite également FRAMEWORK_A.

Tous les projets/cibles utilisent CocoaPods pour gérer des bibliothèques tierces.

Pour l'instant, mon Podfile ressemble à:

target :MAIN_APP do
    project 'MAIN_APP'
    pod 'PodA'
end

target :FRAMEWORK_A do
    project 'FRAMEWORK_A'
    pod 'PodB'
end

target :FRAMEWORK_B do
    project 'FRAMEWORK_B'
    pod 'PodC'
end

J'ai ajouté manuellement FRAMEWORK_A pour créer les paramètres de FRAMEWORK_B et FRAMEWORK_A et FRAMEWORK_B pour créer les paramètres de MAIN_APP.

Tout le code se compile bien, mais lors de l'exécution de MAIN_APP, le programme plante car il ne peut pas charger Framework of PodB.

Je sais que je peux également ajouter manuellement PodB à MAIN_APP et FRAMEWORK_B, mais est-il possible de définir ce type de dépendance de cible dans Podfile?

Btw, quand pod install, j'ai eu l'avertissement:

[!] Le fichier podfile contient des cibles pour le cadre, pour lesquelles il ne contient pas de cibles hôtes (cibles qui intègrent le cadre).

Si ce projet concerne le développement de framework, vous pouvez ignorer ce message. Sinon, ajoutez une cible au fichier podfile qui incorpore ces frameworks pour que ce message disparaisse (par exemple, une cible de test).

Comme je le sais, je peux utiliser une cible imbriquée pour des cibles hôtes telles que:

target :FRAMEWORK_A
    target :MAIN_APP
    end
end

Ainsi, CocoaPods configurera MAIN_APP pour utiliser FRAMEWORK_A et héritera des dépendances de pod de FRAMEWORK_A. Mais il semble que je ne peux pas le faire avec plusieurs dépendances comme:

target :FRAMEWORK_A
    target :MAIN_APP
    end
end
target :FRAMEWORK_B
    target :MAIN_APP
    end
end

Parce que la cible: MAIN_APP ne peut pas être déclarée deux fois.

Existe-t-il de meilleures solutions au lieu de définir les dépendances de pod en tant que fonction dans Podfile et de les inclure dans toutes les cibles?

22
Allen Hsu

C'est une excellente question et je me suis battu avec une situation similaire. Ceci est mon PodFile:

platform :ios, '8.0'

workspace 'mygreatapp.xcworkspace'

project 'app/MyGreatApp/MyGreatApp.xcodeproj'
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'

abstract_target 'This can say whatever you want' do

    target 'MyGreatApp' do
        project 'app/MyGreatApp/MyGreatApp.xcodeproj'
        pod 'AFNetworking', '~> 2.6.0'
        pod 'PromiseKit', '~> 1.5'
        pod 'PromiseKit/Join'
        pod 'KVOController', '~> 1.0'
        pod 'FLAnimatedImage', '~> 1.0'
        pod 'Crashlytics', '~> 3.3'
        pod 'SSZipArchive'
    end

    target 'MyGreatAppTests' do
        project 'app/MyGreatApp/MyGreatApp.xcodeproj'
        pod 'OCMock', '~> 3.1'
    end

    target 'MyGreatFramework' do
        project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
        pod 'SSZipArchive'
    end

    target 'MyGreatFrameworkTests' do
        project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
        pod 'OCMock', '~> 3.1'
    end

    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
      end
    end
end

Comme vous pouvez le constater, je n'utilise pas de framework et j'utilise un abstract_target pour tout regrouper. Je souhaite que ces types de dépendances soient plus faciles à faire dans CocoaPods. Je sais que cela ne répond pas vraiment à votre question, mais cela pourrait néanmoins être utile.

2

Je pense que vous pouvez également contourner ce problème en faisant simplement FrameworkA et FrameworkB dans des modules locaux (bibliothèque statique). Ainsi, tout sera dupliqué pour vous et intégré correctement dans l'application hôte. 

Exemples: https://github.com/rob-keepsafe/PodFrameworksIssue

  • La branche master affiche les classes en double et les frameworks comme vous
  • La branche deduped transforme les frameworks dynamiques internes en pods locaux (en tant que bibliothèques statiques) afin de les dupliquer et de les lier aux dépendances
0
iwasrobbed