如何手动将 modulemap 文件添加到 XCFramework 中?

Rak*_*uyo 5 ios swift xcframework

我有一个 XCFramework,其目录结构如下:

\n
.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 WechatOpenSDK-XCFramework.xcframework\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Info.plist\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.txt\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ios-arm64_armv7\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Headers\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 WXApi.h\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 WXApiObject.h\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 WechatAuthSDK.h\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Modules\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module.modulemap\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 libWechatOpenSDK.a\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ios-arm64_i386_x86_64-simulator\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Headers\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 WXApi.h\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 WXApiObject.h\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 WechatAuthSDK.h\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Modules\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module.modulemap\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 libWechatOpenSDK.a\n
Run Code Online (Sandbox Code Playgroud)\n

我添加了Modules目录和module.modulemap文件。XCFramework 最初并不包含这些。

\n

为了module.modulemap文件,我尝试将其定义为:

\n
framework module WechatOpenSDK {\n  umbrella header "WXApi.h"\n\n  export *\n  module * { export * }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我也尝试将其定义为:

\n
framework module WechatOpenSDK {\n  header "WXApi.h"\n  header "WXApiObject.h"\n  header "WechatAuthSDK.h"\n\n  export *\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,当我将 XCFramework 拖到另一个项目中时,无论我如何定义文件module.modulemap,我都无法得到import WechatOpenSDK工作。

\n

Info.plist我还尝试修改XCFramework中顶级文件的内容。我删除了HeadersPath价值为Headers。

\n

我的问题是:有没有办法手动向这个 XCFramework 添加模块映射支持?

\n

Adi*_*ain 2

从你的XCFramework的目录结构来看,忽略Modules你手动添加的目录,你的XCFramework正在打包一组静态库。您很可能使用以下命令构建它:

xcodebuild -create-xcframework -library <path> [-headers <path>] [-library <path> [-headers <path>]...] -output <path>
Run Code Online (Sandbox Code Playgroud)

和你一样,我也尝试过,但未能找到导入静态库或将一组静态库捆绑为模块的 XCFramework 的方法。我尝试将Defines Module静态库的构建设置更改为YES. 我尝试module.modulemap在以下位置手动定义和添加文件:

  1. MyLibrary.xcframework
  2. MyLibrary.xcframework/Modules
  3. MyLibrary.xcframework/<LibraryIdentifier>
  4. MyLibrary.xcframework/<LibraryIdentifier>/Modules
  5. MyLibrary.xcframework/<LibraryIdentifier>/Headers

最后,我放弃了,并得出结论:如果我们想将其作为模块导入到其他地方,我们最好定义一个动态框架而不是静态库。否则我们就会逆流而上。当您在 Xcode 中创建 Framework 目标并构建它时,您将看到 Xcode 自动为其提供以下目录结构:

|-- MyFramework.framework (directory)
  |-- Info.plist (file)
  |-- MyFramework (binary file)
  |-- Headers (directory)
  |-- Modules (directory)
    |-- module.modulemap (file)
Run Code Online (Sandbox Code Playgroud)

如果您将 Swift 文件添加到 Framework 目标,您将看到 Xcode 将以下内容添加到构建的框架中:

  1. 目录中的一个MyFramework-Swift.h文件Headers;
  2. MyFramework.Swift文件中的模块module.modulemap;和
  3. MyFramework.swiftmodule目录中的目录Modules。

基本上,Xcode 为我们完成了所有繁重的工作。

当您准备好将框架集打包为 XCFramework 时,请使用以下命令来执行此操作:

xcodebuild -create-xcframework -framework <path> [-framework <path>...] -output <path>
Run Code Online (Sandbox Code Playgroud)