将iOS项目从CocoaPods迁移到Carthage的五个步骤

注意:这篇文章最初是在XCBlog上发布的 ,请阅读原始文章以获得更好的图形。

苹果可能不喜欢iOS开发人员将第三方依赖项添加到iOS项目这一事实。 苹果的核心技术为健康的文档提供了足够的框架和工具,开发人员可以使用它们来构建和分发iOS应用。 这可能是Apple目前没有任何官方程序包管理器来管理iOS应用程序依赖性的原因。 但是,这不是现实,iOS开发人员希望共享和分发代码以实现可重用性,避免重复并节省时间。

长期以来,CocoaPods一直作为iOS应用程序的依赖项管理解决方案。 它是用Ruby编写的,iOS开发人员需要了解Ruby才能使用它。 只要一切正常,一切都会好的,但是如果CocoaPods或Xcode项目中CocoaPods所做的不可思议的设置出现问题,痛苦就会开始。 迦太基是另一个由Swift编写并由Github工程师维护的依赖项管理解决方案。 在上一篇博客文章中,我解释了CocoaPods和Carthage有什么区别以及如何选择合适的框架。 我强烈建议您在此处阅读该帖子,以了解基本区别。 在本文中,我们将假设您已决定去迦太基,我们将看到从CocoaPods迁移到迦太基有多么容易。 通过应用这五个步骤可以轻松实现。

  • 相关性分析
  • 迦太基干跑
  • CocoPods退役
  • 清理Xcode项目
  • 将框架链接到目标

我们将详细讨论每个阶段。 这里要注意的一件事,我们只是在谈论Swift框架和动态库,而不是在谈论旧的Objective-C或静态框架。

将iOS项目迁移到Carthage的第一步是依赖性分析。 如果您使用的是CocoaPods,则iOS项目的Podfile中必须挂有一系列依赖项。 在分析阶段,您应该做两件事。

在此阶段,请尝试摆脱不再使用的依赖项,或者尽可能替换为其他方法。 该示例为SwiftLint,请思考为什么我们需要将SwiftLint添加为对iOS应用程序的依赖。 它可以在Github预提交钩子上轻松运行,也可以从本地计算机或Continuous Integration服务器上的命令行脚本轻松运行。 同样,检查使用了多少其他依赖项,看看是否可以轻松地用本机Apple技术替换这些依赖项,例如可以将URLSession和Codable替换为Alamofire或SwiftyJSON。 更少的依赖关系减少麻烦。

几乎所有主要的第三方Swift框架都支持Carthage。 检查方法是访问框架的Github存储库页面并查看README文件。 应当有徽章说明迦太基的支持以及平台的支持,如下所示(虽然不是很大)

如果您在那里没有看到徽章,并且可以使用xcodebuild构建Swift框架,并且该框架具有受iOS平台支持的方案,那么也应该可以。 一次,您确认了这两件事,就可以继续进行下一步,即迦太基空运行。

在此阶段,您已经确认支持从CocoaPods迁移到Carthage所需的依赖项。 是时候准备Cartfile并在其中添加所有依赖项,并在Podfile或Podfile中提到正确的版本。lockOnce准备好Cartfile,而不是尝试在当前项目上运行Carthage更新。

  $迦太基更新-平台iOS 

执行此命令后,可能是时候喝咖啡了。 当您从喝咖啡休息时间回来并且一切都已成功构建后,便可以进行下一步了。 但是,您陷在错误中,现在是修复这些错误的好时机。 常见的错误是

  • Swift版本可能有所不同
  • 该框架不支持iOS平台,或者在构建时并未考虑到迦太基。
  • 或迦太基已指定的任何其他错误

一旦成功构建所有内容,您应该拥有带有Checkout和Build子目录的Carthage目录,该目录具有依赖项框架和预构建框架的所有源代码。 在这个阶段,您最好从您的iOS项目中放弃CocoaPods。

