嗨,我是三亚-iOS开发人员,在本文中,我将分享我的方式来解决在进行具有多个目标的项目时出现的头痛问题。

我预见到以下问题:“三亚为什么在项目中需要几个目标?” 我的回答:在我曾经工作过的项目中,有一个与客户帐户相关的目标,因此:
- 我们无权访问该帐户;
- 不可能生成配置文件和分发证书;
- 最糟糕的是无法将新设备添加到配置文件中。
因此,在工作室购买新设备时,我们正在等待与客户进行一系列的谈判,以将它们添加到您的帐户中,并有机会对其进行测试。
解决方案很明显-创建第二个目标,该目标与主要目标相似,但具有不同的捆绑销售ID,并且将与我们的工作室帐户完全和完全相关。 快说不做! 第二个目标使我们能够进行全面的开发,而不管客户方的开发人员如何,这不仅节省了开发流程一次,例如,当客户的开发人员在主要目标的配置文件中删除了我们所有的设备并且我们无法在其设备上运行该应用程序时。
必要时,几个目标仍可以出现在您的项目中,例如:
- 从一个代码库中收集多个应用程序,但是使用不同的资源;
- 将应用程序的多个实例保留在一台设备上。
但是在多个目标上进行工作会导致其弊端,主要是需要严格控制向项目中添加新文件的过程。 它们彼此完全相同,向项目添加新文件时,必须在两个目标前面打勾。

在一个大型多层次团队中,无论是技巧还是真诚,这都是非常困难的。
如果您不遵循这一简单规则,则在下一次合并之后,您可能会发现其中一个目标已停止收集,并且Xcode发誓它找不到一个或另一个类。 但是最有趣的是,如果没有将文件从“复制捆绑资源”添加到两个目标(例如xib单元),则只能在运行时找到这样的错误。
在Debug目标出现另一个问题之后,我们决定控制脚本目标的一致性。 我们选择Ruby语言作为工具,因为它具有出色的xcodeproj gem,这几乎是用于iOS开发的编写工具的标准(请参阅fastlane,generamba等)。
结果,我们开发了一个脚本,该脚本实现了以下工作逻辑:
- 项目文件的路径和测试目标的名称将输入到输入中;
- 在前往项目的途中,脚本会找到项目本身。
- 选择所需的目标,从中收集文件(编译源,副本捆绑资源和框架);
- 寻找文件列表之间的差异;
- 我们将白名单中的文件排除在这种差异之外。 例如,具有根据目标而不同的常数的文件(如果决定组织项目以使来自不同目标的应用程序访问不同的服务器,则为baseUrl)或GoogleService-Info.plist文件,这些文件对于不同的目标将有所不同。
如果脚本发现差异,那么我们有问题。 这意味着该文件或框架已添加到一个目标,但未添加到另一个目标。
因此,该脚本允许您执行以下操作:
- 确保来自“编译源”和“副本捆绑资源”的所有文件均已正确添加到两个目标中;
- 还检查添加的框架列表的身份,如果您的项目具有多模块架构,这非常重要;
- 在构建阶段集成脚本可以使您甚至在项目构建阶段之前就可以发现问题;
- 而且,如果您早些时候为此收集了两个关于CI的目标,那么现在您可以将装配保留为一个,从而将CI上的装配时间减少一半。
发生错误时,在Xcode中,您可以观察以下消息:

如果成功,您会发现独角兽:

在存储库中添加到项目,设置以及Example-project的详细说明。
由此产生的实用程序完美地表明,即使作为iOS开发人员,您也可以在日常工作中发挥一小部分创造力,并进行自动化和脚本编写,从而简化您的生活!
感谢您的关注!