iOS Xcode中的Workspace、Project、Target、Scheme
Project
Xcode中的project是一个包含了所有文件、资源以及构建一个或者多个product所需信息的一个仓库。project包含编译product所用的所有元素,并帮我们组织这些元素之间的关系。一个project可以包含一个或者多个target,target指定了如何编译product。project定义了其内部所有target的默认编译配置(每个target可以通过重新设置(重写)编译配置来定义自己的特殊编译配置)。
project包含了以下信息:
1、对如下源文件的引用:
(1)代码的.h文件和.m文件
(2)Libraries 和 frameworks
(3)Resource files(资源文件,如文本,xml,plist等)
(4)图片
(5)Interface Builder files(xib、storyboard等)
2、用来组织资源文件的group(比如哪个文件放在哪个文件夹路径下)
3、project级别的编译配置,比如你对debug、release两种环境的分别设置。
4、targets的配置,这些配置指定了:
(1)工程编译的引用
(2)工程编译所需要的资源文件的引用
(3)工程编译的编译配置,包括对其他target和配置的依赖关系,还包括没有target重写(覆盖)的project级别的编译配置
5、用于debug和测试程序的执行环境,这些执行环境指定了:
(1)xcode在run或debug时的可执行文件
(2)传递给可执行文件的命令行参数(若有)
(3)程序运行时设置的环境变量(若有)
一个project可以独立存在,也可以包含在一个workspace下。
你可以用Xcode schemes来指定当前的target、编译配置、可执行文件配置。
Target
target指定了要编译的product, 并包含’用project 或 workspace里中的一系列文件来编译一个product的说明‘。一个target只能定义一个product,target将输入(包括编译product所需的源文件和处理这些源文件的说明)组织到构建系统中。一个project可以包含一个或多个target,每个target可以对应产生一个product。
上面的编译一个product的说明的表现形式就是我们xcode里的build settings和 build phases。
一个target和由它产生的product可以关联其他的target。如果一个target的编译依赖于另外一个target的输出,我们就说前者依赖于后者;如果这两个target在同一个workspace中,Xcode就能识别这个依赖;这种依赖关系我们称之为隐式依赖(implicit dependency)。你也可以在build settings明确指定target依赖关系,也可以将Xcode中的隐式依赖指定为无依赖关系,比如,你可以同时编译处于同一workspace中的library和链接这个library的application,Xcode会识别library和application的关系,然后先编译library,但是如果你的本意是想要链接这个library的version而不是library本身,你可以在build settings中创建一个显式的依赖来覆盖这个隐式依赖。
Workspace
workspace是一种xcode文件,用于分组projects和其他文件,便于我们使用它们。workspace可以包含多个project和其他你想要引入的文件。除了组织各个project中所有的文件之外,workspace还提供存在于projects和它们对应targets之间的隐式和显式关系。
一个project可以属于多个workspace。
默认情况下,workspace中的projects编译在同一目录下,我们称之为workspace build directory,每个workspace都有各自的编译目录。因为同一workspace下的每个project中的所有文件都在同一编译目录下,所以这些文件彼此之间是相互可以引用的。因此,如果workspace中的多个projects使用了相同的libraries的时候,我们就不需要给每个工程都拷贝一个。
workspace中每个project依然都是独立的。如果你想单独的使用这个project,并且不希望影响其他project,或者被其他project影响,你可以直接打开这个project而不是通过workspace,或者你也可将这个project添加到其他workspace中。一个project可以同时从属于多个workspace,所以你可以在任意的组合中使用这个project,而不需要去重新配置project或者workspace。
你可以使用workspace中默认的编译目录,也可以自己指定一个。注意,如果你为一个project指定了一个编译目录,那么当你编译这个project时,这个目录会被此project所属的任何workspace的编译目录所覆盖。
Scheme
scheme定义了可以用于编译若干target,以及编译这些target时的一些配置和要执行的测试。我们可以定义多个scheme,但是每次只能使用其中一个。我们可以设置scheme保存在project中还是workspace中。如果保存在project中,那么任意包含了这个project的workspace都可以使用。如果保存在workspace中,那么只有这个workspace可以使用。选择了scheme就意味着选择了运行目标。