修改XCScheme并在post_install脚本中将其写回磁盘

时间:2015-11-21 20:36:36

标签: ruby cocoapods xcodeproj

我在我的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

当我打印出该方案时,我可以确认已启用代码覆盖率收集,当我检查文件的修改日期时,它会更新到当前时间,尽管很容易通过I&#这个事实来解释39; m正在运行pod install。代码覆盖率选项 not 被写回BonMot.xcscheme文件。为什么不呢?

2 个答案:

答案 0 :(得分: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在您的工作区中作为Development Pod。

完整说明:

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

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

答案 1 :(得分:0)

看起来post_install使用方案还为时过早。 CocoaPods安装程序在"Generating Pods project" step期间write_pod_project之后立即调用run_podfile_post_install_hooks方法,内部有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

更新(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