Objective-C:如何定义一个宏来从pod依赖中禁用一段源代码?

时间:2016-12-23 07:32:15

标签: ios objective-c xcode macros cocoapods

我有一个私人依赖的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)文件有一些配置值,请告诉我,谢谢!

2 个答案:

答案 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