2017-09-07 9 views
1

CocoaPodを使用すると、ほとんどのポッドはSwift3ポッドですが、Xcodeにインポートすると、すべてのポッドはデフォルトでSwift 4になり、コンパイルステップは失敗します。CocoaPods Swift3とSwift4が混在したポッドを使用する

すべてのマイポッドのターゲットスウィフトバージョンを手動で変更することなく、Swift4ポッドをPodfile内の従来のSwift3ポッドで使用するにはどうすればよいですか?

答えて

2

iOS 11がリリースされようとしていますが、Xcode9でアプリケーションをテストしたい場合、この小さな(しかし重要な)問題に遭遇します:1日目にすべてのポッドがスウィフト4になるわけではありません。

プライベートポッド(またはオープンソースされている公共ポッド)で

、あなたが追加する必要があります。これらのポッドをインポート

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

誰もが彼らの上の任意の特別なことなしに、箱から出して正しいスウィフトバージョンを取得します部。

私はすべてのポッドスペックを変更することができますが、私はそのパワーがありません。しかし、それはあなたのPodfileに固定することができ、ちょうどあなたが私のようであってもよいし、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 

しかしスウィフトにすべてのポッドのデフォルト設定を行い、(コードの再利用が良いです!)プライベートポッドでアプリを分割し、そしてあなた設定が完了し

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 

:おそらくスウィフト4にそれらのポッドを変換し、今、あなたはタイプ再び

の両方をミックスしたいと思うでしょう、あなたのpodfileで、これを使用!通常(V1.3.1のような)

+0

'post_install'メソッドが動作することを確認できます。 しかし、podspecに 'pod_target_xcconfig'を設定していないのです。私の場合、Swift 4ポッドをインポートしているSwift 3.2プロジェクトがあります。 Cocoapodsは常にXcode Target "Swift Version"を使用し、 'pod_target_xcconfig 'で定義された' SWIFT_VERSION 'をオーバーライドしているようです。 – Chris

+0

s.compiler_flags = '-swift-version 3.2'を追加してみてください。 –

4

Cocoapodはスウィフト3.2との混在をサポートするために、まだ

回避策スウィフト4で最終的には、すべてのあなたのポッドはSwift4に移行しているだろう、とあなただけの使用CocoaPodsに戻ることができます可能だ。これをPodfileに追加し、Swift 4のポッドを配列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 
関連する問題