我在我的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
文件。为什么不呢?
答案 0 :(得分:1)
您使用的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
,我相信它是您的应用程序的名称,除非这是框架的名称通过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