Xcode 4 项目:清理 pbxproj 文件的工具?

26

我有一个Xcode 4项目,包含两个目标:一个是iPhone,另一个是iPad。如果我点击iPad目标并尝试进入“生成设置(Build Settings)”,Xcode 4会崩溃:

遇到多重断言(assertions)。第一个断言是:/SourceCache/IDEXcode3ProjectSupport/IDEXcode3ProjectSupport-269/Xcode3Sources/XcodeIDE/Frameworks/DevToolsBase/pbxcore/FileTypes/../PBXFileType.m:594中的ASSERTION FAILURE 细节信息:filename应该是非空字符串,但实际上为nil

显然,pbxproj文件中某处存在错误引用——可能是由于git强制合并所导致。有没有办法清理pbxproj文件,使其再次正常工作,或者找出引起问题的代码行? 我真的非常希望不必从头开始重新创建项目。


1
很高兴你找到了解决方案(知识就是力量),但是......如果你正在使用Git,为什么不恢复到良好的状态呢?最坏的情况是:你需要清理已删除项目成员的引用或将文件添加回项目中。 - Joshua Nozzi
6个回答

25

我尝试了gorbster的方法,但没有成功(尽管它之前曾经解决过我的类似问题)。

我进入了project.pbxproj文件(位于项目的.xcodeproj包内),并找到了两行看起来有些可疑的代码,格式如下:

53A45F8F138FE6F40077017F /* (null) in Resources */ = {isa = PBXBuildFile; };

我删除了这些行,然后呈现出:我可以再次访问此目标的构建设置。

不知道它们最初是怎么进去的。我猜测可能与 SVN 下的错误合并有关。


这真是个好发现。谢谢你。我没想到在 .xcodeproj 中会有一个实际的“(null)”文本字符串,我可以搜索并删除它。这为我解决了问题。 - memmons
在project.pbxproj中没有找到(null)值。甚至尝试删除用户特定的.xcuserdatad文件夹,但仍然在点击构建设置时导致Xcode崩溃。请问有什么解决方案吗? - srikanth rongali

15

今天早上在合并同事的代码后遇到了相同的问题。

我使用以下方法解决了这个问题:

  1. 关闭 Xcode
  2. 在 Finder 中打开.xcodeproj
  3. 删除project.xcworkspace 文件/包
  4. 打开xcuserdata 文件夹并删除您的用户特定的 .xcuserdatad 文件夹。
  5. 重新打开 Xcode 和项目

我的一些次要用户偏好设置(文件和选项卡历史记录等)丢失了,但现在我可以无问题地单击所有(9)个目标。原来我的同事使用的是较旧版本的Xcode,但我不确定这是否导致了IDE崩溃。


我按照这些步骤操作后,至少可以再次点击目标而不会崩溃,但如果我点击“构建设置”,它会出现相同的错误并崩溃。 - Ben Mosher
虽然这并没有解决我的问题,但我想它对很多人会有用。+1。 - memmons

10

Ben Mosher 找到了解决方案。 是由于 SVN 合并问题导致的。 我们在使用 SVN 的团队中经常出现此错误,因此我编写了一个 bash 脚本:

#!/bin/bash
sed "/(null) in/d" project.pbxproj > tmp_project.pbxproj
mv tmp_project.pbxproj project.pbxproj

1
不错!我并不经常遇到这种情况(虽然这可能是因为我们团队目前只有两个提交者),但如果这成为一个不太经常的问题,我一定会借鉴这个方法。 - Ben Mosher
1
为什么不直接使用 sed -i "/(null) in/d" project.pbxproj 呢? - denis_lor

8
关闭Xcode,尝试以下步骤:
  1. 在Finder中找到{YOUR_PROJECT}.xcodeproj文件。

  2. 右键点击{YOUR_PROJECT}.xcodeproj文件。

  3. 选择Show Package Contents ... 这将在另一个Finder画面中打开其内容。

  4. 打开文件project.pbxproj并搜索所有包含字符串 "(null) in" 的行。

  5. 删除所有包含(null) in的行......放心删除。

  6. 保存文件。

现在使用Xcode打开项目并尝试打开构建设置选项卡......希望你的问题得到解决。
谢谢, Mohamed.

1

右键点击你的.xcodeproj文件并选择“显示包内容”。

然后用TextEdit打开project.pbxproj文件并进行复制。

将复制的文件以相同的名称和扩展名(project.pbxproj)保存在任何位置。

最后将旧文件替换为新文件即可。


0

如果您也尝试过删除(null)引用行和删除用户特定的.xcuserdatad文件夹,但这些方法都没有奏效,那么这里有一个潜在的解决方案。顺便说一下...这是在Xcode 7.3.1上遇到的问题。

以下是我面临的情况:

我遇到了这个问题,它是由于git仓库中存在“双胞胎”分支而触发的...(即一个分支BRANCH_A是一个开发分支,其中包含一些未发布的功能,另一个分支除了新功能之外具有相同的提交记录,称之为BRANCH_B)。

开发工作流程如下:从BRANCH_B开始,创建一个提交分支CHANGE_C,进行更改并提交,然后切换到BRANCH_A,创建一个提交分支,然后从CHANGE_C中挑选更改。BRANCH_A以这种方式跟踪BRANCH_B,并具有其附加的功能文件。

在我的情况下,(由于重新设置BRANCH_B跟踪的远程协作者更改时出现了某些问题),BRANCH_B的项目文件被损坏了。

在这种情况下,解决方案是保存BRANCH_A的项目文件副本(该文件良好且可编译),然后检出BRANCH_B,并用该副本替换其项目文件。

最初,它不会编译,直到从目标的Build Phases > Compile Sources中删除了对BRANCH_A功能文件的所有引用。

非常好用。


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