8

我公司的 iPhone/ipad 产品已经迁移了几代 iOS 和 Xcode(现在是 5.1 和 4.3),并且有很多目标。也许是因为这些因素,PBXBuildFile 部分中的每个源文件都有许多相同的行,例如:

14EE4CD315A5E69000DCA763 /* 资源中的电影@2x.png */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* 电影@2x.png */; };
14EE4CD415A5E69000DCA763 /* 资源中的电影@2x.png */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* 电影@2x.png */; };
14EE4CD515A5E69000DCA763 /* 资源中的电影@2x.png */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* 电影@2x.png */; };
14EE4CD615A5E69000DCA763 /* 资源中的电影@2x.png */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* 电影@2x.png */; };
14EE4CD715A5E69000DCA763 /* 资源中的电影@2x.png */ = {isa = PBXBuildFile; fileRef = 14EE4CB615A5E68500DCA763 /* 电影@2x.png */; };

请注意,给定源文件的行都是绝对相同的(我错了,它们并不完全...),重复行的数量从无到六打或更多不等。由于这种重复,project.pbxproj 的 PBXBuildFile 部分几乎有 5000 行长,尽管我们实际上只有大约 1200 个唯一文件。

在我拼凑出一个脚本来去除所有这些重复的行,并要求对所有构建和目标进行完全回归测试之前,我想确保 Xcode 出于某种神秘的原因不需要这些重复的行。

我相当肯定这不是由版本控制错误引起的。重复的行只出现在 PBXBuildFile 部分,虽然我不喜欢 P4,但我们在合并 project.pbxproj 文件更改时遇到了一点麻烦,虽然有近 20,000 行,但有点笨拙。我认为 Xcode 的某些版本做到了这一点,也许是在添加新目标时,但我没有发现其他人抱怨这个问题。

次要问题:这是怎么发生的?有没有其他人发现这种重复的行?

4

4 回答 4

7

如您所见,文件 ref 是重复的,但每个目标内的文件 id 有一点点差异 14EE4CD* 3 *15A5E69000DCA763 ,第 8 位相当不同。

于 2012-11-16T11:47:02.353 回答
6

为后代张贴,以防其他人也遇到这种情况。

当开发人员在单独的分支上工作时,例如将文件移动到不同的文件夹,在与另一个开发人员在单独的分支上进行更改的另一个组相同的子文件夹中添加新组等,然后需要将他们的项目更改合并回一个公共基础分支。合并 Xcode 项目文件本身就是一种特殊的地狱,没有好的方法可以确定这些引用中的哪一个是您要保留的引用;正如@Maistor Kokir指出的那样,每个引用的 id 都是唯一的,选择正确的 ID 至关重要,因为组通过 ID 引用文件,更重要的是,构建规则和目标也引用 id。

我发现可靠解决此问题的唯一方法是删除对相关文件的所有引用(在构建目标的“构建阶段”|“编译源”中),然后重新添加。

而且,为了真正从源头上修复它,我建议开发人员在公共分支(例如 git“master”分支)上进行任何项目更改,然后将该更改合并到他们的开发分支。项目添加通常不需要相同的处理;仅在“合理范围内”进行更改,包括(但不限于)将文件移动到不同的组,甚至移动到同一组中的不同位置、重命名或删除组、删除或修改子模块引用等. 经验将是你真正的向导。

于 2016-05-20T22:51:19.463 回答
1

通常 Xcode 会为多个目标中引用的文件生成唯一的引用(ID)。我想您有多个构建目标和 LoginViewController 都引用了这两个目标,最终得到不同的 fileRef ID。虽然它看起来相同,但假设它可能是无害的而删除它们可能会导致崩溃。

您可以从http://www.monobjc.net/xcode-project-file-format.html阅读有关 pbxproj 文件的更多信息。

于 2016-03-10T06:17:56.420 回答
0

我终于编写并运行了删除许多重复文件引用的脚本。这样做似乎完全无害,我的本地构建都继续正常工作。我从来没有检查过这些修复,因为我大约在那时换了雇主,而且在离开之前扔一颗有可能破坏十几个团队的构建的炸弹似乎很粗鲁。

于 2013-10-22T18:26:14.887 回答