Xcode能否使用"文件夹引用"来编写代码?

38

像许多人一样,我希望Xcode使用与磁盘上文件夹结构相似的文件夹结构。然而,我无法在“编译源代码”下找到“文件夹引用”(青色文件夹)中的代码。有没有办法解决这个问题?

我甚至成功将青色文件夹添加到“编译源代码”构建阶段,但这并不会导致该文件夹的内容被添加。

如何使用文件夹引用来管理代码?


1
并非每个增强iOS的超级有用的GitHub项目都会生成框架,因此我理解你的痛苦。我更喜欢在我的项目文件夹中创建子模块,然后将它们简单地软链接到子模块的有意义的子文件夹中,这样通过Git进行的每个更新都将保持相关性。此外,我还可以随时玩弄子模块的演示项目。然后将添加此软链接文件夹/文件到我的主项目中,使其编译正常。虽然不是一个好的选择,但这让我晚上可以睡得安稳 :) - pulkitsinghal
因此,这些文件既存在于您的大型项目中,也存在于子项目中(即,这两个项目彼此不知道)? - Dan Rosenstark
我想我明白了。所以在你的大项目中,你通过文件夹软链接(我猜是使用 ln 命令)引用了实际上位于不同项目和不同版本控制下的文件,对吗? - Dan Rosenstark
是的...但是为了明确起见...“不同”的项目是我的主项目的子模块(这是git术语)...为什么要将它们作为子模块?这样,当我的团队进行git clone --recursive时,他们就可以获得全貌,而且超级项目可以直接运行...子模块的各自存储库会被跟进并从中下载。 - pulkitsinghal
@pulkitsinghal 好的,非常棒的建议,谢谢您的评论。我会尝试使用git子模块,并尽可能避免使用Xcode。 - Dan Rosenstark
显示剩余2条评论
4个回答

21
简单而不幸的答案是,在Xcode下,文件夹引用仍然存在问题和错误,它们无法正常工作。在 Xcode 8.2.1 中测试于 2017 年 3 月 4 日。以下是一个示例,以便您不必浪费时间复制 Xcode 失败的情况。(顺便提一句,有错误的 Xcode 在我制作这个示例时崩溃了两次)。根据问题,总体上希望在 Xcode 中使用文件夹引用,因此 Xcode 可以获取文件夹中的所有文件并将其包含在项目中,并通过代理基于文件夹的任何 Finder 或 Xcode 更改自动更新。通过这种方式,当这些文件夹发生变化时,利用相同的一组公共源代码文件的 50 个项目不必单独更新。以下探讨了 Xcode 中的这个问题(在 8.2.1 中测试)。示例:ViewController.m 包含 NSError+Core.h,因此我们希望从 "NSError+Core" 文件夹中添加所有内容到项目中。

enter image description here

"

NSError+Core.h位于这个集中的开发文件夹中。

"

enter image description here

将源文件夹从Finder拖放到项目中的“Support”组下(毫不费力,只需简单拖动)。

enter image description here

Xcode会很勤勉地提供将拖动添加到目标的选项,注意选择了“创建文件夹引用”,而不是“创建组引用”。同时请注意,Xcode正在提供并被告知将此文件夹和文件添加到目标中。

enter image description here

尽管一切看起来应该能够工作,但编译器未能找到头文件,重新编译仍然出现相同的结果...找不到头文件。删除DerivedData也没有帮助。

enter image description here

所以,进行二次检查时,我们在项目中检查了“编译源代码”,确实,源文件也不在那里。请记住,Xcode“添加”到目标中...

enter image description here

如果我们将它从文件夹拖到“支持”组中,会发生什么...

enter image description here

它提供了将它们再次添加到项目中的选项?请注意,设置与第一次通过父文件夹拖动而不是文件拖动时相同...

enter image description here

现在源文件出现在“编译源”列表中。请注意项目中文件的奇怪重复列表。
(此截图后不久,Xcode崩溃了)

enter image description here

当然,编译器现在可以找到头文件,导入时错误会被清除,就像第一次引入时应该做的那样...

enter image description here

你是说它只需要一点帮助才能“找到”文件吗?如果是这样,“创建文件夹引用”正是如此。

因此,我们尝试整理并将文件从父级“支持文件”组拖回到它们应该在的文件夹中。没有任何确认、指示或通知,文件就从组中消失了,在NSError+Core文件夹中也没有任何反应。

enter image description here

顺便说一下,它确实从项目中删除了它们...编译源不再具有NSError+Core.m的引用。

enter image description here

总的来说,“文件夹引用”目前的实现似乎没有任何有用的目的……它看起来像是USS Xcode上一个六年以上的废弃物。


5
很棒的回答。我一直惊讶于Xcode存在这么多类似的问题 - 它也经常崩溃。对于“主流时间”来说还不够好。 - HughHughTeotl
以苹果的方式看待它:“如果我们允许来自文件夹引用的文件进行编译,人们可能只需在Xcode中创建一次结构,然后使用其他某些IDE进行开发”(更多第三方IDE选项意味着苹果赚取的钱会减少)。 - Top-Master

