从Cocoapods迁移到Swift Package Manager



Cocoapods被认为是iOS上最受欢迎的依赖管理器。近年来,Apple一直在开发其本机Swift Package Manager(SPM)依赖项管理器。

最初,它只能用于服务器端Swift或终端应用程序。 SPM在此类应用程序上运行和修改,社区熟悉其工作,并且Apple团队获得了beta测试人员。

随着Xcode 11的发布,SPM开始进入iOS开发领域。现在,它已经是可以使用的功能完善的工具,但到目前为止还存在局限性。

在当前版本中,SPM不支持资源(我们正在等待SE-0271)。在我们国家,每个模块都是可以与项目连接的原子自给自足的依赖项,因此需要资源(本地化,资产)。

同时,我们可以为迁移做准备:了解迁移的难度,是否可以自动化以及可能遇到的问题。

为什么从Cocoapods迁移到SPM?


  • 原生性和融入生态系统。Xcode已经提议创建或添加SPM软件包。
  • 与Cocoapods不同,不再需要具有工作区来处理依赖项项目。
  • 添加新的依赖项后,您无需进行pod安装并重建整个项目。
  • 使用本地依赖关系很方便:文件夹结构不变,重建速度更快。
  • SPM , Cocoapods, Ruby ( iOS-).
  • Cocoapods Xcode Swift.
  • Example : Xcode Package.swift .
  • abstract_target: SPM .
  • blame , .
  • Ruby, .

?


如果您的项目有很多依赖性,那么迁移过程将无法在一天内完成。Podfile中的依赖项数量不等于依赖项总数,因为一个依赖项可以附带十个依赖项。即使您没有很多依赖关系,但您开发了依赖关系,即使在私有存储库中,也可能无法快速迁移。幸运的是,SPM与Cocoapods相处得很好,并且迁移过程可以迭代。最主要的是要考虑到细微差别:

  • SPM和Cocoapods依赖关系之间不应有交集。
  • 迁移应集成到组件开发过程中。如果正在开发组件,则应同时针对Cocoapods和SPM执行版本升级。
  • 对于团队来说应该没有任何困难,这意味着您需要通过一个cli命令来实现所有依赖项的安装。
  • 迁移必须内置在CI CD中。在所有配置中,必须同时在本地和CI代理上构建项目。

从哪里开始?


首先,我们收集您的依赖项的完整列表-它显示在Podfile.lock中。您可以使用SPMReady之类的实用程序



接下来,我们将它们按关系分组。例如,几乎所有组件都依赖于SMENetwork,这意味着在SMENetwork本身迁移之前,我们将无法将它们迁移到SPM。

然后,我们选择一个模块,SMENetwork是大多数模块所依赖的模块。
最后,转到该模块的存储库,将其检入一个文件夹,然后在该文件夹的根目录中创建一个模块。

git clone ssh://.../smenetwork.git Developer/SMENetwork
cd Developer/SMENetwork
swift package init
Creating library package: SMENetwork
Creating Package.swift
Creating Sources/
Creating Sources/SMENetwork/SMENetwork.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/SMENetworkTests/
Creating Tests/SMENetworkTests/SMENetworkTests.swift
Creating Tests/SMENetworkTests/XCTestManifests.swift

结果,我们得到了主要的Package.swift文件以及Sources和Tests文件夹。如果您已经有了它们,它们将不会打磨。为Package操作示例创建了文件SMENetwork.swift,SMENetworkTests.swift,XCTestManifests.swift,LinuxMain.swift,可以将其删除。

Package.swift文件如下所示:



现在让我们看一下SMENetwork.podspec文件:



如您所见,“源”和“测试”在其他文件夹中。传输文件并测试Cocoapods示例项目。



我们将开发平台添加到Package.swift中,并在此处传输podspec文件中的依赖项。我们确保它们支持SPM:只需检查Github中是否有Package.swift文件即可。如果他不在,甚至没有公关人员,我们将进行公关并帮助开源社区。





对于SPM,您无需创建示例项目:只需在Xcode中打开Package.swift,它将下载并连接依赖项,并根据我们的规范创建目标。我们只能跑步。



在我们的案例中,几乎所有内容都可以立即使用,唯一的一个地方是Import Foundation忘记了:iOS开发人员习惯于UIKit和Foundation是可选的,因为它不需要它们就可以工作。现在是时候取消这种习惯了。



包编译,测试编译,但是失败。



在这里,我们遇到了Package缺乏资源的局限性,测试基于json中的moks,我们正在等待SE-0271 ...


从Cocoapods切换到SPM很容易。步骤很明确,但是流程很单调,需要自动化。

无需花费太多精力,您就可以从.podspec文件创建一个Package并将其提交到存储库。最重要的是-您可以进行一个项目,而另一个项目将保留在Cocoapods上。如果他愿意的话。

All Articles