我可以使用一个Cocoapod定位多个Xcode / Swift版本吗?

时间:2018-09-26 14:42:45

标签: ios swift xcode cocoapods

我有一个Swift框架,正在通过CocoaPods进行编译和部署。

我一直在使用XCode 9.0在Swift 4.0中进行开发,并将其打包到CocoaPod中,并且一切正常。

然后我升级到XCode 10,结果发现当我包含我的CocoaPod时,它不喜欢Pod是在较旧版本的XCode中编译的事实。

根据我的理解,这意味着,如果要在XCode 10项目中使用Pod,则必须在相同的Xcode版本中构建Pod。 那么这是否还意味着如果我希望我的Pod支持尽可能多的版本,我需要使用特定的Xcode版本进行单独的构建,然后将它们发布到单独的CocoaPod存储库(或多个版本)中?

我是否缺少一些基本的知识,可以让我支持尽可能多的Swift / Xcode版本?

欢呼 戴夫

2 个答案:

答案 0 :(得分:1)

我的问题是,我在Cocoapod中运送了已编译的二进制文件,而不是源代码。不幸的是,Swift编译的二进制文件既不向前也不向后兼容。

Pod现在仅被部署为源代码,不幸的是,这意味着人们可以看到我不得不编写的令人震惊的代码,而我没有编写这些代码! #legacyproblems

答案 1 :(得分:0)

快速3、4和4.2目标可以共存并链接在一起。

  

您可以根据目标确定何时以及是否要迁移   当对您的项目有意义时。迁移到Swift 4.2时   绝对值得鼓励,这不是一个全有或全无的过程,就像Swift 3一样,   4、4.2目标可以共存并链接在一起。

不同的coapapod和不同的项目版本也可以共存。

您希望与项目版本具有不同的cocoapod版本,然后应在pod文件末尾进行以下更改:

post_install do |installer|
    print "Setting the default SWIFT_VERSION to 4.2\n"
    installer.pods_project.build_configurations.each do |config|
        config.build_settings['SWIFT_VERSION'] = '4.2'
    end

    installer.pods_project.targets.each do |target|
        if ['SomeTarget-iOS', 'SomeTarget-watchOS'].include? "#{target}"
            print "Setting #{target}'s SWIFT_VERSION to 3.0\n"
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = '3.0'
            end
        else
            print "Setting #{target}'s SWIFT_VERSION to Undefined (Xcode will automatically resolve)\n"
            target.build_configurations.each do |config|
                config.build_settings.delete('SWIFT_VERSION')
            end
        end
    end
end

有时甚至在运行pod更新后,您的xcode都会强制更新cocoapod pod项目的版本,在这种情况下,请选择cocoapod pod项目并在构建设置中更改swift版本。