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