当您将CocoaPods集成到iOS项目中时,您可能已经观察到CocoaPods几乎侵入了您的Xcode项目。 CococPods不仅创建了Xcode Workspace,而且还深入渗透到构建设置和构建阶段。 从iOS项目中删除所有混乱的过程听起来像是y牛刮胡子,但事实并非如此。 无需手动删除CococPods文件,脚本和框架。 非常感谢CocoPods-Deintegrate插件,该插件几乎删除了CocoaPods在Xcode项目中放置的所有标记。 我们只需要下载插件并从iOS项目的根目录或您的Xcode项目或工作区所在的位置运行pod deintegrate脚本即可。

  $ [sudo] gem install cocoapods-deintegrate 
$ pod解体

只要此脚本可以工作,就无需重新发明轮子,但了解此脚本在后台执行的操作很重要。 总而言之,此脚本执行以下操作

  • 从每个目标的构建阶段删除特定于CocoaPods的脚本。 这些脚本通常是“ Copy Pod Resources”,“ Check Pod Manifest.lock”和“ Embed Pod Frameworks”。
  • 从构建阶段libPods-.a删除Pod库
  • 从项目中删除Pod文件引用,包括.a文件以及所有目标的所有.xcconfig文件
  • 从Xcode项目中删除Pod组

如果您知道Ruby,那么可以随时查看Github上的deintegrator.rb文件。或者,您可以使用bash或python编写自己的脚本来删除上述内容。 同样,我们也可以手动执行上述步骤,但是上述自动方式肯定可以节省您的时间。

正如您在上面看到的,在上一步中,我们几乎删除了CocoaPods的引用,但是在Xcode项目中仍然需要手动删除一些CocoPods标记。 CocoPods-Deintegrate插件不会删除以下内容

  • Xcode工作区
  • Podfile和Podfile.lock文件
  • 附加到构建配置(如COCOAPODS = 1)的值

我们必须手动或使用一些脚本删除这些内容。 还有另一个插件cocoapods-clean可以删除工作空间和Podfile,但是手动删除它非常容易。 您还可以交叉验证Xcode项目,以查看是否还有任何自定义设置。

完成上述步骤后,您完全可以免费使用CocoPods。 您已成功将白象从iOS项目中删除。 好极了!

这是从CocoaPods迁移到Carthage的最后一步。 此时,您可能具有带有依赖项源代码的Carthage / Checkout目录和带有所有已构建.framework捆绑包的Carthage / Build目录。 现在,我们必须将所有这些框架链接到此处的迦太基文档中提到的目标。 这是一个手动过程,但我们只需要执行一次。 但是,这使您可以完全控制依赖项,并且您知道正在做什么而不是引擎盖下发生的魔术。

按照旧的Podfile将所有框架链接到目标并添加Carthage copy-frameworks脚本后,您的所有项目和依赖项都应与CocoaPods一起工作。 一旦您确认一切正常,并且在这些步骤中没有任何破坏。 是时候庆祝用Swift编写的新工具了。 没有Ruby,也没有魔术。

现在,我们已经看到了将iOS应用程序迁移为使用Carthage的步骤。 关于迦太基,有些事情要记住

  • 基于框架的迦太基思想。 迦太基仅支持动态Swift框架,不支持静态库。 将来,您将只能添加动态Swift框架作为依赖项。 您仍然可以使用-no-build选项添加静态依赖项源代码,但这不是迦太基的方式。
  • 迦太基专为Swift设计。 如果您仍在处理一些Objective-C,请先解决此问题,然后再转向迦太基。
  • 从CocoaPods迁移到Carthage不能解决iOS应用程序中的问题。 它只允许您控制Xcode项目,并使您摆脱处理Ruby问题的麻烦。

与CocoaPods相比,使用迦太基有很多好处。 您可以参考Carthage与CocoaPods上的上一篇文章,以进行详细比较。

删除CocoaPods并不是您可能会想到的大任务,使用以下五个简单步骤,我们可以完全从iOS项目中摆脱CocoaPods,并为iOS应用程序使用基于Swift的依赖项管理解决方案。 这可能是从iOS应用中删除Ruby的第一步。 迦太基将给您带来更少的麻烦,并可以完全控制您的Xcode项目。 您最近从CocoaPods迁移到迦太基了吗? 你有什么经验?

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..