我该如何组织我的Xcode项目文件?

33

我正在尝试理解Xcode的文件组织方式,或者说它的缺陷。在项目中我可以随心所欲地添加一切,看上去所有的“虚假”文件夹和结构都很完美。但是当我查看文件系统时,却发现一团糟我尝试勾选 Create Folder Reference for any added folder 选项导入文件,有点有效果。在 Xcode 和文件系统中我都得到了想要的结构。

问题是:如果我将一个文件添加到Xcode中的一个文件夹,在文件系统中该文件夹是Folder Reference,那么在 Xcode 中就找不到这个文件,即使我重新加载了项目也不行。无法在 Xcode 中移动 Folder Reference 中的文件/子文件夹。当我在文件系统中移动它们时,Xcode 就会出现红色链接(找不到文件?)。

我如何保持有组织的项目同时又保证有组织的文件系统呢?我怎样设置一个项目来仅识别一个文件夹,并在我的项目中显示其(当前和最新的)文件和子文件夹?

我似乎还遇到了另一个问题,如果我使用 Folder Reference 并更改文件,则除非进行完全的清理和重建,否则应用程序中的文件不会更新。如果我不使用 Folder Reference,所有的文件都会被倾泻到应用程序包的 Resource 文件夹中,而不是我在项目中的良好结构。

我应该关心吗?我应该只使用虚假文件夹并让一切随意发生而不在乎吗?我的应用程序包将很混乱,文件系统也将很混乱,但它们都能工作……我希望?

编辑:

我希望文件系统有组织的最大原因是,资源文件(图像、声音、其他数据文件等)无法在 Xcode 中进行编辑。我必须通过文件系统在第三方应用程序中访问它们。如果混乱不堪,那么在其他第三方应用程序中查找和维护这些文件就会更加困难。

