如何在 Podfile 中为每个 Pod 设置 Legacy Swift 版本
How to set the Legacy Swift Versions for each Pod in Podfile
我目前正在将 Podfile
中的 legacy 设置为 SWIFT_VERSION = 2.3
,但我使用的一些库是 Swift 3.0,这意味着我需要手动设置所有 Swift 3.0
的遗产 pods 每个 pod install
的 No
的遗产。如何在 Podfile
安装程序中配置每个 pod 版本?
这是我正在设置的:
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'
,那么 Swift 2.3
pods 就会出现问题。最好的解决方案是,如果我们单独设置每个 pod 遗留版本,以避免必须手动设置它。
我在搜索如何为 Xcode 9 将 SWIFT_VERSION 设置为 3.2 时发现了这一点。
使用本身和多个依赖项需要 3.2 而不是 4.0 的 AirMapSDK 下面是一个示例,说明如何为可能遇到此问题的其他人设置 pod 特定 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 数组以指定您也需要设置版本的任何 pod。
您可以定义一个数组,以便为该数组内的所有 pods 很好地设置 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
如果您需要为 pods 管理多个 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
我用的是 in CocoaPods 1.6.0.beta.2 until I realised that it does not work for iOS & tvOS projects. For example in a project using 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
你应该在 post_install
:
中调用 setup_all_swift_versions
post_install do |installer|
installer.pods_project.targets.each do |target|
setup_all_swift_versions(target, my_project_pods_swift_versions)
end
end
Here 您会发现所有这些代码片段都统一到一个代码块中。
详情
- CocoaPods v1.6.1
- Xcode 10.2.1 (10E1001)
Ruby podfile 中的代码
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
cocoapods 1.7+ 更新(如果您启用了多个 xcodeproj 生成):
install! 'cocoapods', :generate_multiple_pod_projects => true
<Pod list section>
post_install do |installer|
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
end
如果你想使用不同的Swift版本,你可以使用这个:
def pods
pod 'PodWithSwift40'
pod 'Pod1WithSwift42'
pod 'Pod2WithSwift42'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
if ['Pod1WithSiwft42', 'Pod2WithSiwft42'].include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.2'
end
else
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.0'
end
end
end
end
如果您想将旧 swift 版本设置为只有一个 pod:
post_install do |installer|
target = installer.pods_project.targets.detect {|e| e.name == 'AirMapSDK'}
unless target.nil?
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
我目前正在将 Podfile
中的 legacy 设置为 SWIFT_VERSION = 2.3
,但我使用的一些库是 Swift 3.0,这意味着我需要手动设置所有 Swift 3.0
的遗产 pods 每个 pod install
的 No
的遗产。如何在 Podfile
安装程序中配置每个 pod 版本?
这是我正在设置的:
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'
,那么 Swift 2.3
pods 就会出现问题。最好的解决方案是,如果我们单独设置每个 pod 遗留版本,以避免必须手动设置它。
我在搜索如何为 Xcode 9 将 SWIFT_VERSION 设置为 3.2 时发现了这一点。
使用本身和多个依赖项需要 3.2 而不是 4.0 的 AirMapSDK 下面是一个示例,说明如何为可能遇到此问题的其他人设置 pod 特定 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 数组以指定您也需要设置版本的任何 pod。
您可以定义一个数组,以便为该数组内的所有 pods 很好地设置 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
如果您需要为 pods 管理多个 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
我用的是 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
你应该在 post_install
:
setup_all_swift_versions
post_install do |installer|
installer.pods_project.targets.each do |target|
setup_all_swift_versions(target, my_project_pods_swift_versions)
end
end
Here 您会发现所有这些代码片段都统一到一个代码块中。
详情
- CocoaPods v1.6.1
- Xcode 10.2.1 (10E1001)
Ruby podfile 中的代码
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
cocoapods 1.7+ 更新(如果您启用了多个 xcodeproj 生成):
install! 'cocoapods', :generate_multiple_pod_projects => true
<Pod list section>
post_install do |installer|
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
end
如果你想使用不同的Swift版本,你可以使用这个:
def pods
pod 'PodWithSwift40'
pod 'Pod1WithSwift42'
pod 'Pod2WithSwift42'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
if ['Pod1WithSiwft42', 'Pod2WithSiwft42'].include? target.name
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.2'
end
else
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.0'
end
end
end
end
如果您想将旧 swift 版本设置为只有一个 pod:
post_install do |installer|
target = installer.pods_project.targets.detect {|e| e.name == 'AirMapSDK'}
unless target.nil?
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end