我试图设置以下安排的私人Cocoapods:PodA
依赖于PodB
,而PodB
又依赖于CommonCrypto
。CommonCrypto
是iOS附带的dylib
,但没有Swift
头模块。在PodB
中,我创建了一个自定义的module.modulemap
,包含以下内容:
module CommonCrypto [system] {
header "/usr/include/CommonCrypto/CommonCrypto.h"
}
添加以下行后,PodB
通过了lint测试(pod spec lint PodB.podspec
):
# Ensure module isn't deleted by CocoaPods
s.preserve_paths = 'path_to/PodB/CommonCrypto'
s.pod_target_xcconfig = { 'HEADER_SEARCH_PATHS' => '$(PODS_ROOT)/path_to/CommonCrypto' }
在PodA
中,我依赖于带有s.dependency = 'PodB'
的PodB
。当用pod spec lint --sources=myrepo PodA.podspec
编译任何带有import PodB
的Swift
文件时,我得到一个错误:
missing required module 'CommonCrypto'
我该如何着手解决这个问题呢?CommonCrypto
对于PodB
是私有的还是公共的对我来说都没有关系。
我试着把export *
加到module.modulemap
上,但没有什么区别。
4条答案
按热度按时间2vuwiymt1#
我用一个(稍微)难看的变通办法解决了这个问题;我将包含路径导出到父项目。
由于包含路径是多值的,一个列表而不是一个设置,Cocoapods可以合并父项目(
PodA
)设置的任何内容和子项目(PodB
)要求的任何内容。我以前尝试过这个解决方案,但是失败了,因为我使用的是
HEADER_SEARCH_PATHS
而不是SWIFT_INCLUDE_PATHS
。user_target_xcconfig
允许PodB
将构建设置注入到PodA
中。这通常不是一个好主意,可能会把所有事情都搞砸,所以我希望有一个更好的解决方案,但在将父pod指向模块的特定情况下,我认为这是可以接受的。也就是说,如果
PodA
依赖于PodB
和PodC
,而B
和C
都需要CommonCrypto
,我 * 认为 * 此解决方案将失败...m3eecexj2#
到目前为止,我已经很幸运地将所有需要的CommonCrypto头复制到一个桥接头中,并将其包含到pod中。CommonCrypto很少更改,在发生任何重要更改之前,它很可能是一个模块化的头。请参见RNCryptor.h以获得一个示例头文件。请注意,所有的
#ifdef
条件都包括在内,并且包含了每个完整的头文件(而不仅仅是这个项目所需要的)。这应该可以防止多个包导入同一个文件(只要头文件没有改变)。resultant podspec只包含
.h
作为源代码:qc6wkl3g3#
您是否将框架添加到podB的规范文件中?
3xiyfsfu4#
使用$(PODS_TARGET_SRCROOT)而不是$(PODS_ROOT)/podname/对我有效
module.map :模块/iphoneos/公用加密/module.map:
模块/iphonesimulator/公用加密/module.map: