Модифицируйте XCScheme и запишите его обратно на диск в сценарии post_install

Я пишу post_install сценарий в моем Podfile чтобы можно было собирать отчеты о покрытии кода из моей среды, когда я запускаю модульные тесты в примере проекта. Вот что у меня есть:

post_install do |installer|
  pods_project = installer.pods_project
  shared_data_dir = Xcodeproj::XCScheme.shared_data_dir(pods_project.path)
  scheme_filename = "BonMot.xcscheme"
  scheme = Xcodeproj::XCScheme.new File.join(shared_data_dir, scheme_filename)
  test_action = scheme.test_action
  test_action.code_coverage_enabled = true
  scheme.test_action = test_action
  puts "now scheme is #{scheme}"
  scheme.save!
end

Когда я распечатываю схему, я могу убедиться, что сбор покрытия кода включен, и когда я проверяю дату изменения файла, он обновляется до текущего времени, хотя это легко объясняется тем фактом, что я запускаю pod install, Опция покрытия кода не записывается обратно в BonMot.xcscheme файл. Почему бы и нет?

2 ответа

Похоже post_install слишком рано работать со схемами. Установщик CocoaPods вызывает write_pod_project метод сразу после run_podfile_post_install_hooks на этапе "Создание стручков" и есть recreate_user_schemes позвони внутрь. Таким образом, ваша схема переписывается каждый раз в процессе установки.

Мне не очень нравится мое решение, но оно работает для меня:

post_install do |installer|

  orig_share_development_pod_schemes = installer.method :share_development_pod_schemes
  installer.define_singleton_method :share_development_pod_schemes do
    orig_share_development_pod_schemes.call

    # do what you want with schemes
  end

end

ОБНОВЛЕНИЕ (CocoaPods 1.2.0 и новее)

Поскольку решение основано на деталях реализации, оно вышло из строя после выпуска CocoaPods 1.2.0. Продолжая в том же направлении, я могу предложить новый метод переопределения:

post_install do |installer|

  orig_write_lockfiles = installer.method :write_lockfiles
  installer.define_singleton_method :write_lockfiles do
    # do what you want with schemes

    orig_write_lockfiles.call
  end

end

Вы используете installer.pods_project какой Pods.xcodeproj проект я верю.

Ваш BonMot.xcscheme Схема, вероятно, в вашем проекте приложения, а не в вашем проекте pods.

Итак, если это так, то ваш код делает то, что он, вероятно, создает совершенно новый Pods.xcodeproj/xcshareddata/xcschemes/BonMot.xcscheme файл, измените его запись покрытия кода и сохраните его вместо изменения существующего BonMotApp.xcodeproj/xcshareddata/xcschemes/BonMot.xcscheme схема.

Вы можете захотеть puts scheme.path а также puts pods_project.path отладить это и быть уверенным, что вы измените то, что ожидаете.

Вместо этого вы можете использовать ссылку на свой проект приложения:

app_project = aggregate_targets.map(&:user_project_path).uniq.first

Если вы действительно хотите изменить схему, включенную в Pods проект, эта схема, вероятно, не названа BonMot я полагаю, что это название вашего приложения, за исключением случаев, когда это имя фреймворка, внесенного в вашу рабочую область как Pod разработки через CocoaPods.


Полное объяснение:

Это потому, что даже если на практике я никогда не видел, чтобы это использовалось где-либо, CocoaPods позволяют интегрировать модули в несколько пользовательских проектов одновременно. Обычно у вас есть только один xcodeproj, но вы действительно можете указать xcodeproj прямо в вашем target … do блоки, чтобы указать конкретный проект Xcode, к которому принадлежит цель, и таким образом интегрировать ваши модули в цели различных проектов.

Так что эта строка будет спрашивать каждого стручка aggregate_target (цели pod, которые агрегируют pod для определенной цели приложения), к какому пользовательскому проекту он относится, и затем мы удаляем дубликаты в этом списке пользовательских проектов. Тогда, как на практике у нас (99,9% времени) обычно есть только один проект приложения, мы можем получить первую и единственную запись в этом списке.

Другие вопросы по тегам