多个目标最常见的问题之一是忘记将文件添加到所有目标。导入文件很容易,无需勾选所有框...
在构建阶段有一个“编译源”视图,它是为每个目标编译的文件列表。但是,似乎没有简单的方法来比较目标以查看一个文件中有哪些文件,而另一个则没有。
有没有办法找到不是特定目标成员的文件?也许是脚本?
多个目标最常见的问题之一是忘记将文件添加到所有目标。导入文件很容易,无需勾选所有框...
在构建阶段有一个“编译源”视图,它是为每个目标编译的文件列表。但是,似乎没有简单的方法来比较目标以查看一个文件中有哪些文件,而另一个则没有。
有没有办法找到不是特定目标成员的文件?也许是脚本?
假设您的 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 文件格式的实现细节。
我不知道编写脚本的方法,但是对于一个文件,您可以查看所有目标的列表,并检查关联的目标,您可以从该列表中选中或取消选中目标。
打开实用程序窗格并选择文件检查器。然后选择一个文件,相关的目标将在 File Inspector 的 Target Membership 区域中。
您甚至可以选择多个文件,并且与某些但不是所有选定文件关联的目标将标有“-”。如果您检查一个目标,那么所有选定的文件都将添加到该目标。
在 Xcode 8 中,列出 Target -> Build Phases -> Compile Sources 中的文件会给出每个目标的文件列表,但很难找到丢失的文件。选择所有文件并复制它们允许将物理文件的副本粘贴到临时目录中。在对两个目标执行此操作后,将其放入单独的文件夹中,然后可以删除重复项,直到每个文件夹中只剩下另一个目标中丢失的文件。
我刚刚遇到了一个“这个类不符合键的键值编码”崩溃,这是由于文件未包含在目标中而导致的,因此我必须找到丢失的文件。不是一个有效或优雅的解决方案,但它完成了工作。
如果您不知道添加到目标的文件,您可以转到 Build Phases->Compile Sources(或您有差异的任何部分)。然后选择所有内容并点击复制。将其粘贴到差异程序中,选择另一个目标并重复。
我不知道(完全)快速简便的方法,但是如果您在使用脚本,我有一个可以在这里执行此操作的库:https ://github.com/jasperblues/XcodeEditor
Xcode 组装了一些环境变量,其中一个具有您要查找的目录:
LINK_FILE_LIST_normal_x86_64
,对于 x86_64 目标,它指向LinkFileList
,但从 basedir 您可以使用您可能想要的 FileLists 获取实际目录。