作者 | 钱凯
杏仁移动开发工程师,前嵌入式工程师,关注大前端技术新潮流。
当我们新建一个 Cocoa 项目时,Xcode 会提供一系列的模板,类似前端的脚手架工具,只需要简单的几个选项,就可以配置好一个项目所需的基本环境。
这些基本环境配置一般包括:
编译选项、证书链选项
项目 Target、单元测试 Target
基于 git 的版本控制管理
默认的源文件
当然我们也可以新建一个空白的 Project,然后手动去组装这些东西。
由于苹果的封闭性,对 Cocoa 项目的管理基本上都在 Xcode 中进行,这个 All-in-One 的强大工具提供了从文档、编码、调试、测试,再到签名、打包、上线的全流程支持。
随着开发的深入,我们的项目变得越来越复杂,各种链接库、子工程相互引用,不同 Target、Scheme 配置混杂,还会遇到多人协作开发时诡异的冲突。即使是老鸟有时候也会一筹莫展,这时候就需要对 Xcode 工程结构以及管理机制有更加清晰的认识。
Scheme、Target、Project 和 Workspace
Schema、Target、Project 和 Workspace 是组成一个 Xcode 工程最核心的单元,也是我们首先需要理解的部分。
Target
Target 是我们工程中的最小可编译单元,每一个 target 对应一个编译输出,这个输出可以是一个链接库,一个可执行文件或者一个资源包。它定义了这个输出怎样被 build 的所有细节,包括:
编译选项,比如使用的编译器,目标平台,flag,头文件搜索路径等等。
哪些源码或者资源文件会被编译打包,哪些静态库、动态库会被链接。
build 时的前置依赖、执行的脚本文件。
build 生成目标的签名、Capabilities 等属性。
我们平时在 Build Settings,Build Phases 中配置的各种选项,大部分都是对应到指定的 target 的。
每次我们在 Xcode 中 run/test/profile/analyze/archive 时,都必须指定一个 target。
工程中的 targets 有时候会共享很多代码、资源,这些相似的 targets 可能对应同一个应用的不同版本,比如 iPad 版和 iPhone 版,或者针对不同市场的版本。
Project
Project 很好理解,就是一个 Xcode 工程,它管理这个工程下的 targets 集合以及它们的源码,引用的资源,framework 等等。
Project 是管理资源的容器,本身是无法被编译的,所以每个 project 至少应该有一个可编译的 target,否则就是一个空壳。一个 target 编译时引用的资源是它所在 project 所有管理资源的子集。
我们也可以对 project 进行配置,包括基本信息和编译选项(Build Settings)等,这些配置会应用到它管理的所有 targets 中,但是如果 target 有自己的配置,则会覆盖 project 中对应的配置。
在很多情况下,我们的工程中只有一个 project。可以在 finder 中双击后缀名为.xcodeproj
的文件,就可以直接打开单个 project 了。