我尝试使用支持XC框架的迦太基


迦太基0.37.0已发布,现在支持XC框架??
这将消除自Xcode 12以来在迦太基发生的问题。不需要变通办法脚本,并且M1 Macs现在可以使用Carthage。
我想解释为什么Carthage需要XC框架的背景以及生成XC框架的过程。

如果您只想知道如何在迦太基中生成XC框架,请转到在迦太基中构建XC框架。

什么是XCFrameworks?

首先,让我们谈谈XC框架。
XC Frameworks本身是一项从Xcode 11开始可用的技术。
理解它的最简单方法是实际查看使用Carthage 0.37.0构建的XC框架。以下是构建RxSwift的结果。
スクリーンショット 2021-02-07 18.04.41.png
您可以看到在.xcframework目录下有目录ios-arm64_armv7ios-arm64_i386_x86_64-simulator,并且每个目录中都有.framwork个文件。
通过使用XCFrameworks,可以在一个.xcframework包中分发用于不同体系结构的多个框架。

为什么迦太基不能在M1上工作?

M1 Mac的体系结构采用了与iOS设备相同的arm64体系结构,所有设备均已开始。

我首先要说明Carthage在Intel Macs上的工作方式。

迦太基如何在Intel Macs

上工作

Carthage_IntelMac.jpg
即使在Intel Mac上未采用XC框架格式时,也可以使用Carthage内置的框架在实际计算机和模拟器上进行操作。
这是因为在使用Carthage进行构建时,通过命令lipo将实际iOS设备的框架和iOS仿真器的框架组合为一个框架。由于Intel Mac具有x86_64的体系结构,因此在Mac上运行的模拟器也具有x86_64的体系结构。 arm64体系结构适用于实际的iOS设备。

顺便说一句,我想我已经在构建设置的RunScript阶段设置了一个名为copy-frameworks的脚本。它曾经再次使用lipo命令从放在一起的框架中删除不必要的框架。结果,arm64框架保留在实际计算机的构建中,而x86_64框架保留在模拟器的构建中。

M1 Mac

会发生什么

Carthage_M1Mac.jpg
从适用于M1 Mac的Xcode 12开始,arm64已添加到此模拟器的体系结构中。由于M1 Mac具有arm64架构,因此模拟器也将是arm64。这迫使迦太基将"真实的iOS设备(arm64)"和" M1 Mac模拟器(arm64)"组合到一个框架中。这里的问题是实际的iOS设备和M1 Mac模拟器都具有相同的arm64架构。 lipo命令不能将用于同一体系结构的框架组合为一个框架。这使得迦太基有必要改变方向以支持XC框架,从而允许多个框架共存。

Carthage_XCFrameworks.jpg

这是我的翻译,包括解决方法脚本,但是在[日语翻译]迦太基问题,Xcode 12,XCFrameworks,Apple Silicon等文章中对此进行了详细描述。如果您有兴趣,希望您能阅读。

M1的XC Framework兼容版本吗?

不正确。
XC框架本身可以在Intel Mac上使用,最重要的是,它省去了将框架组合为一个框架并使用copy-frameworks删除不必要的框架的额外工作,因此可以在Carthage中构建时间并在Xcode中进行构建,从而可以缩短时间。
由于设置也很简单,因此我认为将来即使不是M1 Mac,使用XC Frameworks格式也更有利。

用迦太基

构建XC框架

中,使用XC Frameworks构建迦太基的过程如下所示。
它写的很好,所以没有什么特别的说,但是您可以通过以下3个步骤以XC Frameworks格式进行构建。

  • 首先,创建一个Cartfile。这和以前一样。
  • 然后使用--use-xcframeworks选项进行构建。

    • 例如,carthage update --platform ios --use-xcframeworks

    • 这将在Carthage/Build下生成.xcframework
  • 在生成设置的Frameworks, Libraries, and Embedded Content部分中注册生成的.xcframework
  • 就是这样。
    到目前为止,我认为copy-frameworks是在Build Phase设置中与Run Script一起操作的,但是在支持XC Frameworks之后将不再需要。如果要迁移到现有项目中的XC Framework,请不要忘记删除copy-frameworks步骤。

    XcodeGen

    中的设置

    我们还将向您展示如何将XC框架与XcodeGen一起使用。以前,XcodeGen提供了一个名为carthage:的简写形式,它简化了迦太基生成的库的配置,但是XC Frameworks格式消除了这种情况。只需在framework:设置中指定.xcframework,就可以了。

    project.yml

    1
    2
    3
    4
    5
    6
    targets:
      SomeProject:
        dependencies:
          - framework: "Carthage/Build/RxSwift.xcframework"
          - framework: "Carthage/Build/RxCocoa.xcframework"
          - framework: "Carthage/Build/RxRelay.xcframework"

    摘要

    我担心在Xcode 12之后以及以后的迦太基会发生什么变通方案脚本,但是有了XC Frameworks的支持,看来我将来仍可以继续发挥积极作用。不是?
    有一个强大的竞争对手SPM,但我希望Carthage(它可以缩短构建时间)将继续保持最佳状态。

    参考

    • 迦太基问题,Xcode 12,XCFrameworks,Apple Silicon等|由Quentin Fasquel提供|中

      • [日语翻译]迦太基问题,Xcode 12,XCFrameworks,Apple Silicon等| zeero发表| 2021年1月|中
    • 如何声明一个迦太基构建的XCFramework依赖关系·第1006期·yonaskolb / XcodeGen