我有一个私人依赖的pod项目,由我们通过cocoapods构建,现在我想使用一个宏,例如ADHOC,在这样的pod项目中禁用一些源代码,
#if ADHOC
// for ad hoc build.
#else
// for app store build.
#endif
有两个高级项目依赖于pod项目,它们有不同的要求,一个用于ad-hoc构建(projectA),另一个用于app store构建(projectB)。
在他们的Podfile中构建依赖关系之后,我尝试在导入条目头文件之前在projectA中定义ADHOC宏,它只是不会在ADHOC语句中构建源代码,即使导入了条目头文件主项目的前缀头文件。
我知道Masonry中的MAS_SHORTHAND宏用法,它定义了这些方法的两个实现,在编译到主项目时,它将快捷方法预编译为完整版。
对于我的情况,我希望主项目中的宏定义可能会影响pod项目。这看起来很荒谬,我知道模块的编译顺序。可能无法专注于主项目,所以我猜cocoapods可以使它工作,在编译之前将宏注入pod项目。
如果Podfile(不是.podspec)文件有一些配置值,请告诉我,谢谢!
答案 0 :(得分:0)
你所尝试的不是一个好主意,也许几乎不可能。
Pod-project是项目-A和项目-B的依赖项,这意味着pod-project是在构建项目-A和项目-B之前构建的。
您的提案将颠倒依赖关系,让pod-project依赖于项目A和/或项目-B。
解决此问题的常用方法是使用ad-hoc和app store行为(使用不同命名的类或方法)进行pod-project构建。这是当您在项目A中使用ADHOC
宏来选择临时行为而不是应用商店行为时。
#if defined(ADHOC)
#define MyClass MyClassAdHoc
#else
#define MyClass MyClassAppStore
#endif
…
MyClass *instance = [[MyClass] alloc] init];
答案 1 :(得分:0)
做到了!我在Podfile中构建了post_install挂钩来定义一个自定义预处理器宏,就在这里。
# Inject the target macro.
# http://stackoverflow.com/a/27138078/1677041
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "foo_target_name"
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'ADHOC=1'
end
puts "\n\e[3m\e[32mInject a macro ADHOC to target!\e[0m\e[23m\n\n"
end
end
end