【问题标题】:Resource files not updating with Xcode 5资源文件未使用 Xcode 5 更新
【发布时间】:2013-10-01 19:15:04
【问题描述】:

我有一些带有专有扩展名的二进制文件,在我编译时不会在构建中更新。在具有相同项目的先前版本的 Xcode 中,它会检测到文件已更改,并且我很少需要执行“清理”,因为我必须使用这个版本。当然,这会花费更多时间——如果有人能让我知道 Xcode 5 发生了什么变化和/或我能做些什么,我将不胜感激。

我没有包含任何项目细节,因为它实际上只是一个专有的二进制文件,在资源文件夹中具有自定义扩展名,该文件用于在自上次编译后更改时自动更新。如果您需要任何特定的项目设置,我很乐意提供。

它使用的是“蓝色”资源文件夹,它是对其所在文件夹的引用,而不仅仅是复制到项目目录中。我很抱歉,因为我忘记了这个特定的资源文件夹类型叫什么(我猜是参考)。

版本:Xcode 5 (5A1413)

更新:

这只发生在我引用我使用 fopen、fwrite 等以编程方式修改的文件时,并且在使用 OSX 中的文件编辑器重新保存文件(而不是真正更改它)时,Xcode 会看到它已更改。

我现在正在研究 FSEvents,看看这个底层 API 是否是我需要使用的东西,尽管我还不确定如何使用它设置标志。

更新:

好吧,作为一个简单的测试,我获取相同的文件并通过以下方式重新保存它:

NSData* data = [[NSData alloc] initWithContentsOfFile: @"/location/file.dat"];
[data writeToFile:@"/location/file.dat" atomically:YES];

果然,在我调用它然后运行使用该资源的应用程序之后,它会在构建期间通过 Xcode 更新。因此,Xcode 5 似乎依赖于标准 io 函数未设置的一些特殊标志。在这一点上,我可以用那两行东西修补我所拥有的东西,或者弄清楚标记机制是什么,以及如何写入它。 (FSEvents?我没有看到那里的写入机制..)

【问题讨论】:

    标签: ios iphone xcode


    【解决方案1】:

    我遇到了同样的问题。我设置了一个 Xcode 构建阶段脚本来触及根资源文件夹,它现在可以工作了。我找到了说明here,它们如下(更多详细信息请参见链接):

    1) 将您的单个资源目录(命名为“Resources”以外的任何名称)作为蓝色“Folder Reference”添加到您的项目的 Resources 部分中

    2) 右键单击​​您的应用程序目标,选择 Add->New Build Phase->New Run Script Build Phase

    3) 在出现的“信息”窗口中,将 shell 更改为 /bin/tcsh,然后将下面的脚本复制并粘贴到“脚本”文本视图中。

    脚本:

    touch -cm ${SRCROOT}/../../YourResourceFolder
    

    (另外,你可能需要知道how to find "Build Phases" in Xcode 5

    【讨论】:

    • 我不得不遇到同样的问题 - 所以潜在的僵尸链接不会杀死这个,我将在这里简要重新发布 Paul 的答案:制作“运行脚本”构建阶段,并定位文件夹引用不更新:touch -cm ${SRCROOT}/../../MyFolderName - 其中${SRCROOT} 是到 XCode 项目文件位置的宏映射。这只会复制更改的内容,不复制整个内容似乎很聪明——也就是说,您基本上是在恢复 XCode 4 的行为。
    • @RichardKettering 谢谢,在我的回答中添加了说明
    【解决方案2】:

    我也遇到了问题。在 Xcode 5 之前一切都很好,我引用的资源文件夹将非常可靠地复制。然而,在更新之后,无论我对单个文件做了什么(触摸它、删除并重新复制它等),都没有触发 Xcode 再次将其提取出来。

    但是,我现在在构建步骤中修改了引用文件夹的最后写入时间,现在它的内容似乎再次正确复制。希望对你也有帮助。

    我正在使用自定义工具,但我确信构建脚本可以做到这一点。我的猜测是 Xcode 会尝试优化依赖步骤,并在深入研究之前检查文件夹的最后访问/写入时间。

    【讨论】:

    • 感谢您的回答,因为这非常有帮助!我还应该在此处添加的一件事是,如果文件从资源文件夹引用的开始深度为 1 个或多个文件夹级别,则不会获取更改。所以我不得不实际将一个虚拟文件写入父文件夹(然后将其删除)。虽然这可能是标准的 UNIX 时间戳行为,但 Xcode 应该知道这种行为,而不是假设没有任何改变。也许可以为此提交错误报告。
    【解决方案3】:

    一个更简单的方法是从您的外壳或术语中触摸文件夹。 例如在你的终端上运行 触摸-cm PATH_TO_FOLDER_UNDER_RESOURCES

    PATH_TO_FOLDER_UNDER_RESOURCES 是资源文件夹下包含文件的文件夹的实际路径。

    由于更改文件不一定会更改文件夹的时间戳,Xcode 会查看包含文件夹的时间戳。

    【讨论】:

      【解决方案4】:

      我在使用 xcode5 时遇到了同样的问题,我需要经常更新 javascript。我必须清理然后构建,这需要很长时间,因为我的项目有很多源文件。后来我尝试删除应用程序(选择“移动到垃圾箱”而不是“删除引用”)然后构建,它非常快,但我不得不重新启动xcode,以便应用程序可以再次出现在项目中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2021-08-25
        相关资源
        最近更新 更多