Python 苹果使用什么数据结构来管理Xcode项目?

Python 苹果使用什么数据结构来管理Xcode项目?,python,xcode,data-structures,xcode-project,Python,Xcode,Data Structures,Xcode Project,我最近一直在研究Xcode的项目格式,我试图了解将其加载到内存中的最佳方法。作为参考,我在这个实验中使用Python 我正在寻找一种简单的方法来读取项目的内容,这样我就可以找到磁盘上的任何文件。(一旦我有了文件路径,我希望能够读取和写入它们。) Xcode的文件格式是xcodeproj,它是一个包含多个文件的包。感兴趣的是project.pbxproj文件,因为它包含您在Xcode的左侧窗格中看到的文件引用和逻辑组。我找到了一个不错的工作 pbxproj文件本身是一个OpenStep属性列表。它

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

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

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

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

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

为了便于说明,让我们以文件结构为例:

在本例中,我有一个名为
Characters
的文件夹,其中包含一个名为
Warlock
的文件夹。在Xcode内部,它看起来像这样:

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

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

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

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

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

用python处理字典的好方法是什么

通常情况下,a

然而,在本例中,如果您在Mac上运行,您可能希望使用Cocoa的优秀属性列表API,在这种情况下,您将获得一个新的属性列表API。那也很好;无论哪种方式,API都是相同的。例如:

>>> import AppKit
>>> path = os.path.expanduser('~/src/foo.xcodeproj/project.pbxproj')
>>> d = AppKit.NSDictionary.dictionaryWithContentsOfFile_(path)
然而,这不仅仅是一个plist;它是一个更高级的结构,更像Python pickle,它编码有关Objective类等的信息

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

最有可能的是归档文件解码到的任何结构。但核心部分可能主要是一个
NSDictionary
,它可能通过关键路径访问值


你需要自己用吗?不一定。正如您已经确定的,格式没有那么深或复杂,因此只需将
plist
作为
dict
,扔掉
对象
值以外的所有内容,根据结果构建自己的文件系统树并不难。

注意,关键不是父组是否有路径,而是文件(或子组)的
sourceTree
值是否为
。您可以在GUI中为每个文件单独选择此选项,您的代码必须处理此选项。是否有用于处理Cocoa API的python库?当然,我可以在Objective-C中实现这一点,如果您使用的是苹果公司预装的Python2.7.2,那么pyobjc已经内置了。否则,
pip-install-pyobjc
应该可以正常工作(假设您已经安装了
setuptools
pip
,Xcode和Xcode的命令行工具)-除非您安装了Xcode 5.x和几乎任何第三方二进制Python,否则安装可能会失败。(坚持使用苹果预装Python的原因之一,除非你需要3.x。)无论如何,
import-AppKit
实际上是在
AppKit.framework
周围导入了一个
pyobjc
包装器。与ObjC一样,
Foundation
AppKit
Cocoa
中的任何一种都将为您提供所有的核心类型和越来越多的额外内容。如果是这样的话,我最好用Objective-C编写这篇文章。@Moshe:好吧,这取决于您,但我个人认为Python在大多数方面都比ObjC好得多,PyObjC和天然可可一样易于使用。