swift2 Cocoapods中的Swift子模块

np8igboo  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(269)

我试图设置以下安排的私人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 PodBSwift文件时,我得到一个错误:

missing required module 'CommonCrypto'

我该如何着手解决这个问题呢?CommonCrypto对于PodB是私有的还是公共的对我来说都没有关系。
我试着把export *加到module.modulemap上,但没有什么区别。

2vuwiymt

2vuwiymt1#

我用一个(稍微)难看的变通办法解决了这个问题;我将包含路径导出到父项目。
由于包含路径是多值的,一个列表而不是一个设置,Cocoapods可以合并父项目(PodA)设置的任何内容和子项目(PodB)要求的任何内容。
我以前尝试过这个解决方案,但是失败了,因为我使用的是HEADER_SEARCH_PATHS而不是SWIFT_INCLUDE_PATHS


# 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依赖于PodBPodC,而BC都需要CommonCrypto,我 * 认为 * 此解决方案将失败...

m3eecexj

m3eecexj2#

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

s.source_files = 'RNCryptor.swift', 'RNCryptor.h'
qc6wkl3g

qc6wkl3g3#

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

s.frameworks = 'CommonCrypto'
3xiyfsfu

3xiyfsfu4#

使用$(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 :模块/iphoneos/公用加密/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/公用加密/module.map:

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

相关问题