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上。如果他愿意的话。