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

时间:2014-03-01 00:18:19

标签: ios objective-c xcode cocoapods

Hubspot blogpost的启发,我将我的iOS项目拆分为一个主项目和几个使用CocoaPods添加到主项目的子项目。

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

使用这种方法编译和运行子项目,但主项目无法编译,因为每个子项目pod都包含

等文件
#import <SomeProtocol.h>
#import <constants.h>

编译单个pod库时找不到(虽然是主项目的一部分)。

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

4 个答案:

答案 0 :(得分:4)

  

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

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

这或多或少描述了您想要做的事情: Static Libraries in Xcode

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

对于许多开发人员而言,方案似乎是一个盲点,但它们对于理解您的工具和扩展工作流程非常重要。非常重要的是,Apple在2011中对计划进行了WWDC会议,然后几乎一字一句地重复它,the next year

  

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

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

我不确定“全球协议”是什么意思。 “共享全球项目”虽然听起来不太好。这是你想要避免的一般情况。

基类将进入他们自己的库或框架,而使用它们的其他东西将取决于它们。如果库B和C都使用FooController作为基类,则FooController将进入库A,B和C将链接到库。

答案 1 :(得分:3)

您是否收到重复定义这些类的重复符号或错误?这是我对最新情况的猜测。我会像在这种情况下一样提出我的想法。

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

从你所描述的内容看起来像你的全局项目如字符串,常量,基类等属于他们自己的项目,这是你的工作,但没有它在自己的项目中。是否有可能将这些对象分解为另一个repo并让cocoapods解析依赖关系?这就是我们对项目所做的事情 - 在多个地方使用的任何东西都被放入公共项目中,并通过cocoapods包含在内。

我对最新发生的猜测是,你的主要(让我们称之为主要)项目包括他们(让我们称之为公共)没有cocoapods,然后子项目A依赖于&#39; common&#39;所以cocoapods在被拉入主要时会带来共同点。

您可能还没有学到的其他有用之处在于您可以将所有pod从本地磁盘中取出而不是通过Git引入。在你的podfile中,它看起来像:

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

答案 2 :(得分:1)

也许你需要一个共同的&#34; Base&#34;您可以在其中放置共享的SomeProtocol.hconstants.h代码。

这个Base Pod将是this库为these other库所做的所有其他Pod的必需依赖项。

答案 3 :(得分:0)

您是否拥有Build Phases / Target Dependencies中的所有小项目?