合并后在Xcode的project.pbxproj中找到错误

3
我正在处理iOS应用程序版本控制中两个分支的复杂合并。在确定和选择project.pbxproj中冲突的行之后,Xcode无法加载该文件。通过plutil运行它的结果如下:
CFPropertyListCreateFromXMLData():旧样式属性列表解析器:字典中缺少分号。
我已经进行了几次还原和合并(仔细检查),每次都会得到相同的结果,尽管我看不到我引入格式问题的地方。
是否有工具可以用来找出至少错误出现在哪一行或对象上,以便我能找到我犯的错误?

你是否使用Xcode 4的SCM集成(更智能地处理项目文件SCM管理)来处理合并?如果没有,那值得一试。另外,你使用的是哪个SCM系统?这两个信息可能会导致你找到问题的答案,即使不是你确切的问题。 :-) - Joshua Nozzi
@JoshuaNozzi 我正在使用git,不是Xcode的SCM工具。它没有提供“合并”选项,只有“拉取”和“提交”;-) - user23743
我相信Xcode与Git的“Pull”会产生合并:http://developer.apple.com/library/mac/#recipes/xcode_help-repositories_organizer/PullingUpdatesfromaRemoteRepository/PullingUpdatesfromaRemoteRepository.html - Joshua Nozzi
它不会这样做(它认为工作区中有未决的更改...但我的工作区与此不同意)。我采取了“接受他们并添加我的文件”方法,但这都没有回答我的问题,即是否可能对OPENSTEP风格的属性列表文件进行lint检查 :-) - user23743
这是合并的方法:http://developer.apple.com/library/mac/#recipes/xcode_help-repositories_organizer/MergingTwoBranches/MergingTwoBranches.html#//apple_ref/doc/uid/TP40010350-CH10-SW1 - user23743
啊,我明白了。抱歉打扰了。 - Joshua Nozzi
2个回答

3

我创建了以下测试:

#import <Foundation/Foundation.h>
#import <err.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSString *path = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:argv[1] length:strlen(argv[1])];
        NSData *data = [NSData dataWithContentsOfFile:path];

        if (!data)
            errx(EXIT_FAILURE, "open failed: %s\n", argv[1]);

        NSString *errorString;
        id plist = [NSPropertyListSerialization propertyListFromData:data
                                                    mutabilityOption:NSPropertyListImmutable
                                                              format:NULL
                                                    errorDescription:&errorString];


        if (!plist)
            errx(EXIT_FAILURE, "%s\n", [errorString UTF8String]);

        printf("plist successfully read\n");
    }
    return 0;
}

并使用修改后的project.pbxproj文件运行它:

// !$*UTF8*$!
{
        archiveVersion = 1;
        classes = {
                x = 1
        };
...

并且出现了以下错误:

2012-05-11 20:51:14.381 plist-test[41890:303] CFPropertyListCreateFromXMLData(): 旧式plist解析器:字典的第6行缺少分号。解析将被放弃。请在_CFPropertyListMissingSemicolon处中断以进行调试。


看起来很不错 :). 我会重现我的Xcode问题,看看会发生什么。 - user23743
很不幸,它并没有找到这个问题。"2012-05-12 11:25:31.389 Untitled 2[1412:707] CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary. Untitled 2: Unexpected character / at line 1" 不过,这仍然是一个有用的技巧 :) - user23743
你说得对,Lion没有报告行号。你能把文件发给我吗? - Aaron Burghardt

0

我相信你已经考虑过这个问题了,但我所看到的唯一选择是编写一个快速实用程序。

你可以尝试使用CFPropertyListIsValid(),希望它会输出一些有用的信息。头文件中说:

调试库版本会输出一些有用的信息。

也许这个函数可以让你更深入地了解它的日志活动?我不知道苹果公司认为什么是“有用”的或者“一些”意味着什么(也许只是“不行。它是无效的。”并返回false),但这将是我的下一个尝试。

此外,如果你逐步读取,CFPropertyListCreateWithStream()可能会有所帮助。你可以使用它来缩小错误位置的范围,通过分段输入直到它返回NULL。当遇到NULL时缩小大小,就可以越来越接近它的消化点。


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