Kealdish's Studio.

Xcode-Target、Project、WorkSpace、Scheme

字数统计: 1.3k阅读时长: 4 min
2015/10/18 Share

前言

开发iOS有一段时间了,Xcode用得也越发熟练,但对于Xcode中的一些常用项目结构的概念如TargetProject等却还是一知半解。故将其摘出来搞清楚,避免以后犯概念性错误。

Target

一个Target对应一个编译的product并且包含将Projectworkspace中的文件编译成product的指令。Project可以包含一个或多个Target,而每个Target对应一个product。

编译product的指令包含了Build SettingsBuild 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包含一个或多个TargetProject指定了项目中所有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项目中组织所有的文件,WorkSpaceproject和它们的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,你还可以选择运行目标。

CATALOG
  1. 1. 前言
  2. 2. Target
  3. 3. Project
  4. 4. Workspace
  5. 5. Scheme