前言
开发iOS有一段时间了,Xcode用得也越发熟练,但对于Xcode中的一些常用项目结构的概念如Target
、Project
等却还是一知半解。故将其摘出来搞清楚,避免以后犯概念性错误。
Target
一个Target
对应一个编译的product并且包含将Project
或workspace
中的文件编译成product的指令。Project
可以包含一个或多个Target
,而每个Target
对应一个product。
编译product的指令包含了Build Settings
和Build Phases
,我们可以在Xcode的编辑器中进行编辑和修改。Target
继承了project中的Build Settings
中的所有设置,我们也可以在Target
中自行修改Project
中的设定。同一时间只能有一个活动的Target
,Xcode中通过schema来指定这个Target
。
Target
和它所创建的product可以与另一个Target
相关联。如果一个Target
需要另一个Target
的输出来完成编译,那就可以说第一个Target
依赖于第二个Target
。如果两个Target
处在同一个WorkSpace
中,那么当Xcode编译是,便可以发现它们之间的依赖关系。这种关系也可称为隐式依赖。当然,我们也可以在Build Settings
中指定显式依赖关系,Xcode中存在显式依赖关系的两个Target
实际上并没有依赖。例如,在同一个WorkSpace
中,你可以编译一个类库和一个应用并将那个类库链接进来。Xcode可以发现它们的关系并自动先编译那个类库。然而,如果你只是想链接这个类库的某一个版本而不是WorkSpace
中编译的那个,你可以在Build Settings
在创建显式依赖并覆盖隐式依赖。
Project
Xcode的Project
是编译一个或多个软件产品不可或缺的所有文件、资源和信息的存储库。一个Project
包含用来编译产品的所有元素和保存元素之间的关联信息。一个Project
包含一个或多个Target
,Project
指定了项目中所有Target
默认的编译设置。
一个Xcode Project包含以下信息:
- 源文件的索引:
- 源代码,包含头文件和实现文件
- 类库和框架,内部的和外部的
- 资源文件
- 图像文件
- xib、storyboard文件
- 用来组织在结构导航中的源文件的组
- 项目级编译配置。你可以指定
Project
不止一种编译配置,例如,你可以设定Project
有debug和release两种配置。- Targets,其中包含:
- 项目编译生成的product的索引
- 编译product所需要的源文件的索引
- 用来编译项目的编译配置,包含对其他
Target
的依赖和其他设置;项目级编译设定只会在Target
编译配置没有重设时才会应用。- 用于debug和测试项目的可执行环境
一个Project
可以独立存在或者包含在WorkSpace
中。你可以使用Scheme
来给定模式下哪个Target
、编译配置和可执行环境配置处于活跃状态。
Workspace
WorkSpace
是Xcode将project
和其他文档组合在一起的文档,以便可以让它们协同工作。WorkSpace
可以包含任何数目的project
,可以添加任何你想引入的文件。此外,为了在每个Xcode项目中组织所有的文件,WorkSpace
在project
和它们的Target
之间提供了显式和隐式关系。
此外,WorkSpace
扩展了很多重要的Xcode工作流的范围。例如,因为索引贯穿整个的WorkSpace
,因此代码提示、跳到定义和所有其他内容上的特性在整个WorkSpace
中无缝使用。因为重构操作贯穿整个WorkSpace
的内容中,你可以重构项目中框架的API并让所有使用该框架的项目都只需执行一次重构操作。当编译时,一个项目可以使用WorkSpace
中其他project
的product。
WorkSpace
文档包含指向包含的项目和其他文件的指针,而没有其他数据。一个Project
可以属于不止一个WorkSpace
。
默认情况下,在WorkSpace
中的所有Xcode项目编译在同一个目录下。每个WorkSpace
都有自己的编译目录。因为在同一个WorkSpace
中的所有项目的所有文件在相同的编译目录下,所以所有这些文件对于每个项目都是可见的。因而,如果两个或者更多的project
使用同一个类库,你不需要单独在每个项目中都拷贝一份。
在WorkSpace
中的project
都可以继续保有自己独立的实体。如果不想被其他项目影响或者不想影响别的项目,我们可以不在WorkSpace
中打开project
,或者也可以将project
添加到别的WorkSpace
中。
Scheme
scheme
定义编译的Target
的集合,编译时使用的配置以及测试的集合。
你可以有很多的scheme
,只要你想要,但是在同一时间只能有一个是活跃状态。你可以指定一个scheme
是否应该保存在项目中。当你指定一个活跃的scheme
,你还可以选择运行目标。