14

多个目标最常见的问题之一是忘记将文件添加到所有目标。导入文件很容易,无需勾选所有框...

许多目标

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

有没有办法找到不是特定目标成员的文件?也许是脚本?

4

7 回答 7

12

假设您的 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"

从项目中删除文件后,您可以使用以下类似脚本从 git 存储库中删除它们 - 以及不再从项目中引用的其他 objc 源文件:

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 '{}' \;

* 从某种意义上说,它取决于 Xcode 文件格式的实现细节。

于 2018-10-15T22:48:16.817 回答
7

我不知道编写脚本的方法,但是对于一个文件,您可以查看所有目标的列表,并检查关联的目标,您可以从该列表中选中或取消选中目标。

打开实用程序窗格并选择文件检查器。然后选择一个文件,相关的目标将在 File Inspector 的 Target Membership 区域中。

您甚至可以选择多个文件,并且与某些但不是所有选定文件关联的目标将标有“-”。如果您检查一个目标,那么所有选定的文件都将添加到该目标。

于 2012-07-04T16:02:02.977 回答
3

我构建了一个工具,可让您提取目标中的文件

https://github.com/ConfusedVorlon/ProjectFileTool

您可以将此与在项目目录中搜索 .m 文件进行比较。

于 2015-01-14T15:17:38.200 回答
3

在 Xcode 8 中,列出 Target -> Build Phases -> Compile Sources 中的文件会给出每个目标的文件列表,但很难找到丢失的文件。选择所有文件并复制它们允许将物理文件的副本粘贴到临时目录中。在对两个目标执行此操作后,将其放入单独的文件夹中,然后可以删除重复项,直到每个文件夹中只剩下另一个目标中丢失的文件。

我刚刚遇到了一个“这个类不符合键的键值编码”崩溃,这是由于文件未包含在目标中而导致的,因此我必须找到丢失的文件。不是一个有效或优雅的解决方案,但它完成了工作。

于 2017-09-15T11:34:03.967 回答
1

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

于 2013-04-14T14:17:58.300 回答
0

我不知道(完全)快速简便的方法,但是如果您在使用脚本,我有一个可以在这里执行此操作的库:https ://github.com/jasperblues/XcodeEditor

于 2013-04-14T14:28:17.360 回答
0

Xcode 组装了一些环境变量,其中一个具有您要查找的目录:

LINK_FILE_LIST_normal_x86_64,对于 x86_64 目标,它指向LinkFileList,但从 basedir 您可以使用您可能想要的 FileLists 获取实际目录。

于 2020-05-18T10:27:15.183 回答