我第一次在我的 CocoaPods 库中包含 Swift 源代码。为了让项目进行编译,我需要将生成的 Swift header 导入到我的 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
以供开发时间,但是当我将库作为动态框架进行 lint 时,并且因为我没有在 Podspec 中定义该标志,所以它会尝试解决第二次导入,找不到。
有没有办法可以定义 BUILT_AS_FRAMEWORK
预处理器宏,但前提是使用的 Podfile 不将其构建为静态库?
我创建了issue #9101 in the CocoaPods project对于这个问题。
最佳答案
我能够将 Xcode 环境变量 (PACKAGE_TYPE
) 与预编译运行脚本构建阶段结合使用,动态生成要导入的 header ,从而生成正确的 Swift header 导入。
生成-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 中的 GenelatedSwiftImport.h
文件。
关于swift - 有没有办法根据静态或动态使用情况有条件地定义 Podspec 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57461108/