xcodeproj

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
20
29B97313FDCFA39411CA2CEA /* 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,也可以指向一个文件节点 PBXFileReference

1
2
3
4
5
6
7
8
015554500155562000000001 /* SlimmingResouces */ = {
isa = PBXGroup;
children = (
01555120015554C000000001 /* Help.zip */,
);
name = SlimmingResouces;
sourceTree = "<group>";
};

添加一个文件的过程:

  • 创建一个 PBXFileReference 对象 fileRef
  • 创建或者查找到一个 PBXGroup,将 fileRef 加入
  • 用 fileRef 创建一个 PBXBuildFile buildFile
  • 找到待加入的 PBXNativeTarget target
  • 找到 target 的 PBXResourcesBuildPhase 将 fileRef 加入
    

http://www.monobjc.net/xcode-project-file-format.html

https://github.com/google/zopfli

https://github.com/google/brotli