48

我目前在Podfileto中设置 legacy SWIFT_VERSION = 2.3,但我使用的一些库是 Swift 3.0,这意味着我需要手动将所有Swift 3.0pod legacy 设置为No每个pod install. 如何在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遇到 pod 问题。最好的解决方案是,如果我们分别设置每个 pod 旧版本以避免手动设置它。

4

8 回答 8

117

我在搜索如何将 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。

于 2017-10-11T14:02:17.813 回答
11

如果你需要为 pod 管理多个 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
于 2018-10-12T07:28:53.450 回答
2

细节

  • CocoaPods v1.6.1
  • Xcode 10.2.1 (10E1001)

podfile 中的 Ruby 代码

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
于 2019-05-15T19:46:50.177 回答
1

如果你想使用不同的 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
于 2020-03-27T02:02:05.337 回答
0

如果您启用了多个 xcodeproj 生成,请更新 cocoapods 1.7+:

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
于 2019-06-05T13:48:32.560 回答
0

我在 CocoaPods 1.6.0.beta.2 中使用了这个解决方案,直到我意识到它不适用于 iOS 和 tvOS 项目。例如,在使用PromiseKit target.name的项目中可以是PromiseKit-iOSPromiseKit-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

在这里,您可以找到所有这些统一到一个代码块中的代码片段。

于 2019-01-31T12:20:34.847 回答
0

您可以定义一个数组来为该数组中的所有 pod 设置 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
于 2018-10-12T04:28:32.827 回答
0

如果您只想将旧版 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
于 2020-09-04T13:29:29.580 回答