1、创建例子寻找问题
-
我们先创建一个空project,再新建一个target,选择 macOS 类型的
Command Line Tool
(命令行工具) -
此时会生成一个main.m文件
-
然后在这个target下的 Build Phases 中我们能看到,
Compile Sources
中自动将main.m文件添加了进来
- 问题:为什么Xcode能准确的将main.m添加到 Compile Sources 中,而不是 Dependencies 或者 Link Binary 呢?
2、Pbxproj文件
(工程配置核心文件)
- 在 Xcode工程管理 中我们知道,在
项目名.xcodeproj
文件的包内容中,都存在1个project.xcworkspace
文件和1个project.pbxproj
文件,前者是project的workspace文件,而后者就是project的工程配置文件
2.1、参数介绍
-
为了有对比添加文件后的参数变化,我们先删掉project的target留个空project,然后用VS打开 project.pbxproj文件(有个pbx插件辅助看文件)
-
能看到 pbxproj文件包含的几种Key:
key 描述 archiveVersion
当前文件的生成版本 classes 无意义 objectVersion 当前文件内objects的描述版本 objects
字典,以每个 object的UUID
作为key,object的属性
(Private、Public等)作为valuerootObject 当前文件的 根object的UUID
(isa = PBXProject) -
rootObject表示 当前文件的根object的UUID,那么我们就搜一下它UUID
- 每个object都有一个key名为
isa
,用来表明 当前是什么object - 每个object也有key名为
attributes
,用来表明 当前object特性,以及包含的其他object的UUID,描述object的依赖与包含关系
- 每个object都有一个key名为
-
object类型
pbxproj⽂件,已知的object: • PBXBuildFile • AbstractBuildPhase • PBXBuildRule • XCBuildConfiguration • XCConfigurationList • PBXContainerItemProxy:⽤来代指当前project包含的其他project • PBXFileReference • PBXGroup • PBXProject • PBXTargetDependency • PBXReferenceProxy:当前project引⽤的,相同空间的其他project的⽂件 • AbstractTarget
2.2、文件分析
-
我们随便创建一个文件LZObject
-
再来看pbxproj文件,直接全局搜LZObject,能看到文件的多种信息
-
我们按开始的方法将main.m添加进来,再搜main.m文件能发现其有了不同的参数信息,也正是准确添加到 Compile Sources 中的原因
注:sourceTree
sourceTree的值 | 描述 |
---|---|
<absolute> | 绝对路径 |
<group> | 相对于所在group路径 |
SOURCE_ROOT | 相对于⼯程所在⽬录路径 |
DEVELOPER_DIR | 相对于DEVELOPER_DIR⽬录路径 |
BUILT_PRODUCTS_DIR | 相对于产物所在⽬录路径 |
SDKROOT | 相对于SDK⽬录所在路径 |