文档章节

Xcode中的 workspace, project, target, scheme

JlongTian
 JlongTian
发布于 2016/12/25 12:08
字数 972
阅读 32
收藏 0

Xcode Project

Xcode中的 project里面包含了所有的源文件,资源文件和构建一个或者多个product的信息。project利用他们去编译我们所需的product,也帮我们组织它们之间的关系。一个project可以包含一个或者多个target。project定义了一些基本的编译设置,每个target都继承了project的默认设置,每个target可以通过重新设置target的编译选项来定义自己的特殊编译选项。

project包含了以下信息:

  • 源文件

    • 代码的头文件和实现文件
    • 静态库,动态库,
    • 资源文件(如文本,xml,plist等)
    • 图片资源
    • 界面资源文件(xib, storyboard等)
  • 在文件结构的导航中,采用group去组织文件(实际开发中,尽量使用实体文件夹)

  • project的编译级别配置文件如(debug, release)
  • target
  • 运行环境如:debug,test

project可以单独存在,或者存在于一个workspace中。

target

target定义了构造一个product所需的文件和编译指令。一个target对应于一个product。target说白了就是
告诉编译系统要编译的文件和编译设置。编译指令就是根据build settings and build phases来确定的。

target之间可以进行依赖。如果一个target的编译需要另外一个target作为他的输入,那么我们就可以说前者依赖于后者。如果这两个target在同一个workspace里面,Xcode可以发现他们的依赖关系,这种依赖称之为隐式依赖。当然你可以通过设置,明确他们的依赖关系。

workspace

workspace是Xcode的一种文件,用来管理工程和里面的文件,一个workspace可以包含若干个工程,甚至可以添加任何你想添加的文件。workspace提供了工程和工程里面的target之间隐式和显式依赖
关系,用来管理和组织工程里面的所有文件。

workspace中的工程共享一个编译目录

workspace中的工程默认都是在同一个编译目录下,也就是workspace的编译目录。由于每个工程中的文件都在workspace的编译目录下,所以每个工程之间的文件都是相互可以引用的。因此,如果workspace中的多个工程使用了同一个库的时候,我们就不需要给每个工程都拷贝一个。

Xcode会检查编译目录里面的所有文件去发现隐式的依赖关系。比如,一个工程用来编译成库给其他工程去引用,Xcode可以自动的先编译这个工程的库,然后再去编译其他的工程。虽然你没有在编译选项里面去设置这些依赖关系。当然如果你真的需要的话,你也可以去设置,提供一个显式的编译依赖关系。

workspace中每个工程依然都是独立的。如果你想单独的使用这个工程,并且不希望影响其他工程,或者被其他工程影响,你可以直接打开工程而不通过workspace。一个工程可以被多个workspace所拥有,在任意的组合中依然可以直接运行,而不需要去重新配置工程或者workspace。

Xcode Scheme

scheme定义了编译集合中的若干target,编译时的一些设置以及要执行的测试集合。我们可以定义多个scheme,但是每次只能使用其中一个。我们可以设置scheme保存在project中还是workspace中。如果保存在project中,那么任意包含了这个工程的workspace都可以使用。如果保存在workspace中,那么只有这个workspace可以使用。

参考:官方文档

 

本文转载自:http://www.jianshu.com/p/1308a199f168

JlongTian
粉丝 3
博文 310
码字总数 151017
作品 0
深圳
程序员
私信 提问
Xcode编译出现Test Target源文件报错

有几次遇到从网上下载到的iOS开源代码编译报错,报错位置为Test Target的源文件,我就挺奇怪我又没做测试为啥会编译Test Target的源文件,之前的暴力解决方法是把Test Target直接删掉。 未免...

yoyoso
2015/02/16
2.7K
2
iOS 开发:深入理解 Xcode 工程结构(一)转

当我们新建一个 Cocoa 项目时,Xcode 会提供一系列的模板,类似前端的脚手架工具,只需要简单的几个选项,就可以配置好一个项目所需的基本环境。 这些基本环境配置一般包括: 编译选项、证书...

久依
2018/12/18
0
0
iOS自动打包并发布脚本 

iOS自动打包并发布脚本 本文最终实现的是使用脚本打 Ad-hoc 包,并发布测试,当然稍微修改一下脚本参数就可以打其他类型的 ipa 包了。另外该脚本还实现了将生成的 ipa 包上传至蒲公英进行测试...

法斗斗
2016/05/11
66
0
Xcode WorkSpace含静态库多项目依赖编译

一般的某个应用单独新建一个 project 就可以了,然后把所有的程序文件都放在里面,这个可以满足大部分普通的需求,但是有时候,项目有可能要使用其他的项目文件,或者引入其他的静态库文件,...

whj
2014/03/02
19.1K
0
IOS工程自动打包并发布脚本实现

作者:webfrogs 转载请注明出处。 前言 IOS的开发过程中,当需要给测试人员发布测试包的时候,直接使用xcode来做的效率是非常低下的。尤其是当有一点小改动需要重新出包时,那简直是个折磨的...

孙哲
2015/03/26
17.1K
6

没有更多内容

加载失败,请刷新页面

加载更多

如何递归计算目录中的所有代码行?

我们有一个PHP应用程序,并希望计算特定目录及其子目录下的所有代码行。 我们不需要忽略评论,因为我们只是想弄清楚。 wc -l *.php 该命令在给定目录中运行良好,但忽略子目录。 我当时认为...

技术盛宴
32分钟前
3
0
使用 try-with-resources 优雅关闭资源

我们知道,在 Java 编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等、redis),我们必须在这些外部资源使用完毕后,手动关闭它们。 因为外部资源不由 JVM 管理,无法享用 JVM ...

七弦桐
39分钟前
4
0
04.深入浅出索引(上)

简单来说,索引的出现就是为了提高数据查询效率,就像书的目录一样。 索引的常见模型 索引实现的方式有很多种,所以这里就引入了索引模型的概念,可以用于提高读写效率的数据结构很多,比较常...

scgaopan
42分钟前
5
0
Redis哨兵、复制、集群的设计原理,以及区别

谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 **哨兵(Sentinel):**可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的...

Java阿七
52分钟前
5
0
浅析laravel路由执行原理

目前很多文章已经对Laravel的执行原理做了详细介绍,这里只是为了个人做一下简单记录 首先看入口 index.php 关键的执行函数就是 handle方法 ,但是前面的几个预处理函数,包括了整合框架的大...

冻结not
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部