为了减少组件化后的工程集成时间,我们一般都会将三方库放到私有 GitLab 中,这也有利于开发者根据自家业务,对三方库进行定制包装。但是如果有些三方库更新较慢,以至于让新版本的 Xcode 产生很多警告,这就比较烦了,因为大部分情况下,更改三方库并不是一个明智的选择。
Podfile 提供了 inhibit_all_warnings!
以屏蔽所有 pod target 的警告,但其中也包括了非三方组件。同时,Podfile 提供了 inhibit_warnings
去针对单个 pod 的编译警告进行控制,比如:
1 | pod 'SSZipArchive', :inhibit_warnings => true |
以上代码只会屏蔽 SSZipArchive 组件的警告,这比较符合我们的诉求。不过 inhibit_warnings
只会禁止当前 pod 的警告,并不会一同处理依赖组件的警告,这就要求我们在 Podfile 中显式依赖所有三方组件,并且设置 inhibit_warnings
。
暂时搁置下这种体力活,我们看下有没有更好的处理方式。遇到这种问题,首先想到的是可以在 pre_install
/ post_install
中统一设置。在 CocoaPods 源码中搜索 inhibit_warnings
,定位到以下代码 :
1 | def add_files_to_build_phases(native_target, test_native_targets) |
可以看到,在添加文件至对应 target 时,-w -Xanalyzer -analyzer-disable-all-checks
同时被添加到了文件的 compiler flags (在Target -> Build Phases -> Compile Sources 中可见)。结合 Installer 的 install! 代码:
1 | def install! |
generate_pods_project
方法执行了 PodTargetInstaller 的 install! 操作,将文件添加到了 pod target ,那么只能在其之前的 pre_install
设置相关属性了。从上面的代码还可以看出,执行 pre_install
前就已经 resolve_dependencies
了,也就是说我们可以拿到 Analyzer 分析的完整结果 AnalysisResult :
1 | # @return [Hash{TargetDefinition => Array<Specification>}] the |
上面列出了此次需要涉及到的 AnalysisResult 属性。这里要注意的是 targets
属性是不包含 Pods Target 的,它只包含了 Podfile 里面声明的 target ,一般为组件本身,以及组件Tests。如果不确定要设置哪个 target ,可以手动设置 inhibit_warnings
,然后通过以下代码打印出 hash :
1 | ... |
这里我们对所有涉及到的 target 都进行设置。接着看下 CocoaPods Core 代码中 Podfile 是如何设置 inhibit_warnings
的 :
1 | def pod(name = nil, *requirements) |
找到了设置 inhibit_warnings 的 public 方法 set_inhibit_warnings_for_pod
。
由于我们的三方库集中放在 cocoapods-repos 的 group 下,最终的 pre_install
长这样 :
1 | pre_install do |installer| |