1

我正在尝试设置以下私有 Cocoapods 安排:

PodA取决于PodB哪个取决于CommonCrypto

CommonCryptodylibiOS 附带但没有Swift标头模块的一个。在PodB我创建了一个module.modulemap包含以下内容的自定义:

module CommonCrypto [system] {
    header "/usr/include/CommonCrypto/CommonCrypto.h"
}

PodBpod spec lint PodB.podspec添加以下行后通过 lint 测试 ( ):

# 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我靠着PodB。使用s.dependency = 'PodB'linting编译任何文件时出现错误:PodApod spec lint --sources=myrepo PodA.podspecSwiftimport PodB

missing required module 'CommonCrypto'

我该如何解决这个问题?CommonCrypto对我来说是私有的还是公开的对我来说并不重要PodB

我尝试添加export *module.modulemap但没有任何区别。

4

4 回答 4

1

我用一个(稍微)丑陋的解决方法解决了这个问题;我将包含路径导出到父项目。

由于包含路径是多值的,一个列表而不是单个设置,Cocoapods 可以将父项目 ( PodA) 设置的任何内容与子项目 ( PodB) 需要的任何内容合并。

我之前曾尝试过此解决方案,但由于我使用的是HEADER_SEARCH_PATHS而不是SWIFT_INCLUDE_PATHS. 固定 podspec 的相关位如下所示:

# Ensure module isn't deleted by CocoaPods
s.preserve_paths = 'path_to/PodB/CommonCrypto'
s.pod_target_xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/path_to/CommonCrypto' }
s.user_target_xcconfig = { 'SWIFT_INCLUDE_PATHS' => '$(PODS_ROOT)/path_to/CommonCrypto' }

user_target_xcconfig是允许PodB将构建设置注入PodA. 这通常不是一个好主意,可以用来搞砸各种事情,所以我欢迎更好的解决方案,但在将父 pod 指向模块的特殊情况下,我认为这是可以接受的。

也就是说,我认为PodA如果同时依赖于两者PodB以及PodC两者都B需要C,那么这个解决方案将会失败CommonCrypto......

于 2015-10-06T17:08:06.193 回答
1

到目前为止,我很幸运,只需将所有需要的 CommonCrypto 标头复制到一个桥接头中,并将其包含到 pod 中。CommonCrypto 很少更改,在发生任何重要更改之前,它很可能是一个模块化的标头。有关示例头文件,请参见RNCryptor.h 。请注意,所有#ifdef条件都包括在内,并且包括每个完整的标头(不仅仅是该项目所需的)。这应该可以防止多个包导入同一个文件(只要标题不变)。

生成的podspec仅包含.h作为源:

s.source_files = 'RNCryptor.swift', 'RNCryptor.h'
于 2015-10-06T17:53:41.113 回答
0

使用 $(PODS_TARGET_SRCROOT) 而不是 $(PODS_ROOT)/podname/ 为我工作

s.source_files = 'Classes/**/*.swift', 'modules/**/*.map'
s.preserve_paths = 'modules/**/*.map'

s.pod_target_xcconfig = {
   'SWIFT_INCLUDE_PATHS[sdk=iphoneos*]'         => '$(PODS_TARGET_SRCROOT)/modules/iphoneos/CommonCrypto',
   'SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*]'  => '$(PODS_TARGET_SRCROOT)/modules/iphonesimulator/CommonCrypto',
}

module.map 文件:modules/iphoneos/CommonCrypto/module.map:

module CommonCrypto [system] {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}

模块/iphonesimulator/CommonCrypto/module.map:

module CommonCrypto [system] {
    header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}
于 2017-07-05T12:12:49.553 回答
0

您是否将框架添加到 podB 的规范文件中?

s.frameworks = 'CommonCrypto'
于 2015-10-06T03:41:52.700 回答