2015-11-21 6 views
0

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

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. Почему нет?

ответ

1

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

Ваша схема BonMot.xcscheme, вероятно, находится в вашем проекте приложения, а не в проекте ваших модулей.

Так что, если это так, то, что ваш код делает, что он, вероятно, создает совершенно новый файл 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, который по моему мнению, имя вашего приложения, за исключением того, что это название фреймворка, представленного в качестве рабочей области разработки в вашей рабочей области через CocoaPods.


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

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

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

0

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

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

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 
Смежные вопросы