Cocoapod 0.38.0 和 AFNetworking 2.5 AF_APP_EXTENSIONS 编译错误
Cocoapod 0.38.0 and AFNetworking 2.5 AF_APP_EXTENSIONS compilation error
我的项目有 9 个目标:
- Prod
- Prod_app_extension_1
- Prod_app_extension_2
- Beta
- Beta_app_extension_1
- Beta_app_extension_2
- Dev
- Dev_app_extension_2
- Dev_app_extension_2
我使用的是 0.38.2 cocoapod 版本和 2.5.4 AFNetworking。
我正在尝试将 AFNetworking 与 cocoapod 一起使用,但在编译时出现 AF_APP_EXTENSIONS 错误。在网上搜索解决方案后,我了解了问题,发现定义'preprocessor macros' AF_APP_EXTENSIONS可以解决问题。
但问题在于:默认情况下,AF_APP_EXTENSIONS 已正确添加到我的 6 app_extensions 中。另一方面,当我浏览 Pods 目标时, 每个 Pods 是分开的 :
- NSDate+TimeAgo
- AFNetworking
- iRate
- AppUtils
- Prod
- Prod_app_extension_1
- Prod_app_extension_2
- Beta
- Beta_app_extension_1
- Beta_app_extension_2
- Dev
- Dev_app_extension_2
- Dev_app_extension_2
在我做的另一个项目中,所有 pods 都是这样生成的:
- Prod
- Pods-Prod-NSDate+TimeAgo
- Pods-Prod-AFNetworking
- Pods-Prod-iRate
- Pods-Prod-AppUtils
- Prod_app_extension_1
- Pods-Prod_app_extension_1-NSDate+TimeAgo
- Pods-Prod_app_extension_1-AFNetworking
- Pods-Prod_app_extension_1-iRate
- Prod_app_extension_2
- Pods-Prod_app_extension_2-NSDate+TimeAgo
- Pods-Prod_app_extension_2-AFNetworking
- Pods-Prod_app_extension_2-iRate
- Beta
- Pods-Beta-NSDate+TimeAgo
- Pods-Beta-AFNetworking
- Pods-Beta-iRate
- Pods-Beta-AppUtils
- Beta_app_extension_1
- Pods-Beta_app_extension_1-NSDate+TimeAgo
- Pods-Beta_app_extension_1-AFNetworking
- Pods-Beta_app_extension_1-iRate
- Beta_app_extension_2
- Pods-Beta_app_extension_2-NSDate+TimeAgo
- Pods-Beta_app_extension_2-AFNetworking
- Pods-Beta_app_extension_2-iRate
- Dev
- Pods-Dev-NSDate+TimeAgo
- Pods-Dev-AFNetworking
- Pods-Dev-iRate
- Pods-Dev-AppUtils
- Dev_app_extension_1
- Pods-Dev_app_extension_1-NSDate+TimeAgo
- Pods-Dev_app_extension_1-AFNetworking
- Pods-Dev_app_extension_1-iRate
- Dev_app_extension_2
- Pods-Dev_app_extension_2-NSDate+TimeAgo
- Pods-Dev_app_extension_2-AFNetworking
- Pods-Dev_app_extension_2-iRate
我认为这就是为什么我的 'preprocessor macros' AF_APP_EXTENSIONS 没有定义到 'AFNetworking' Pods 目标中。
这是我的 Podfile :
platform :ios, '7.0'
xcodeproj 'myProj.xcodeproj'
def generic_pods
pod 'NSDate+TimeAgo'
pod 'AFNetworking', '~> 2.0'
end
def app_pods
pod 'iRate'
pod 'AppUtils',
end
target "Prod" do
generic_pods
app_pods
end
target "Prod_app_extension_1" do
generic_pods
end
target "Prod_app_extension_2" do
generic_pods
end
target "Beta" do
generic_pods
app_pods
end
target "Beta_app_extension_1" do
generic_pods
end
target "Beta_app_extension_2" do
generic_pods
end
target "Dev" do
generic_pods
app_pods
end
target "Dev_app_extension_1" do
generic_pods
end
target "Dev_app_extension_2" do
generic_pods
end
我不知道问题出在哪里,快把我逼疯了。
自 0.38.0 cocoapod 版本开始,pod target 被去重。这意味着,不是为每个项目目标 ('Pods-MyApp-AFNetworking'、'Pods-MyExtension-AFNetworking'、...) 构建一个 AFNetworking,而是只生成一个 AFNetworking pod 目标 ('Pods-AFNetworking')。
AFNetworking 需要 'AF_APP_EXTENSIONS' 标记到 GCC_PREPROCESSOR_DEFINITIONS 以在添加到应用程序扩展时进行编译。
在 0.37.2 cocoapod 版本之前,可以通过添加 post-install 例程从项目 Podfile 添加标志:
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
if ar.include? target.name
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
end
end
end
end
不幸的是,使用删除重复的 cocoapod 功能,不再可能将 AF_APP_EXTENSIONS 标志单独添加到应用程序扩展 pod 目标。
我发现编译的唯一方法是创建一个文件:~/.cocoapods/config.yaml(当你使用 cocoapod 时默认情况下不存在,你可以使用终端创建它)具有以下内容:
deduplicate_targets: false
这样,pods 不会被删除重复数据,您可以 post-install 添加 AF_APP_EXTENSIONS 到您的应用程序扩展 GCC_PREPROCESSOR_DEFINITIONS.
我只希望他们能找到防止这个问题的好方法。
参考资料:
https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md#highlighted-enhancement-that-needs-testing => cocoapod 更改日志
我的项目有 9 个目标:
- Prod
- Prod_app_extension_1
- Prod_app_extension_2
- Beta
- Beta_app_extension_1
- Beta_app_extension_2
- Dev
- Dev_app_extension_2
- Dev_app_extension_2
我使用的是 0.38.2 cocoapod 版本和 2.5.4 AFNetworking。
我正在尝试将 AFNetworking 与 cocoapod 一起使用,但在编译时出现 AF_APP_EXTENSIONS 错误。在网上搜索解决方案后,我了解了问题,发现定义'preprocessor macros' AF_APP_EXTENSIONS可以解决问题。
但问题在于:默认情况下,AF_APP_EXTENSIONS 已正确添加到我的 6 app_extensions 中。另一方面,当我浏览 Pods 目标时, 每个 Pods 是分开的 :
- NSDate+TimeAgo
- AFNetworking
- iRate
- AppUtils
- Prod
- Prod_app_extension_1
- Prod_app_extension_2
- Beta
- Beta_app_extension_1
- Beta_app_extension_2
- Dev
- Dev_app_extension_2
- Dev_app_extension_2
在我做的另一个项目中,所有 pods 都是这样生成的:
- Prod
- Pods-Prod-NSDate+TimeAgo
- Pods-Prod-AFNetworking
- Pods-Prod-iRate
- Pods-Prod-AppUtils
- Prod_app_extension_1
- Pods-Prod_app_extension_1-NSDate+TimeAgo
- Pods-Prod_app_extension_1-AFNetworking
- Pods-Prod_app_extension_1-iRate
- Prod_app_extension_2
- Pods-Prod_app_extension_2-NSDate+TimeAgo
- Pods-Prod_app_extension_2-AFNetworking
- Pods-Prod_app_extension_2-iRate
- Beta
- Pods-Beta-NSDate+TimeAgo
- Pods-Beta-AFNetworking
- Pods-Beta-iRate
- Pods-Beta-AppUtils
- Beta_app_extension_1
- Pods-Beta_app_extension_1-NSDate+TimeAgo
- Pods-Beta_app_extension_1-AFNetworking
- Pods-Beta_app_extension_1-iRate
- Beta_app_extension_2
- Pods-Beta_app_extension_2-NSDate+TimeAgo
- Pods-Beta_app_extension_2-AFNetworking
- Pods-Beta_app_extension_2-iRate
- Dev
- Pods-Dev-NSDate+TimeAgo
- Pods-Dev-AFNetworking
- Pods-Dev-iRate
- Pods-Dev-AppUtils
- Dev_app_extension_1
- Pods-Dev_app_extension_1-NSDate+TimeAgo
- Pods-Dev_app_extension_1-AFNetworking
- Pods-Dev_app_extension_1-iRate
- Dev_app_extension_2
- Pods-Dev_app_extension_2-NSDate+TimeAgo
- Pods-Dev_app_extension_2-AFNetworking
- Pods-Dev_app_extension_2-iRate
我认为这就是为什么我的 'preprocessor macros' AF_APP_EXTENSIONS 没有定义到 'AFNetworking' Pods 目标中。
这是我的 Podfile :
platform :ios, '7.0'
xcodeproj 'myProj.xcodeproj'
def generic_pods
pod 'NSDate+TimeAgo'
pod 'AFNetworking', '~> 2.0'
end
def app_pods
pod 'iRate'
pod 'AppUtils',
end
target "Prod" do
generic_pods
app_pods
end
target "Prod_app_extension_1" do
generic_pods
end
target "Prod_app_extension_2" do
generic_pods
end
target "Beta" do
generic_pods
app_pods
end
target "Beta_app_extension_1" do
generic_pods
end
target "Beta_app_extension_2" do
generic_pods
end
target "Dev" do
generic_pods
app_pods
end
target "Dev_app_extension_1" do
generic_pods
end
target "Dev_app_extension_2" do
generic_pods
end
我不知道问题出在哪里,快把我逼疯了。
自 0.38.0 cocoapod 版本开始,pod target 被去重。这意味着,不是为每个项目目标 ('Pods-MyApp-AFNetworking'、'Pods-MyExtension-AFNetworking'、...) 构建一个 AFNetworking,而是只生成一个 AFNetworking pod 目标 ('Pods-AFNetworking')。
AFNetworking 需要 'AF_APP_EXTENSIONS' 标记到 GCC_PREPROCESSOR_DEFINITIONS 以在添加到应用程序扩展时进行编译。
在 0.37.2 cocoapod 版本之前,可以通过添加 post-install 例程从项目 Podfile 添加标志:
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
if ar.include? target.name
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
end
end
end
end
不幸的是,使用删除重复的 cocoapod 功能,不再可能将 AF_APP_EXTENSIONS 标志单独添加到应用程序扩展 pod 目标。
我发现编译的唯一方法是创建一个文件:~/.cocoapods/config.yaml(当你使用 cocoapod 时默认情况下不存在,你可以使用终端创建它)具有以下内容:
deduplicate_targets: false
这样,pods 不会被删除重复数据,您可以 post-install 添加 AF_APP_EXTENSIONS 到您的应用程序扩展 GCC_PREPROCESSOR_DEFINITIONS.
我只希望他们能找到防止这个问题的好方法。
参考资料:
https://github.com/CocoaPods/CocoaPods/blob/master/CHANGELOG.md#highlighted-enhancement-that-needs-testing => cocoapod 更改日志