Как установить версию Legacy Swift для каждого Pod в Podfile Xcode 9.0 Swift 3.2/Swift 4.0
В настоящее время я устанавливаю устаревшее в Podfile
значение SWIFT_VERSION = 2.3
, но некоторые из библиотек, которые я использую, - это Swift 3.0, что означает, что мне нужно вручную установить для всех устаревших модулей Swift 3.0
значение No
на каждой pod install
. Как настроить каждую версию модуля в установщике Podfile
?
Это то, что я устанавливаю:
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
Если я установлю config.build_settings['SWIFT_VERSION'] = '3.0'
, то у нас будут проблемы с config.build_settings['SWIFT_VERSION'] = '3.0'
Swift 2.3
. Лучшее решение - установить каждую старую версию модуля отдельно, чтобы избежать необходимости устанавливать ее вручную.
Ответы
Ответ 1
Я нашел это, когда искал, как установить SWIFT_VERSION в 3.2 для Xcode 9.
Использование AirMapSDK, который сам по себе и нескольким зависимостям требует 3.2 вместо 4.0 Вот пример того, как установить SWIFT_VERSION для конкретного модуля для других, которые могут столкнуться с этим вопросом.
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
Вы можете изменить массив if, чтобы указать, какой модуль вам необходим для установки версии.
Ответ 2
Если вам нужно управлять несколькими версиями Swift для модулей, вы можете создать отображение.
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
Ответ 3
Я использовал это решение в CocoaPods 1.6.0.beta.2, пока не понял, что оно не работает для проектов iOS и tvOS. Например, в проекте с использованием PromiseKit target.name
может быть PromiseKit-iOS
или PromiseKit-tvOS
и бесполезно проверять, содержит ли "PromiseKit"
такую подстроку.
Я могу предоставить лучшее решение. Объявите хэш с версиями Swift в качестве ключей, а имена библиотек - в качестве значений:
my_project_pods_swift_versions = Hash[
"3.0", ["PagingMenuController", "TCPickerView"],
"4.0", ["PromiseKit"]
]
Используйте эти функции, чтобы проверить, содержит ли target.name
строку типа "PromiseKit"
, но не наоборот:
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
Вы должны вызвать setup_all_swift_versions
внутри 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
Здесь вы можете найти все эти фрагменты кода, объединенные в один блок кода.
Ответ 4
подробности
- CocoaPods v1.6.1
- Xcode 10.2.1 (10E1001)
Рубиновый код в подфайле
swift_versions_of_pods = { 'swiftScan' => '4.0', 'GRDB.swift' => '4.2' }
post_install do |installer|
installer.pods_project.targets.each do |target|
defined_swift_version = swift_versions_of_pods[target.name]
next if defined_swift_version.blank?
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = defined_swift_version
end
end
end
Ответ 5
Обновление для cocoapods 1. 7+, если вы включили множественную генерацию xcodeproj:
install! 'cocoapods', :generate_multiple_pod_projects => true
[...]
installer.pod_target_subprojects.each do |subproject|
subproject.targets.each do |target|
if target.name == 'OldSwiftPod'
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
end
Ответ 6
Вы можете определить массив для правильной установки версии Swift для всех модулей внутри этого массива:
post_install do |installer|
SWIFT_3_2_PODS = %w['AirMapSDK', 'PhoneNumberKit', 'Lock', 'RxSwift', 'RxSwiftExt', 'RxCocoa', 'RxDataSources', 'ProtocolBuffers-Swift']
installer.pods_project.targets.each do |target|
if SWIFT_3_2_PODS.include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
end