如何在Xcode中查找所有不属于任何目标的文件

18

我在使用多个目标时经常遇到的一个问题是忘记将某个文件添加到所有目标中。很容易导入一个文件但是没有勾选所有的选项...

Many Targets

在构建阶段中,有一个“编译源”视图,它是为每个目标编译的文件列表。但是似乎没有简单的方法来比较目标,以查看哪些文件在其中一个目标中而不在另一个目标中。

是否有一种方法可以找到不属于特定目标成员的文件?也许是一种脚本?

7个回答

18

假设您的MyProject.xcodeproj在您的工作目录中,而且所有源文件都在您的工作目录或其下方,您可以使用以下类似hack的方法来查找未属于任何目标的.m文件:

find . -name "*.m" -exec basename '{}' \; | xargs -I '{}' sh -c 'grep "{} in Sources" MyProject.xcodeproj/project.pbxproj > /dev/null; echo "$?\c"; echo " {}"' | grep "^1"

如果你从项目中删除了文件,你可以使用类似的脚本将它们 -- 以及其他不再被项目引用的Objective-C源文件 -- 从git仓库中删除:

find . -name "*.[hm]" -exec basename '{}' \; | xargs -I '{}' sh -c 'grep {} MyProject.xcodeproj/project.pbxproj > /dev/null; echo "$?\c"; echo " {}"' | grep "^1" | cut -c3- | xargs -I '%' find . -name '%' -exec git rm '{}' \;

* 在技术上的意义上,这是一种"hack"行为,因为它依赖于Xcode文件格式的实现细节。


这很棒,但由于pbxproj文件的性质有些慢 :( - Fernando Martínez
您,先生,真是太棒了!谢谢您...您救了我。 - waldenCalms

7
我不知道如何编写脚本,但是对于文件,您可以查看所有目标的列表,并勾选相关目标,您可以从该列表中勾选或取消勾选目标。
打开“实用工具”面板并选择“文件检查器”。然后选择一个文件,相关目标将位于文件检查器的目标成员区域中。
您甚至可以选择多个文件,与某些但不是所有选定文件相关联的目标将被标记为“-”。如果您勾选一个目标,则所有选定的文件都将添加到该目标中。

多文件选择的好提示。可惜当文件夹也被选择时它不起作用。 - Robert
这似乎并没有回答问题,只是一个关于如何以常规方式更改目标的好演示。 - Andres Canella

3

虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接供参考。仅有链接的答案可能会因为链接页面的更改而失效。- 来自审核 - undefined

3
在Xcode 8中,从目标->生成阶段->编译源代码列表可以为每个目标提供文件列表,但没有简单的方法来查找缺失的文件。选择所有文件并复制它们,可以将物理文件的副本粘贴到临时目录中。在对两个目标分别执行此操作后,可以删除副本,直到每个文件夹中仅剩下另一个目标中缺少的文件。
我刚刚因为未包含目标文件而遇到“此类不符合关键值编码路径”的崩溃,所以我必须找到缺少的文件。这不是一种高效或优雅的解决方案,但它完成了工作。

1
如果您不知道将哪些文件添加到目标中,可以转到“Build Phases->Compile Sources”(或您有差异的任何部分)。然后选择所有内容并复制。将其粘贴到diff程序中,选择另一个目标并重复此操作。

0

0

Xcode会组装一些环境变量,其中一个变量包含了你想要查找的目录:

对于 x86_64 目标,LINK_FILE_LIST_normal_x86_64 指向 LinkFileList,但你可以从基础目录中获取你可能想要的 FileLists 的实际目录。


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