使用 CocoaPods 混合 Swift3 和 Swift4 pods

Using CocoaPods mixed Swift3 and Swift4 pods

使用CocoaPods,大部分pods仍然是Swift3pods,但是在Xcode中导入时,所有pods默认为Swift 4,这使得编译步骤失败。

如何在我的 Podfile 中将 Swift4 pods 与遗留 Swift3 pods 一起使用,而无需手动更改目标 swift 版本我所有的 pods?

iOS 11 即将发布,你想用 Xcode9 测试你的应用程序,你会遇到这个小(但很重要)的问题:并非所有 pods 都会Swift 第 1 天 4 个(或永远是!)

在你的私人pods(或开源的publicpods)中,你应该添加:

Pod::Spec.new do |s|
    s.pod_target_xcconfig = { 'SWIFT_VERSION' => '3.2' }
    s.compiler_flags = '-swift-version 3.2'
end

任何导入这些 pods 的人都将获得开箱即用的正确 Swift 版本,他们不需要任何特殊的东西。

我希望我可以修改所有 podspec,但我没有那个权力。但这可以在您的 Podfile 中修复,只需将所有 pods 默认设置为 Swift 3.2

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

然而,你可能像我一样,将你的应用程序与私有 pods 分开(代码重用很好!),你可能会将那些 pods 转换为 Swift 4 .现在你想混合这两种类型

同样,在你的播客文件中,使用这个:

post_install do |installer|
    ['TargetName1','TargetName2','TargetName3'].each do |targetName|
        targets = installer.pods_project.targets.select { |target| target.name == targetName }
        target = targets[0]
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '4.0'
        end
    end
end

大功告成!最终,您所有的 pods 都将迁移到 Swift4,您可以恢复正常使用 CocoaPods

Cocoapod(自 v1.3.1 起)尚不支持混合使用 Swift 3.2 和 Swift 4。

可能有解决方法。将此附加到您的 Podfile,并将已经是 Swift 4 的 pods 添加到数组 swift4Targets,然后添加 pod install.

# Workaround Cocoapods to mix Swift 3.2 and 4
# Manually add to swift4Targets, otherwise assume target uses Swift 3.2
swift4Targets = ['MyTarget1', 'MyTarget2']
post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if swift4Targets.include? target.name
                config.build_settings['SWIFT_VERSION'] = '4'
            else
                config.build_settings['SWIFT_VERSION'] = '3.2'
            end
        end
    end
end

我是这样做的。所以现在所有 pods,除了 2 个都在使用 Swift 3.2.

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |configuration|
            configuration.build_settings['SWIFT_VERSION'] = "3.2"
        end
    end

    installer.pods_project.targets.each do |target|
        if ['MapboxCoreNavigation', 'MapboxNavigation'].include? target.name
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '4.0'
            end
        end
    end
end