木匣子

Web/Game/Programming/Life etc.

Xcode 5 不更新外部引用资源

自从更新至 Xcode5 后,运行 iOS 模拟器测试 cocos2d-x 项目总是不更新脚本文件,让人十分恼火。经过一番研究之后,得知这是 Xcode5 所谓的优化,Orz。

当你使用 group 方式组织项目结构而引用了外部文件夹的话,在项目 build 的时候,Xcode5 通过判断文件夹的更新日期决定是否重新复制里面的内容。这导致当你在文件夹内增加或修改文件,这些修改直接被 Xcode5 忽略——因为文件夹本身没有变化。

既然知道了问题所在,那就好办了。我们可以使用 unix 的 touch 命令,在项目 build 之前更新外部资源文件夹的时间戳即可。

可以触发执行这个命令的地方有很多,我推荐在 Product > Scheme > Edit Scheme... 对话框中的 Build > Pre-actions 这里添加。也就是在每次 Build 之前的预处理动作。

QQ20131216-4.png

要注意的是 Provide build settings from 这里要选择你要构建的 Target 。设定的脚本如下:

touch -cm ${PROJECT_DIR}/../Resources/src ${PROJECT_DIR}/../Resources/res

其中 -cm 是 touch 的参数,c表示如果文件(夹)不存在不需要创建,m表示更新时间戳。
${PROJECT_DIR}是 Xcode 提供的环境变量,代表项目所在路径,因此可以用相对路径描述我们的资源目录。以下是我的 cocos2d-x 资源结构:

.
├── Classes
├── Resources
│   ├── ...
│   ├── res
│   └── src
├── lib
├── proj.android
├── proj.ios
│   ├── ...
│   ├── HeroCards.xcodeproj ## ${PROJECT_DIR} ##
│   └── ...
└── proj.win32

若要更新的文件夹数量较多的话,可以考虑用 find 命令:

find ${PROJECT_DIR}/../Resources -type d -exec touch -cm {} \;                    

如此一来,Xcode5 又能按预期把文件复制到模拟器中了。其实优化后的 iOS 模拟器确实比以前快很多。

相似的问题及解决方案