我最近一直在讨论Xcode的项目格式,我正在尝试了解将其加载到内存中的最佳方法。作为参考,我正在使用Python进行此实验。
我正在寻找一种简单的方法来读出项目的内容,以便找到磁盘上的任何文件。 (一旦我有文件路径,我希望能够读取和写入它们。)
Xcode的文件格式是xcodeproj
,它是一个包含多个文件的包。感兴趣的是project.pbxproj
文件,因为它包含您在Xcode的左侧窗格中看到的文件引用和逻辑组。我找到了一个很好的reference to for the format at monobjc.net。
pbxproj
文件本身是一个OpenStep属性列表。它包含一个字典,用于标识组成项目的各种文件和组。对我来说最有趣的是项目引用文件系统的方式。
您需要从该链接中了解的是,每个框架,文件引用和Xcode项目组都使用一个字典来表示,该字典除了其他内容外,还有一个名为isa
的属性,用于指定对象的类型。每个对象还具有唯一标识符作为键。有些条目有路径。文件总是有它们,组有时会有它们。请允许我解释......
我们以示例文件结构为例进行说明:
在这种情况下,我有一个名为Characters
的文件夹,其中包含一个名为Warlock
的文件夹。在Xcode内部,它看起来像这样:
我有一个名为Characters
的组和一个名为Warlock
的子组。从本质上讲,我的组结构反映了我的文件结构。
在我的pbxproj
中,实际上有两种方法可以引用磁盘上的文件。名为“Characters”的组的字典表示可以具有path
属性,该属性指向角色/术士。 Accessories.bundle
文件的路径为Accessories.bundle
。如果我拖入整个文件夹,则会出现这种情况。
表示文件系统的这种安排的第二种方式是在组的字典中没有路径属性,并且文件引用将具有更完整的路径。如果您自己拖动每个文件,就会发生这种情况。
考虑到组关联,我试图找出遍历这些文件的最佳数据结构。我希望能够读取文件,所以我需要获得完整的路径,即使它们与Xcode项目相关。
在python中处理字典的好方法是什么? Apple使用什么数据结构来管理内存中的Xcode项目?
答案 0 :(得分: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 archive,一个更高级别的结构,更像是一个Python pickle - 它编码有关ObjectiveC类的信息等。
Apple使用什么数据结构来管理内存中的Xcode项目?
最有可能是归档解码的结构。但核心部分可能主要是NSDictionary
,其值可能通过KVC密钥路径访问。
你需要自己使用吗?不必要。正如您已经确定的那样,格式不是很深或那么复杂,所以只需将plist
作为dict
阅读,丢弃除objects
值以外的所有内容,然后构建结果中自己的文件系统树不会那么难。