xcodeproj
xcodeproj 实际上是一个文件夹,打开后可以看到 project.pbxproj, xcuserdata, project.xcworkspace.
- project.pbxproj: “在 project 里的 project”,是 xcodeproj 最主要的文件
- project.xcworkspace: 一个子文件夹,存储了用户 workspace 的相关信息
- xcuserdata: 另外一个文件夹,里面也是用户相关的一些信息
project.pbxproj 是 Next style 的 plist,描述了一个树状结构,最顶层是 RootElement.
- Root Element
- PBXBuildFile
- PBXBuildPhase
- PBXAppleScriptBuildPhase
- PBXCopyFilesBuildPhase
- PBXFrameworksBuildPhase
- PBXHeadersBuildPhase
- PBXResourcesBuildPhase
- PBXShellScriptBuildPhase
- PBXSourcesBuildPhase
- PBXContainerItemProxy
- PBXFileElement
- PBXFileReference
- PBXGroup
- PBXVariantGroup
- PBXTarget
- PBXAggregateTarget
- PBXLegacyTarget
- PBXNativeTarget
- PBXProject
- PBXTargetDependency
- XCBuildConfiguration
- XCConfigurationList
除根节点外每一个节点都有一个 reference,节点间通过引用这个 reference 表明包含的关系.
下面是一个 pbxproj 文件的内容示例,objects 里包含有所有的子节点, rootObject 存储的是 PBXProject 的 reference.1
2
3
4
5
6
7
8
9
10
11
12
13// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 45;
objects = {
...
};
rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
}
PBXProject 则包含了如配置,target 等信息,其中 mainGroup 就是我们打开项目看到的文件层级列表中最顶层的那个节点1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2029B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "XXX" */;
compatibilityVersion = "Xcode 2.4";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
en,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* XXX*/;
projectDirPath = "";
projectRoot = "";
targets = (
8D1107260486CEB800E47090 /* XXX*/,
);
};
PBXGroup 的 children 字段的值是一个 reference 数组, reference 可以指向另外一个 PBXGroup,也可以指向一个文件节点 PBXFileReference1
2
3
4
5
6
7
8015554500155562000000001 /* SlimmingResouces */ = {
isa = PBXGroup;
children = (
01555120015554C000000001 /* Help.zip */,
);
name = SlimmingResouces;
sourceTree = "<group>";
};
添加一个文件的过程:
- 创建一个 PBXFileReference 对象 fileRef
- 创建或者查找到一个 PBXGroup,将 fileRef 加入
- 用 fileRef 创建一个 PBXBuildFile buildFile
- 找到待加入的 PBXNativeTarget target
- 找到 target 的 PBXResourcesBuildPhase 将 fileRef 加入
links
http://www.monobjc.net/xcode-project-file-format.html