【问题标题】:What data structure does Apple use for managing Xcode projects?Apple 使用什么数据结构来管理 Xcode 项目?
【发布时间】:2013-10-17 09:20:26
【问题描述】:

我最近一直在研究 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 属性,该属性将指向 Characters/Warlock。 Accessories.bundle 文件的路径为Accessories.bundle。如果我拖入整个文件夹,往往会出现这种情况。

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

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

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

【问题讨论】:

  • 请注意,关键不是父组是否有路径,而是文件(或子组)的sourceTree 值是<group> 还是<absolute>。您可以在 GUI 中为每个文件单独选择它,您的代码将不得不处理它。

标签: python xcode data-structures xcode-project


【解决方案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 值之外的所有内容,然后构建您自己的文件系统树结果不会那么难。

【讨论】:

  • 是否有用于处理 Cocoa API 的 python 库?当然,我真的可以在 Objective-C 中做到这一点。
  • 如果您使用的是 Apple 预装的 Python 2.7.2,pyobjc 已经内置。否则,pip install pyobjc 应该可以正常工作(假设您有 setuptoolspip、Xcode、和 Xcode 的命令行工具都安装了)——除非你有 Xcode 5.x 和几乎所有第三方二进制 Python 安装它可能会失败。 (坚持使用 Apple 预装 Python 的众多原因之一,除非您需要 3.x。)
  • 无论如何,import AppKit 实际上是在 AppKit.framework 周围导入一个 pyobjc 包装器。与 ObjC 一样,FoundationAppKitCocoa 中的任何一个都将为您提供所有核心类型,并逐渐增加更多额外内容。
  • 如果是这样的话,我最好用 Objective-C 来写。
  • @Moshe:好吧,这取决于你,但我个人认为 Python 在大多数情况下比 ObjC 更好,而且 PyObjC 与原生 Cocoa 一样易于使用。
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多