Как установить устаревшие версии Swift для каждого модуля в Podfile

В настоящее время я устанавливаю наследие в Podfile на SWIFT_VERSION = 2.3, но некоторые из библиотек, которые я использую, — это Swift 3.0, а это означает, что мне нужно вручную установить наследие для всех Swift 3.0 модулей в No на каждом pod install. Как настроить каждую версию модуля в установщике 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 подами. Лучшее решение — установить каждую устаревшую версию модуля отдельно, чтобы не устанавливать ее вручную.


person Tal Zion    schedule 09.11.2016    source источник


Ответы (8)


Я нашел это, когда искал, как установить SWIFT_VERSION на 3.2 для Xcode 9.

Использование AirMapSDK, которому самому и нескольким зависимостям требуется 3.2 вместо 4.0. Вот пример того, как установить конкретную 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, чтобы указать, какой модуль вам нужен для установки версии.

person Justin Miller    schedule 11.10.2017
comment
можно ли исправить внутри podfile, а НЕ podspec? - person Vyachaslav Gerchicov; 06.12.2018
comment
это для использования в подфайле - person Justin Miller; 11.12.2018

Если вам нужно управлять несколькими версиями 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
person Edmund Lee    schedule 12.10.2018
comment
Замечательный ответ. Работает как шарм :) - person Balaji Ramakrishnan; 01.10.2019

Подробности

  • Какаоподы v1.6.1
  • Xcode 10.2.1 (10E1001)

Код 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
person Vasily Bodnarchuk    schedule 15.05.2019

Если вы хотите использовать разные версии Swift, вы можете использовать это:

def pods

  pod 'PodWithSwift40'
  pod 'Pod1WithSwift42'
  pod 'Pod2WithSwift42'

end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if ['Pod1WithSiwft42', 'Pod2WithSiwft42'].include? target.name
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '4.2'
        end
    else
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '4.0'
        end
    end
  end
end
person Ricardo Isidro    schedule 27.03.2020

Я использовал это решение в CocoaPods 1.6.0.beta.2, пока не понял, что оно не работает для iOS и tvOS. проекты. Например, в проекте, использующем PromiseKit, target.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

Здесь вы можете найти все эти фрагменты кода, объединенные в один блок кода. .

person Roman Podymov    schedule 31.01.2019

Обновление для Cocoapods 1.7+, если вы включили несколько генераций xcodeproj:

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
person Yuriy Pavlyshak    schedule 05.06.2019

Если вы хотите установить устаревшую версию Swift только для одного модуля:

post_install do |installer|
  target = installer.pods_project.targets.detect {|e| e.name == 'AirMapSDK'}
  unless target.nil?
  target.build_configurations.each do |config|
  config.build_settings['SWIFT_VERSION'] = '3.2'
    end
  end
end
person Oussama Belkheir    schedule 04.09.2020

Вы можете определить массив, чтобы правильно установить версию Swift для всех модулей внутри этого массива:

post_install do |installer|
 SWIFT_3_2_PODS = %w['AirMapSDK', 'PhoneNumberKit', 'Lock', 'RxSwift', 'RxSwiftExt', 'RxCocoa', 'RxDataSources', 'ProtocolBuffers-Swift']

 installer.pods_project.targets.each do |target|
  if SWIFT_3_2_PODS.include? target.name
      target.build_configurations.each do |config|
          config.build_settings['SWIFT_VERSION'] = '3.2'
       end
    end
  end
end
person Rokon    schedule 12.10.2018