为了强调组内同学对 warning 的处理,强制将 warning 切成了 error,这样为了保证项目可以编过,大家不得不处理自己开发过程中遇到的 warning,暴力但很有效。
关闭全局警告
组件化之后,项目中除了基本的壳工程代码,其他代码都在 pod 中,可以采用 Podfile 的开关进行处理。
...
platform :ios, '9.0'
project 'XXX'
inhibit_all_warnings!
...
inhibit_all_warnings! 就是屏蔽所有 pod 警告的全局开关。
打开部分 pod 的警告
如果去掉这一行(不调用对应的 ruby 方法),就会造成所有引入的第三方库的 warning 也都显示出来了,无论是查看 warning 还是处理,都不是很方便,所以,这一行肯定是要保留的。
看过 cocoapods 源码的同学都知道,pod 方法接收一个参数可以打开或关闭这一 pod 的 warning 开关。
pod 'XXX', :git => 'xxxxx.git', :tag => 'xxx', :inhibit_warnings => false
嗯,就是 :inhibit_warnings 这个参数了,false :打开 warning,true :屏蔽 warning
warning 切 error
这是关键了,遇到编译 error 的时候,大家不得不处理才能 run 自己的工程,这也是这次让大家重视 warning 处理的必杀技了。Podfile 中可以在所有的 pods 安装完成后,通过钩子方法给 target 设置 build settings,这里就包括warning 切 error 的选项了。
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
# 编译配置
if config.name == 'Release'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'RELEASE=1'
end
if config.name == 'Beta'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'BETA=1'
end
# 预编译宏
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'NS_BLOCK_ASSERTIONS'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'COCOAPODS=1'
# warning 切 error 的开关
config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'YES'
# 关闭部分 warning
config.build_settings['WARNING_CFLAGS'] ||= '-Wno-nullability-completeness'
config.build_settings['CLANG_WARN_STRICT_PROTOTYPES'] = 'NO'
config.build_settings['GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS'] = 'NO'
config.build_settings['CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS'] = 'NO'
config.build_settings['CLANG_WARN_DOCUMENTATION_COMMENTS'] = 'NO'
config.build_settings['GCC_WARN_UNUSED_VARIABLE'] = 'NO'
config.build_settings['GCC_WARN_UNUSED_FUNCTION'] = 'NO'
config.build_settings['CLANG_MIGRATOR_OBJC_DESIGNATED_INIT'] = 'NO'
config.build_settings['CLANG_WARN_COMMA'] = 'NO'
config.build_settings['CLANG_WARN_BOOL_CONVERSION'] = 'NO'
end
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1'
end
end
end
其中,config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'YES' 就是 warning 切 error 的开关了。
大家可能还会注意到,上面的 Podfile 配置中还设置了关闭部分 warning 的开关,是的,有些 warning 还是没有太大影响的,不能对业务开发造成太大的干扰和影响,可以如此关闭掉。
常见的警告
下方链接罗列了一些 iOS 中常见的一些警告消息,感谢原作者。
1)Semantic Warnings(语义警告)
2)Parser Warnings(解析器警告)
https://www.jianshu.com/p/9652d3ae42a1