还有一个问题,如果我想要以下目录结构会怎样:

  • Images/Backgrounds/Name.png
  • Images/Icons/Name.png
  • Images/Titles/Name.png
  • 我应该使用长文件名而不是文件夹来组织吗?

    • Images_Backgrounds_Name.png
    • Images_Icons_Name.png
    • Images_Titles_Name.png

    文件系统组织重要的原因之一是源代码版本控制系统会同步文件系统。 - Anand
    @Anand - 确实,Xcode内置了git,因此它也被抽象化了。 - Justin808
    8个回答

    16

    我也希望Xcode可以自动同步自身和文件系统。

    我之前为一个名叫acani-iphone on GitHub的项目,手动花了一小时来完成同步。基本上,我只是使用Finder移动了一些文件,并按自己的想法创建了新文件夹。然后,我切换回Xcode并发现我刚刚移动的文件现在变成了红色(因为Xcode认为它们仍停留在原处而无法找到它们)。

    更新:我刚刚发现我可以单击红色组或文件,按下CMD+i(从上下文菜单中获取信息,可以通过右键单击红色文件或组打开),在常规选项卡下,点击选择,然后找到我在文件系统中移动的位置。但是我没有这样做,而是采用了以下的方法,它也能起到同样的效果:

    然后,我只需在Xcode中突出显示所有红色文件,然后按command + delete删除损坏的(红色)引用。然后,我右键单击要添加文件的组(通常是同一组),并单击Add> Existing Files...。然后,我在文件系统中找到了相同的文件。我保持"Copy items into destination group's folder (if needed)"未选中,选中单选按钮"Recursively create groups for any added folders",如果我要添加的文件用于构建acani iPhone应用程序,则选中add to target acani。

    我通常一次处理一个文件夹。有几次我更加积极,添加多个目录,因为我几乎总是选择了单选按钮"Recursively create groups for any added folders"。

    我发现文件acani_Prefix.pchacani-Info.plist必须留在根目录系统文件夹中(虽然可能有一些设置可以让这些文件放在其他地方,比如我认为你可以在acani-Info.plist中添加一行以便移动/重命名acani_Prefix.pch,但我觉得它们留在根目录的文件系统中也不错)。

    做这件事很烦人,或许不值得麻烦,或许是拖延症,但从今往后,在将现有文件添加到Xcode之前,我会先确保它们在文件系统中所需的位置。


    6

    好的,这就是它的工作原理:

    Xcode在你告诉它有哪些文件之前并不知道任何文件。也就是说,即使你在finder中手动添加一个文件(通常是个坏主意)到包含Xcode项目中的文件夹中,它也不会知道这些文件,直到你“将现有文件添加到项目”。

    向项目添加现有文件(或一组文件)的最佳实践(按我的看法)是选择“添加现有文件”,然后在下一个对话框中选择“将项目复制到目标组的文件夹中(如果需要)”,如果你希望项目拥有这些文件的副本,而不仅仅是它们的引用(两者都有优缺点)。

    不要过于担心Xcode中文件夹的命名或文件的放置位置,但尽量保持一致的标准,使其在你的环境中有意义。例如,我总是将我编写的类放在“Classes”中,并为任何库代码下载单独创建文件夹以便在项目中使用。我总是将图像/图标/音频等放在“Resources”中。

    简而言之,如果你想让项目文件夹中的内容与你的项目大致相同,那么请始终通过选择“将项目复制到目标组的文件夹中”来添加现有文件

    XCode的灵活性是有意义的。你可以自己决定如何组织事物。


    5
    嗯... 在XCode中你所称的灵活性,在我看来是一个非常大的漏洞。为什么我希望以一种方式在项目中组织事物,但在文件系统上却完全混乱了呢?"将项目文件复制到目标组文件夹"无法在项目文件夹中保持文件有序,它只是将一个从项目外添加的文件复制到项目文件夹的混乱区域。 - Justin808
    记得提交一个关于此问题的错误报告。除非你向正确的人投诉,否则它不会改变。 - Nick VanderPyle

    5
    我需要在意吗?我是否应该只使用虚拟文件夹,让所有东西随处可放而不用担心?我的应用程序包会很混乱,文件系统也会很混乱,但这样做一切都能正常运行...希望如此?
    依我看,不需要...:)基本上。整个重点是XCode的设计旨在为您提供最佳的编程体验。如果苹果公司希望您在实际文件系统中物理组织所有文件和文件夹,那么他们会以那种方式进行。
    我真的不明白为什么你想以这种方式组织所有的文件和文件夹?这对应用程序的运行没有任何影响,“虚假”文件夹(组)在XCode中足以提供必要的视觉辅助,使您(和其他人)可以浏览您的类和其他资源。在文件系统中正确组织它(就像您发现的那样)肯定会使事情更加困难?

    2
    请查看我上面的编辑,了解我的理由。不幸的是,如果我想使用XCode,那么我只能放弃并处理混乱的文件系统组织。如果我想开发Mac应用程序,我需要使用XCode,所以我猜我就得面对它了...这与我20年的编程经验相悖,不能容忍把项目文件夹搞得一团糟。 - Justin808
    哈哈...时代在变化(正如鲍勃·迪伦曾经说过的)。我的背景是Web开发,所有的图片都在images文件夹中,你有一个单独的psd,当你想使用一张图片时,就将其保存到images文件夹中。所以这里是我建议你做的:在Development/MyAppProject下创建/MyAppProject/MyAppProjectResources文件夹。在MyAppProjectResources文件夹中,你有一个结构化的PSD和XML文件系统,当需要在你的实际应用程序中使用它们时,可以将它们保存到/MyAppProject文件夹中或直接拖放生成的文件。 - Thomas Clayson
    3
    你希望文件有组织是因为任何外部工具,比如Git或Fireworks,都使用文件系统。 - Dan Rosenstark

    2

    使用Synx

    Synx可以重新排列您的磁盘上的文件以匹配Xcode中的组。在提交更改Xcode组的任何代码之前,我尝试运行它,并使项目保持整洁。


    1

    如果Xcode能够保持自身和文件系统同步,那就太好了。不幸的是它并没有做到。想要这样做的原因之一是为了让你的SCCS层次结构与Xcode中的层次结构相匹配。

    我退而求其次,将事物组织在Xcode中,并将文件系统分离成不多于“类”和“资源”的形式。


    1

    这在Xcode 9中发生了改变,参见发布说明:

    项目导航器中的组现在与文件系统中的目录更紧密地关联。(28612132)

    • 在项目导航器中将文件从一个组拖到另一个组会移动文件并更新任何关联的SCM工作副本。
    • 当将组连接到文件系统中的文件夹时,创建、重命名和删除组会更新相应的文件和文件夹。
    • 要删除组与文件系统中文件夹之间的连接,请选择该组,然后打开文件检查器并单击清除路径按钮(X)。
    • 要添加或更新文件系统中的文件或文件夹与项目中的文件或组之间的关联,请选择文件或组,打开文件检查器,并将相应的文件或文件夹拖到文件检查器中的位置部分。
    新的行为可从“新建带文件夹的组”命令(可能只显示为“新建组”)中使用,而旧的行为可从“新建不带文件夹的组”命令(也可能只显示为“新建组”!)中使用。目标文件夹中任何现有组的主要用法似乎决定了哪个命令被标记为“新建组”。这更加混乱,但如果你习惯选择其中一个,那么这个想法似乎是你可以坚持使用默认的“新建组”命令。(请参见Rob Mayoff的更详细的解释。

    0

    我理解你的感受,但我个人认为不能不关注实际结构而仅依赖工作区。

    真正好的方法是有一个工具可以检查工作区结构,并相应地重新组织文件系统,处理任何文件夹重命名等。这将是一个经典的解决方案,在我们移动项目时应该作为选项来实现。

    一些问题可能涉及源代码控制,尽管Xcode4可以使用git和SVN。


    0
    我所做的是创建一个代表每个文件夹的组,然后在将文件添加到它之前,在右侧面板的第一个选项卡中,在“路径”下方立即有一个图标,允许您选择文件夹。在该文件夹对话框中,我创建与组匹配的文件夹并选择它。
    在xcode3中,这导致新建和添加文件对话框从此路径开始。这使得付出的努力值得。然而,Xcode4不尊重此设置。因此,它是否有任何真正的价值是值得怀疑的。我也希望XCOde能支持更好的文件系统组织。
    考虑到文件名必须在项目中唯一,无论组和文件夹如何,接受平面文件夹结构默认值并使用组进行IDE方便是有道理的。对于其他平台来说,这很难接受。

    虽然我能同意这种方法似乎可以解决单个开发者的问题,但我认为这将导致在多人开发者团队中代码库不够有组织。与他人合作时,拥有标准非常重要。根据我的经验,最好的标准是涉及最少步骤的标准。 - jacobsimeon

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接