現在、Podfile
のレガシーをSwift_VERSION = 2.3
に設定していますが、使用しているライブラリの一部はSwift 3.0です。つまり、手動で設定する必要がありますすべてのSwift 3.0
ポッドのレガシーpod install
のNo
にレガシー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
ポッドで問題が発生します。最良の解決策は、各ポッドのレガシーバージョンを個別に設定して、手動で設定する必要がないようにすることです。
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配列を変更して、バージョンの設定に必要なポッドを指定することもできます。
複数の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
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
複数の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
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
ここ これらのコードスニペットはすべて単一のコードブロックに統合されています。