如何为闭源CocoaPod创建XCFramework,当它依赖于其他pod时



我希望创建一个闭源CocoaPod。从我的研究来看,建议似乎是将其作为XCFramework发布。通过在Podspec文件中指定其他cocoapod,似乎也应该有可能使您的框架依赖于它们。这将确保当有人将这个pod添加到他们的Podfile并运行pod install时,它将安装这个框架及其依赖项。

我已经创建了一个框架Xcode项目,并一直在我们的应用程序的工作空间内开发它作为子项目。因此,此时,应用程序通过CocoaPods安装了所有依赖项,这允许其中的框架利用它们。现在我准备发布框架,以便它可以在其他应用程序中使用。

根据我的理解,我需要首先创建一个XCFramework,然后可以为它创建一个CocoaPod。当我去归档框架项目时,我得到一个错误,因为它找不到依赖项,这是有意义的。在这一点上,我不明白这应该是如何工作的,因为它似乎框架需要包含在自身的依赖关系,以便成功地创建XCFramework,但我从我的研究中预计这将由CocoaPods处理,而不包括在框架本身。

xcodebuild archive 
-scheme MyFramework 
-configuration Release 
-destination 'generic/platform=iOS' 
-archivePath './build/MyFramework.framework-iphoneos.xcarchive' 
SKIP_INSTALL=NO 
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
/Users/.../AppName/MyFramework/Helpers/Extensions.swift:10:8: error: no such module 'Kingfisher'
import Kingfisher
^
** ARCHIVE FAILED **

要解决这个问题,我所做的是为框架项目创建一个Podfile并运行pod install,以便它有自己的工作区。当我打开工作区时,我验证了我能够成功地在Xcode中构建框架。然后要创建存档,指定它应该构建工作区而不是项目,如下所示:

xcodebuild archive 
-workspace MyFramework.xcworkspace 
-scheme MyFramework 
-configuration Release 
-destination 'generic/platform=iOS' 
-archivePath './build/MyFramework.framework-iphoneos.xcarchive' 
SKIP_INSTALL=NO 
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

据我所知,当您创建XCFramework时,依赖项将不包括在内,它将只包含您自己的框架。但是,为了成功构建存档,依赖项必须是可访问的。

这个理解解决了我问这个问题时的困惑。现在我可以继续为我的XCFramework创建一个CocoaPod,并在Podspec文件中指定它的依赖项。

Jordan的答案是正确的。

假设Foo依赖Bar和Baz框架。在存档之前,您必须创建一个目标。因为Foo依赖于Bar和Baz框架,所以编译器需要确保你能真正实现这个承诺。

有两种方法来构建你的pod依赖

使用使用Podfile

的示例应用程序构建并存档它将方案设置为示例应用程序并执行存档

您使用带有Podfile的项目安装依赖项。Jordan也是正确的,虽然Foo有调用Bar, Baz函数的行,但是Foo框架只是Foo的一个二进制文件,它不包括Bar, Baz框架。最终安装Foo的应用,将链接(拉取并安装)Bar, Baz框架…

注意:如果你使用PodfilePodfile已经包含了一些安装后的钩子来改变构建设置,那么很明显你的构建将受到它们的影响。

直接构建框架,不需要Podfile

将您的方案设置为pod的方案,而不是示例应用程序的方案并存档。

归档文件只是构建的压缩形式。构建将包括所有依赖项。

一般情况下,你可以从命令行工具或Xcode中调用/创建存档,但最好从命令行工具中完成,这样你就可以更明确地控制传递给xcodebuild的标志。

要创建一个框架,你只需要在存档中使用你想要的框架。

当你这样做的时候:

xcodebuild -create-xcframework 
-framework "archives/StarWarsKit-iOS.xcarchive/Products/Library/Frameworks/StarWarsKit.framework" 
-framework "archives/StarWarsKit-iOS-simulator.xcarchive/Products/Library/Frameworks/StarWarsKit.framework" 
-output "StarWarsKit.xcframework"

你在做两件重要的事情:

  • 从两个(iOS &iOS-simulator)平台
  • 从所有框架在存档的/Products/Library/Frameworks你只是试图创建一个xcframework的StarWarsKit。您没有为工作区中的其他框架创建xcframework。如果StarWarsKit的依赖动态链接,则排除所有其他库。但是,如果依赖项被静态链接,则它们可能成为二进制文件的一部分,即它们被吸收并链接到StarWarsKit的最终产品/二进制文件中。

通过一些过度简化,Xcode的构建过程有点像这样:

  • 构建它的所有依赖项。(如果你不建立依赖,然后我不知道它是否可以实际编译)
  • 存档所有构建与所有其他依赖
  • 只提取您需要的产品。不包含任何其他外部依赖。

相关内容

  • 没有找到相关文章

最新更新