3
我刚刚尝试过使用此方法来在多个Xcode项目之间共享代码,我们团队得出的结论是更好的方法是创建一个Xcode项目,其中包含所有共享类,将它们编译为静态/动态库,然后将其作为子项目添加到需要共享代码的项目中。然后您可以设置目标依赖项并链接您的共享库。这样每次向共享库项目添加新类时,就会获得“自动更新”。
这种方法也适用于子模块,甚至是cocoapods/carthage。

3
Kevin- 链接源文件夹,文件夹引用等对于在不同IDE上共享公共代码库的情况非常有用,比如我为我的游戏编译的Windows、Mac、iOS、Android、Linux等操作系统都使用相同的代码库。我有3个不同的IDE都构建同一个共享代码库,因此当我运行svn update后,其中一个自动捕捉到新文件并将其添加到项目中是非常有帮助的,而我从一个IDE(如XCode)进行svn commit时,我的Windows项目中的Eclipse也能够捕捉到更改。我为每个项目设置了不同的项目,因为每个IDE都喜欢以特定配置的方式存储项目文件,所以对于我来说,拥有多个SVN目录(基础项目、项目-ios、项目-android)共享base-project中的代码比拥有一个超级大的项目目录更容易管理。这也是我第一次尝试时的做法。

此外,在XCode 3中它可以正常工作。但他们似乎不喜欢这个有用的功能,所以我刚刚发现在XCode 4中已经不能再使用了。


2
谢谢您的回复,不过这更像是一条评论而不是一个答案。 - Dan Rosenstark
2
这对于独立于文件系统跟踪文件的IDE毫无意义。在Xcode中实现相同的效果,您可以使用子项目,并将该子项目共享给多个不同的项目。您可以向子项目添加新文件,父项目将“自动”获取它们。 - Lily Ballard
4
@Kevin:如果需要不同的编译器选项,例如不同的SDK、不同的架构等,这种方法行不通,对吧?比如考虑两个目标:一个用于iOS,另一个用于OS X;它们都共享相同的代码。每次我添加一个文件,我必须确保它被添加到两个目标中;这很容易出错。如果我只需告诉两个目标编译此文件夹/组中的所有文件,这些目标将始终完美同步。 - Mecki
4
完全同意。如果你来自Linux世界,你会始终考虑如何使你的工作流程适应你的需要,而如果你来自Apple世界,你只需遵循并告诉人们“这不再是最佳实践,因为Apple已经移除了这个功能”。 - superarts.org
一个解决方案是使用CMake在所有平台上维护项目的单一描述,这样你只需要更新一次,所有平台都会看到更改。 - bames53
我正在使用Xcode 7,虽然我没有在以前的版本上尝试过,但是使用文件夹引用来在项目之间共享源文件,并使它们构建为项目本身的一部分,而不是静态链接库,对我来说似乎很好用。相同的C++文件可以在iOS模拟器和OSX命令行工具中构建,而无需使用花哨的静态库或git子模块。不确定这是否是Xcode的修复,还是我忽略了其他明显的问题。 - johnbakers

-12

不行。你为什么还要尝试呢?文件夹引用的作用是代表一个文件夹,而不必为文件夹中的所有单个文件创建条目。它的主要用途是将整个资源文件夹原样复制到项目中。但如果您想编译源代码,则这些源代码必须在目标的编译源代码构建阶段中被引用,这需要为每个文件创建单独的条目。

根据文件夹中的内容,使用Makefile或其他外部构建过程将文件夹中的内容构建成静态库可能更有意义。这样,您可以从Shell脚本阶段调用该构建过程,然后只需链接生成的静态库即可。或者,如果您使用此文件夹作为共享代码的方式(例如svn:externals或git子模块),则可以为该文件夹提供自己的Xcode项目,然后将该项目嵌入到共享此文件夹的任何其他项目中。


5
也许这种想法有些误导,但我只是希望能够在文件系统中添加、移动和删除文件,并且这些操作可以在文件夹结构中反映出来。在我所使用的其他编程语言中都可以实现这一点,而对于版本控制系统来说,这非常重要,因为当你执行 git log --name-status 命令时,文件名和位置都会显示出来。 - Dan Rosenstark
2
现在经过一些思考,我认为这是100%正确的:“大多数语言IDE倾向于使用文件系统作为组织文件的唯一方式。Xcode维护一个单独的文件树,并且不需要您的文件系统层次结构与Xcode中的树匹配。” 但我认为值得一提的是,它非常糟糕,特别是在与git或任何版本控制系统集成方面。 - Dan Rosenstark
1
你为什么还要试呢?- 为什么不能呢?这种情况绝对适合使用git子模块或svn外部引用。至少Xcode可以提供使用文件夹引用来引用源代码的选项...难道世界就会毁灭了吗? - Herr Grumps
7
回答“为什么你要尝试?”:针对包含自动生成代码的目录。一个很好的例子是mogenerator,但自动代码生成当然适用于各种中大型项目。 - Slipp D. Thompson
我不知道我应该点赞还是踩这个答案(;)显然这是正确的答案,因为添加文件夹引用根本行不通。但是此时我更惊讶的是得分有多低... - dcow
显示剩余5条评论

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