web-dev-qa-db-ja.com

レガシーの設定方法Swift Podfile Xcode 9.0の各PodのバージョンSwift 3.2 / Swift 4.0

現在、PodfileのレガシーをSwift_VERSION = 2.3に設定していますが、使用しているライブラリの一部はSwift 3.0です。つまり、手動で設定する必要がありますすべてのSwift 3.0ポッドのレガシーpod installNoにレガシーPodfileインストーラーで各ポッドバージョンを構成するにはどうすればよいですか?

これは私が設定しているものです:

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ポッドで問題が発生します。最良の解決策は、各ポッドのレガシーバージョンを個別に設定して、手動で設定する必要がないようにすることです。

34
Tal Zion

Xcode 9でSwift_VERSIONを3.2に設定する方法を探しているときにこれを見つけました。

それ自体と複数の依存関係が4.0ではなく3.2を必要とするAirMapSDKを使用するこの質問に出くわす可能性のある他の人にポッド固有の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配列を変更して、バージョンの設定に必要なポッドを指定することもできます。

93
Justin Miller

複数の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
5
Edmund Lee

詳細

  • 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
1

複数の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
0
Yuriy Pavlyshak

CocoaPods 1.6.0.beta.2で このソリューション を使用していましたが、iOSおよびtvOSプロジェクトでは機能しないことがわかりました。たとえば、 PromiseKittarget.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

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

ここ これらのコードスニペットはすべて単一のコードブロックに統合されています。

0
Roman Podymov