宣布可可足类产生

抬起头,我们已经搬家了! 如果您想继续了解Square的最新技术内容,请访问我们的新家https://developer.squareup.com/blog

在Square,我们将CocoaPods用作iOS开发工作流程的核心部分,除了在测试套件中使用的库之外,仅在Square Point of Sale应用程序中就有大量库。 这些库中有许多都生活在我们的主要iOS monorepo中,并且随着应用的增长,构建整个库所需的时间也越来越长。

CocoaPods允许我们将所有库配置保留在易于阅读的podspec文件中,与Xcode项目相比,在pull请求中查看它要容易得多。 我们的项目配置很少在Xcode本身中进行管理,这确保了文件系统与Xcode中所见内容之间的一致性。

但是,将所有这些模块集成到单个项目中存在一些缺点。 尽管我们已经投入了很多精力来改善安装依赖项的整体性能,但是运行单个pod install命令可能需要一到两分钟,这在快速迭代单个库时会加起来。 使用CocoaPods还会生成一个非常大的Pods项目,这可能导致Xcode的响应速度变慢,并且需要很长时间才能建立索引。

随着这种爆炸性的增长,显然我们需要开发人员更好的工作方式。 我们希望能够隔离地处理模块,仅构建正在积极处理的模块并仅运行随附的测试套件。

输入pod gen。

我们构建了一个CocoaPods插件,该插件使iOS开发人员可以轻松地独立处理各个库,尤其是在monorepo的情况下。 运行此插件将生成一个存根应用程序项目,该项目将集成并链接指定的库及其依赖项。 我们完整的Pods项目大约需要95秒才能生成,并且是35.6万行。 如果我们在U​​I组件库上运行pod gen,则将花费5秒钟并生成9000行项目文件。 这使得在这些基础库上的迭代变得如此快,并且工具可以轻松地处理较小的规模。 关于gen的最酷的事情是它会自动从现有Podfile和Podfile.lock中引入依赖项限制,因此所有配置都将在生成的库工作区中进行镜像。

这不仅在用于独立开发的monorepo上下文中有用。 当与可从podspec中描述测试的功能结合使用时,它在独立的存储库中也可以很好地工作。 这使独立库可以避免检入和维护自己的Xcode项目,因为CocoaPods可以对其进行管理。 这意味着您不再需要处理PR中的Xcode冲突,因为.xcodeproj只是生成的用于开发的工件。 podspec本身成为描述您的库的真理源,您可以使用简单的pod gen命令从中生成工作区。

可以简单地将测试放在文件系统中的相应文件夹中,并将其作为CI的一部分运行。 例如,我们设置了这个演示仓库,我们需要签入的唯一配置是podspecs。 我们已经在内部使用这种宝石几个月了,很高兴与世界分享它!