gpt4 book ai didi

objective-c - 如何在 Cocoapods 子规范中定义不同的 xcconfig 参数?

转载 作者:搜寻专家 更新时间:2023-10-30 20:19:39 25 4
gpt4 key购买 nike

我开发了一个 iOS 项目,它是一个处理不同服务器的类库。每个使用该库的应用程序只需要一台服务器。服务器类型可在编译时通过预处理器定义进行配置。

在我的库的 podspec 中,我为每个服务器定义了各种子规范,如下所示:

s.name = "ServerLib"
[...]
s.subspec 'ServerA' do |a|
a.source_files = 'Classes/A/**/*.{h,m}'
a.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) ServerA=1" }
end

s.subspec 'ServerB' do |b|
b.source_files = 'Classes/B/**/*.{h,m}'
b.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) ServerB=1" }
end

我的应用程序是一个多客户应用程序,每个客户有一个目标。每个客户都使用图书馆项目中的特定服务器。所以,我的 Podfile 看起来像这样:

platform :ios, '5.0'

pod 'MyCore'
pod '3rdPartyLib'

target :'Customer1', :exclusive => true do
pod 'ServerLib/ServerA'
end

target :'Customer2', :exclusive => true do
pod 'ServerLib/ServerB'
end

pod install 脚本所做的是将子规范中定义的所有标志合并为每个 pod-customerN.xcconfig 文件中的一个值

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) 3RD_PARTY_FLAGS $(inherited) ServerA=1 $(inherited) ServerB=1

关于如何规避 Cocoapods 的这种错误(?)行为有什么建议吗?据我对文档的理解,子规范属性应该只从其父规范而不是同级子规范继承。

最佳答案

找到了一个解决方法,可能不是那么优雅:

由于 pod install 将所有编译器标志合并为一个,我不得不从库的 podspec 文件中删除 GCC_PREPROCESSOR_DEFINITIONS。但是如果没有这个定义,我的库就不会构建。

在 Xcode 中,可以通过将定义添加到每个库的目标来轻松解决这个问题。但是当我在应用程序中使用我的库时,Pods 项目是从不包含所需标志的 Podspec 生成的。

解决方案是在应用程序的 Podfile 中使用 post_install Hook 来操作生成的 Pods 项目的 xcconfig。

post_install do |installer|

file_names = ['./Pods/Pods-ServerA.xcconfig',
'./Pods/Pods-ServerB.xcconfig']

# rename existing pre-processor definitions
file_names.each do |file_name|
text = File.read(file_name)
File.open(file_name, 'w') { |f| f.puts text.gsub(/GCC_PREPROCESSOR_DEFINITIONS/, "GCC_PREPROCESSOR_DEFINITIONS_SHARED")}
end

# merge existing and required definition for ServerA
File.open('./Pods/Pods-ServerA.xcconfig', 'a') { |f|
f.puts "\nGCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS_SHARED) ServerA=1"
}

# merge existing and required definition for ServerB
File.open('./Pods/Pods-ServerB.xcconfig', 'b') { |f|
f.puts "\nGCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS_SHARED) ServerB=1"
}

end

代码有点冗长,因为我不熟悉 Ruby,但它可以工作。只要变量和库遵循命名方案,就应该很容易自动执行此重命名-附加过程。

关于objective-c - 如何在 Cocoapods 子规范中定义不同的 xcconfig 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15655103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com