使用CocoaPods模块化一个大型iOS应用程序



受Hubspot博客文章的启发,我将我的iOS项目拆分为一个主项目和几个使用CocoaPods添加到主项目中的子项目。

我有一个主项目和几个子项目(每个都在一个单独的git存储库和podspec文件中)。优点是每个子项目都可以自己编译、运行和测试。这种方法效果很好,除了在子项目之间共享全局项,如静态字符串、全局协议、基类(例如SomeProtocol.h、constants.h)。我在主项目中定义了静态字符串、协议和基类,并在主项目创建了一个包含全局项的pod规范,该规范被添加到子项目的pod文件中。

子项目使用这种方法编译和运行,但主项目不编译,因为每个子项目pod都将包括等文件

#import <SomeProtocol.h>
#import <constants.h>

当编译单独的pod库时,无法找到(尽管是主项目的一部分)。

如何将大型iOS项目拆分为几个较小的项目,有最佳实践吗?

是否有将大型iOS项目拆分为几个较小项目的最佳实践?

当然!您有两种选择:库和框架。通常,每个库或框架都将是自己的项目,并且将生活在与使用这些库或框架的应用程序共享的工作空间中。这些方案将作为应用程序的依赖项用于构建这些项目。

这或多或少描述了您想要做的事情:Xcode 中的静态库

请注意,您的静态库目标应该将SKIP_INSTALL设置为YES。否则,存档应用程序时会出现问题。

方案似乎是许多开发人员的盲点,但它们对于理解工具和扩展工作流非常重要。如此重要,以至于苹果在2011年就计划进行了一次WWDC会议,然后在第二年几乎逐字逐句地重复了一遍

静态字符串、全局协议、子项目之间的基类

静态字符串应该非常容易-使用NSLocalizedString,然后值由应用程序使用库加载。

我不知道你说的"全球协议"是什么意思。"共享全球项目"听起来不太好。这是你通常想要避免的事情。

基类将进入它们自己的库或框架,其他使用它们的东西将依赖于它们。如果库B和C都使用FooController作为基类,那么FooController将进入库a,B和C将与之链接。

这些类被重新定义时,是否收到重复的符号或错误?这是我对发生的事情的猜测。我会把我的想法当作是这样的。

我在一个使用相同方法的大型项目中工作,尽管我们的项目有点不同。从本质上讲,我们从一个应用程序开始,然后开始构建其他具有相同功能的应用程序,所以这些常见的东西被分解成了自己的项目。想想网络代码、自定义警报视图、自定义导航栏等等

根据您的描述,听起来您的全局项(如字符串、常量、基类等)属于自己的项目,这与您所做的类似,但不属于自己的工程。是否可以将这些对象分解为另一个repo,并让cocoapods解析依赖关系?这就是我们在项目中所做的——任何在多个地方使用的东西都会被放入公共项目中,并通过cocoapods包含在内。

我对发生的事情的猜测是,你在没有椰子的主项目(让我们称之为common)中包含它们(让我们将它们称为common,然后子项目A依赖于"common",所以当它被拉入main时,椰子会带来common。

你可能还没有学到的另一个有用的东西是,你可以从本地磁盘中获取所有的pod,而不是通过Git获取。在你的podfile中,它看起来像:

pod 'common', :path => '~/dev/common'

也许您需要一个通用的"Base"Pod,用于放置共享的SomeProtocol.hconstants.h代码。

这个基本Pod将是所有其他Pod所必需的依赖项,就像这个库对这些其他库所做的那样。

构建阶段/目标依赖项中有所有较小的项目吗?

最新更新