有没有一种方法可以根据静态或动态用法有条件地定义Podspec属性?

时间:2019-08-12 12:21:24

标签: swift cocoapods

我第一次在我的CocoaPods库中包含一个Swift源。对于我来说,要编译项目,我需要将生成的Swift标头导入到Objective-C源代码中。这有两种不同的形式,具体取决于项目是作为静态库还是动态框架来构建:

#ifdef BUILT_AS_FRAMEWORK
    #import <UnzipKit/UnzipKit-Swift.h>
#else
    // Used when built as a static library
    #import "UnzipKit-Swift.h"
#endif

我在Xcode项目中为开发时间定义了BUILT_AS_FRAMEWORK,但是当我将该库作为动态框架时,并且因为我没有在Podspec中定义该标志,它试图解析第二个标志。导入,但找不到它。

是否有一种方法可以定义BUILT_AS_FRAMEWORK预处理程序宏,但前提是使用方的Podfile不能将其构建为静态库?

我为此问题创建了issue #9101 in the CocoaPods project

1 个答案:

答案 0 :(得分:0)

我能够结合使用Xcode环境变量(PACKAGE_TYPE)和预编译运行脚本构建阶段来动态生成要导入的标头,从而正确导入生成的Swift标头。 / p>

generate-swift-import-header.sh

#!/bin/sh

[[ "${PACKAGE_TYPE}" = "com.apple.package-type.wrapper.framework" ]] \
    && SWIFTIMPORT="<${PRODUCT_MODULE_NAME}/${PRODUCT_MODULE_NAME}-Swift.h>" \
    || SWIFTIMPORT="\"${PRODUCT_MODULE_NAME}-Swift.h\""

if [ -z "$PODS_TARGET_SRCROOT" ]; then
    PODS_TARGET_SRCROOT=${SOURCE_ROOT}
    echo "Building in Xcode instead of CocoaPods. Overriding PODS_TARGET_SRCROOT with SOURCE_ROOT"
fi

_Import_text="
#ifndef GeneratedSwiftImport_h
#define GeneratedSwiftImport_h

#import ${SWIFTIMPORT}

#endif /* GeneratedSwiftImport_h */
"
echo "$_Import_text" > ${PODS_TARGET_SRCROOT}/Source/GeneratedSwiftImport.h

Podspec更新

s.script_phases = { :name => "Generate UnzipKit Swift Header",
                    :script => "\"${PODS_TARGET_SRCROOT}\"/Scripts/generate-swift-import-header.sh",
                    :execution_position => :before_compile }

库来源

我用以下内容替换了条件导入:

#import "GeneratedSwiftImport.h"

我还忽略了Git中的GeneratedSwiftImport.h文件。