Xcode项目与Xcode工作区 – 差异

我想了解iOS的整个生态系统是如何工作的。
到目前为止,我可以为我的大部分问题find答案(相信我,其中有很多),但对于这个问题,似乎还没有明确的答案。

XcodeProject和XcodeWorkspace文件有什么区别?

  1. 他们两个有什么不同?
  2. 他们负责什么?
  3. 当我在团队/单独开发我的应用程序时,我应该select哪一个?
  4. 还有什么我应该知道这两个文件的问题?

我认为有三个关键项目需要了解项目结构: 目标项目工作区目标详细说明如何构build产品/二进制文件(即应用程序或库)。 它们包括编译设置(如编译器和链接器标志),并定义哪些文件(源代码和资源)实际属于产品。 当你build立/运行时,你总是select一个特定的目标。

您可能有几个共享代码和资源的目标。 这些不同的目标可能是一个应用程序(iPad / iPhone,不同品牌,…)或testing案例,自然需要访问相同的源文件作为应用程序的略有不同的版本。 所有这些相关的目标可以分组在一个项目中 。 虽然项目包含来自其所有目标的文件,但每个目标都会挑选自己的相关文件的子集。 构build设置也是如此:您可以在项目中定义默认的项目范围设置,但是如果您的某个目标需要不同的设置,则可以在其中覆盖它们:

所有目标继承的共享项目设置,除非它们覆盖它

所有目标inheritance的共享项目设置,除非它们覆盖它

具体目标设置:PSE iPhone将覆盖项目的基本SDK设置

具体目标设置: PSE iPhone覆盖项目的Base SDK设置

在Xcode中,你总是打开项目(或工作空间,但不是目标),它所包含的所有目标都可以build立/运行,但是没有办法/定义build立一个项目,所以每个项目至less需要一个目标才能不仅仅是一个文件和设置的集合。

选择一个项目的目标运行

select一个项目的目标运行

在很多情况下,项目都是你需要的。 如果您拥有从源代码构build的依赖项,则可以将其作为子项目embedded。 子项目可以单独打开,也可以在其超级项目中打开。

demoLib是一个子项目

demoLib是一个子项目

如果将其中一个子项目的目标添加到超级项目的依赖项中,则该子项目将自动构build,除非它保持不变。 这样做的好处是,您可以在同一个Xcode窗口中编辑来自项目和依赖关系的文件,并且在构build/运行时,可以从项目及其子项目中select目标:

从一个子项目运行目标

但是,如果您的库(子项目)被其他各种项目(或其目标)使用,则将其置于相同的层次结构级别是有意义的 – 这就是工作空间的用途。 工作空间包含和pipe理项目,其直接包含的所有项目(而不是子项目)处于同一水平,其目标可以相互依赖(项目的目标可以依赖于子项目的目标,反之亦然)。

工作区结构

工作区结构

在这个例子中,这两个应用程序( AnotherApplication / ProjectStructureExample )都可以引用demoLib项目的目标。 这也可以通过在其他项目中包含demoLib项目作为一个子项目(这只是一个参考,所以不需要重复),但是如果你有很多的交叉依赖关系,工作区更有意义。 如果打开工作区,则可以在构build/运行时从所有项目的目标中进行select。

从工作区运行目标

您仍然可以单独打开您的项目文件,但很可能它们的目标不会生成,因为除非打开工作区文件,否则Xcode无法parsing依赖项。 工作区给你和子项目一样的好处:一旦依赖关系发生变化,Xcode会重build它,以确保它是最新的(虽然我有一些问题,似乎并不可靠)。

你的问题简而言之

1)项目包含从这些文件和设置构build产品的文件(代码/资源),设置和目标。 工作区包含可以相互引用的项目。

2)两者都负责构build整个项目,但在不同的层面上。

3)我认为在大多数情况下,项目是足够的。 除非有特定的原因,否则不要使用工作区。 此外,您随时可以将您的项目embedded到工作区中。

4)我认为这就是以上的内容

有一个3)的注释:为您自动处理第三方库的CocoaPods使用工作区。 因此,当你使用CocoaPods (很多人都这样做)的时候,你也必须使用它们。

工作区是项目的集合。 当项目之间存在关联时,组织项目是非常有用的(例如:项目A包含一个库,作为项目B本身提供为项目本身。当您构build工作区时,项目B在项目A中编译和链接)。
在stream行的CocoaPods中使用工作区是很常见的 。 当你安装你的豆荚时,它们被放置在一个工作空间内,用来存放你的项目和豆荚库。

简单来说

  • Xcode 3引入了子项目,它是父子关系,意思是说父项可以引用它的子目标,反之亦然
  • Xcode 4引入了工作空间,这是兄弟关系,这意味着任何项目都可以在同一工作空间中引用项目