web-dev-qa-db-fra.com

Comment définir la version Swift héritée pour chaque pod dans Podfile Xcode 9.0 Swift 3.2/Swift 4.0

Je règle actuellement l'héritage dans Podfile sur Swift_VERSION = 2.3, mais certaines des bibliothèques que j'utilise sont Swift 3.0, ce qui signifie que je dois définir manuellement l'héritage pour tous les pods Swift 3.0 à No sur chaque pod install. Comment configurer chaque version de pod dans le programme d'installation Podfile?

Voici ce que je suis en train de mettre:

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

Si je mets config.build_settings['Swift_VERSION'] = '3.0', alors nous avons des problèmes avec les pods Swift 2.3. La meilleure solution consiste à définir séparément chaque version héritée du pod afin d'éviter de la configurer manuellement.

17
Tal Zion

J'ai trouvé cela en cherchant comment définir Swift_VERSION sur 3.2 pour Xcode 9. 

Utilisation de la carte AirMapSDK nécessitant plusieurs dépendances (3.2 plutôt que 4.0) Voici un exemple de la façon de définir Swift_VERSION spécifique au pod pour les autres personnes susceptibles de rencontrer cette question. 

post_install do |installer|
  installer.pods_project.targets.each do |target|
      if ['AirMapSDK', 'PhoneNumberKit', 'Lock', 'RxSwift', 'RxSwiftExt', 'RxCocoa', 'RxDataSources', 'ProtocolBuffers-Swift'].include? target.name
          target.build_configurations.each do |config|
              config.build_settings['Swift_VERSION'] = '3.2'
          end
      end
  end
end

Vous pouvez modifier le tableau if pour spécifier le pod dont vous avez besoin pour définir la version. 

58
Justin Miller

Si vous devez gérer plusieurs versions de Swift pour les pods, vous pouvez créer un mappage.

DEFAULT_Swift_VERSION = '4'
POD_Swift_VERSION_MAP = {
  'Dotzu' => '3'
}

post_install do |installer|
  installer.pods_project.targets.each do |target|
    Swift_version = POD_Swift_VERSION_MAP[target.name] || DEFAULT_Swift_VERSION
    puts "Setting #{target.name} Swift version to #{Swift_version}"
    target.build_configurations.each do |config|
      config.build_settings['Swift_VERSION'] = Swift_version
    end
  end
end
2
Edmund Lee

J'utilisais cette solution dans CocoaPods 1.6.0.beta.2 jusqu'à ce que je réalise que cela ne fonctionne pas pour les projets iOS et tvOS. Par exemple, dans un projet utilisant PromiseKittarget.name peut être PromiseKit-iOS ou PromiseKit-tvOS et il est inutile de vérifier si "PromiseKit" contient une telle chaîne.

Je peux fournir une meilleure solution. Déclarez un hachage avec les versions de Swift comme clés et les noms de bibliothèques comme valeurs:

my_project_pods_Swift_versions = Hash[
  "3.0", ["PagingMenuController", "TCPickerView"],
  "4.0", ["PromiseKit"]
]

Utilisez ces fonctions pour vérifier si target.name contient une chaîne comme "PromiseKit", mais pas l'inverse:

def setup_all_Swift_versions(target, pods_Swift_versions)
  pods_Swift_versions.each { |Swift_version, pods| setup_Swift_version(target, pods, Swift_version) }
end

def setup_Swift_version(target, pods, Swift_version)
  if pods.any? { |pod| target.name.include?(pod) }
    target.build_configurations.each do |config|
      config.build_settings['Swift_VERSION'] = Swift_version
    end
  end
end

Vous devriez appeler setup_all_Swift_versions dans post_install:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    setup_all_Swift_versions(target, my_project_pods_Swift_versions)
  end
end

Ici vous pouvez trouver tous ces extraits de code unifiés dans un bloc de code unique.

0
Roman Podymov