我有一些带有专有扩展的二进制文件,在编译时没有在构建中更新。在具有相同项目的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];
NSData* data = [[NSData alloc] initWithContentsOfFile: @"/location/file.dat"];
[data writeToFile:@"/location/file.dat" atomically:YES];
果然,在我调用它然后运行使用该资源的应用程序之后,它会在构建期间通过Xcode更新。因此,似乎Xcode 5依赖于一些未由标准io函数设置的特殊标志。在这一点上,我可以修补我用2行的东西,或者弄清楚标记机制是什么,以及如何写入它。 (FSEvents?我在那里看不到写作机制..)
答案 0 :(得分:11)
我遇到了同样的问题。我设置了一个Xcode构建阶段脚本来触摸根资源文件夹,它现在可以正常工作了。我找到了说明here,它们如下(有关详细信息,请参阅链接):
1)将您的单个资源目录(除“资源”之外的任何名称)添加到参考资料部分的项目中,作为蓝色的“文件夹参考”
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)
答案 1 :(得分:4)
我也遇到了问题。在Xcode 5之前一切都很好,我引用的资源文件夹将非常可靠地复制。但是,在更新之后,无论我对单个文件做了什么(触摸它,删除并重新复制它等),都没有触发Xcode再次挖掘它。
但是,我现在在构建步骤中修改引用文件夹的上次写入时间,现在它的内容似乎再次正确复制。我希望对你有帮助。
我正在使用自定义工具,但我确信构建脚本可以执行相同的操作。我的猜测是Xcode尝试优化依赖步骤,并在潜入之前检查文件夹的最后访问/写入时间。
答案 2 :(得分:1)
更简单的方法是从shell或术语中触摸文件夹。 例如在您的终端上运行 触摸-cm PATH_TO_FOLDER_UNDER_RESOURCES
PATH_TO_FOLDER_UNDER_RESOURCES是包含文件的资源文件夹下文件夹的实际路径。
由于更改文件不一定会更改文件夹的时间戳,Xcode会查看包含文件夹的时间戳。
答案 3 :(得分:0)
我和xcode5有同样的问题,我需要经常更新javascript。我不得不清理然后构建,花了很长时间,因为我的项目有很多源文件。后来我试图删除应用程序(选择“移动到垃圾箱”而不是“删除引用”),然后构建,它非常快,但我不得不重新启动xcode,以便应用程序可以再次出现在项目中。