0

我最近一直在研究 Xcode 的项目格式,我试图了解将其加载到内存中的最佳方式。作为参考,我在这个实验中使用了 Python。

我正在寻找一种简单的方法来读出项目的内容,以便可以找到磁盘上的任何文件。(一旦我有了文件的路径,我希望能够读取和写入它们。)

Xcode 的文件格式是xcodeproj,它是一个包含多个文件的包。感兴趣的是project.pbxproj文件,因为它包含您在 Xcode 左侧窗格中看到的文件引用和逻辑组。我在 monobjc.net 找到了一个很好的格式参考

pbxproj文件本身是一个 OpenStep 属性列表。它包含一个字典,用于识别构成项目的各种文件和组。对我来说最有趣的是项目引用文件系统的方式。

您需要从该链接知道的是,每个框架、文件引用和 Xcode 项目组都由一个字典表示,该字典除其他外还有一个名为的属性,该属性isa指定对象的种类。每个对象也有一个唯一的标识符作为键。一些条目有路径。文件总是有它们,组有时也有。请允许我解释...

让我们以一个示例文件结构为例,以进行说明:

在此处输入图像描述

在这种情况下,我有一个名为的文件夹Characters,其中包含一个名为Warlock. 在 Xcode 内部,它看起来像这样:

在此处输入图像描述

我有一个名为的组Characters和一个名为Warlock. 本质上,我的组结构反映了我的文件结构。

在 mypbxproj中,实际上有两种方法可以引用磁盘上的文件。名为“Characters”的组的字典表示可以有一个path属性,该属性将指向 Characters/Warlock。该Accessories.bundle文件的路径为Accessories.bundle. 如果我拖入整个文件夹,往往会出现这种情况。

表示这种文件系统排列的第二种方法是在组的字典中没有路径属性,文件引用将具有更完整的路径。如果您单独拖入每个文件,就会发生这种情况。

考虑到组关联,我试图找出遍历这些文件的最佳数据结构。我希望能够读取文件,因此我需要获取完整的路径,即使它们与 Xcode 项目相关。

在 python 中处理字典的好方法是什么?Apple 使用什么数据结构来管理内存中的 Xcode 项目?

4

1 回答 1

1

在 python 中处理字典的好方法是什么?

通常,一个dict.

但是,在这种情况下,如果您在 Mac 上运行,您可能想要使用 Cocoa 的优秀属性列表 API,在这种情况下您将获得一个NSDictionary替代方案。那也很好;无论哪种方式,API 都是一样的。例如:

>>> import AppKit
>>> path = os.path.expanduser('~/src/foo.xcodeproj/project.pbxproj')
>>> d = AppKit.NSDictionary.dictionaryWithContentsOfFile_(path)

然而,这不仅仅是一个 plist。它是一个NSArchiver 存档,一个更高级别的结构,更像是一个 Python 泡菜——它对有关 ObjectiveC 类等的信息进行编码。

Apple 使用什么数据结构来管理内存中的 Xcode 项目?

很可能是档案解码成的任何结构。但核心部分可能主要是一个NSDictionary, 其值可能通过KVC密钥路径访问。

你需要自己使用吗?不必要。正如您已经确定的那样,格式并没有那么深或那么复杂,因此仅读取plistas a dict,丢弃除objects值之外的所有内容,并从结果中构建您自己的文件系统树不会是全部难的。

于 2013-10-17T00:23:44.710 回答