1

我正在编写一个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文件。为什么不?

4

2 回答 2

3

看起来post_install与计划合作还为时过早。CocoaPods 安装程序在“生成 Pods 项目”步骤write_pod_project之后立即调用方法,并且内部有调用。因此,您的方案每次在安装过程中都会被重写。run_podfile_post_install_hooksrecreate_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

更新(CocoaPods 1.10.0 和更新版本)

最后,我们有了一个解决方案,无需依赖新post_integrate_hookAPI的实现:

post_integrate do |installer|
  # do what you want with schemes
end
于 2016-03-19T14:13:18.853 回答
1

您正在使用我相信installer.pods_project的项目。Pods.xcodeproj

您的BonMot.xcscheme方案可能在您的应用程序项目中,而不是您的 pods 项目中。

因此,如果是这种情况,您的代码所做的是它可能会创建一个全新的Pods.xcodeproj/xcshareddata/xcschemes/BonMot.xcscheme文件,更改其代码覆盖条目并保存它,而不是更改现有BonMotApp.xcodeproj/xcshareddata/xcschemes/BonMot.xcscheme方案。

您可能想要puts scheme.pathputs pods_project.path对其进行调试,并确保您更改了您的期望。

要改为引用您的应用程序项目,您可以使用类似的内容:

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

如果您真的想修改项目中包含的Pods方案,那么该方案可能没有命名BonMot,我认为这是您的应用程序的名称,除非这是通过 CocoaPods 在您的工作区中作为开发 Pod 引入的框架的名称。


完整解释:

那是因为即使在实践中我从未见过它在任何地方使用过,CocoaPods 也允许您一次将 pod 集成到多个用户项目中。通常你只有一个 xcodeproj,但你确实可以xcodeproj直接在你的target … do块中指定目标所属的特定 Xcode 项目,从而将你的 pod 集成到不同项目的目标中。

因此,这一行将询问每个 Pod aggregate_target(为特定应用程序目标聚合 pod 的 pod 目标)它属于哪个用户项目,然后我们删除该用户项目列表中的重复项。然后就像在实践中我们通常(99.9% 的时间)只有一个应用程序项目一样,我们可以获得该列表中的第一个也是唯一一个条目。

于 2015-11-21T21:59:32.083 回答