lua cocos2d-x lua中每次Build都不更新Resource下面的文件,怎样使xcode每次Build都更新Resource下的lua文件

本文介绍了如何确保Xcode在每次Build时自动更新Resource下的资源,特别是在lua项目中遇到的问题。通过添加Run Script Phase到Xcode的Build Phases,并编写脚本来删除并重新导入资源,可以避免手动Clean。文中提供了调整脚本的注意事项,并引用了相关文章作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



非常感谢!

xcode5里面的界面变了,而且Build Phases里面默认没有Run Script一栏,需要选择Editor->Add Build Phase->Add Run Script Phase





用过XCode的人都知道,XCode有一个臭名昭著的bug——除非你修改了源代码造成了重新编译,否则游戏包中的资源经常无法刷新。不管怎么运行资源都是旧的。


关于这个问题,业内有几位同行已经详细探讨过了。有几种解决方法,其中一种方法是,在运行时强制把资源删除,这样XCode会重新导入新的资源。要做到这一点就是写一个脚本,让这个脚本在XCode运行时自动执行。


“我是妖怪”兄曾经写了一个blog,来论述如何写这个脚本,我修改了一下,封装成了函数,这样做新项目时很方便。(好吧,这个是改的,叫自制工具不太好,但是系列标题又不好改。。。)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
_TARGET_BUILD_CONTENTS_PATH=$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH
echo  _TARGET_BUILD_CONTENTS_PATH: $_TARGET_BUILD_CONTENTS_PATH
echo  PWD: $PWD
echo  Cleaning $_TARGET_BUILD_CONTENTS_PATH/
#函数作用:刷新资源文件夹,解决xcode不能刷新资源文件夹的bug
#参数1:传入要操作的文件夹
function  operation_folder()
{
     rm  -fr $_TARGET_BUILD_CONTENTS_PATH/$1/*
     mkdir  -p $_TARGET_BUILD_CONTENTS_PATH/$1/
                                                                                                                                                          
     #判断文件夹不为空,才进行复制,防止cp命令报错
     DIRECTORY=$PWD/.. /Resources/ $1/
     if  "`ls $DIRECTORY`"  !=  ""  ];  then
      cp  -RLp $DIRECTORY/* $_TARGET_BUILD_CONTENTS_PATH/$1/
      echo  operation_folder:$1 completed!
     fi
}


调用的时候,在这段代码后面接着写,函数直接后面加参数就行,比如你的Resources下面有若干子文件夹,pic,ui,sound等。如下方式调用:

1
2
3
4
5
6
operation_folder sound;
operation_folder ttf;
operation_folder script;
operation_folder data;
operation_folder pic;
operation_folder ui;


然后把这个脚本加载到项目的Build Phases中。XCode每次run都会运行这个脚本。

wKioL1LVBl-Cgd9JAAKvUuEBCBY582.jpg



参考文献:

确保 Xcode 每次 Build 时都自动更新资源——我是妖怪兄的原文,这篇文字的代码就是改自这里

http://dualface.github.io/blog/2013/07/31/flush-res-when-build/

XCode ios iphone 变态的资源管理——这篇文章详细论述了XCode资源更新的bug

http://www.cnblogs.com/dabaopku/archive/2012/04/11/2441679.html




确保 Xcode 每次 Build 时都自动更新资源

用过 Xcode 的都知道,Xcode 有一个非常讨厌的 bug,有时候更新资源后,真机调试发现资源还是旧的,这个时候只能 Clean 以后重新 Build。但这样非常浪费时间,特别是大一点的工程,编译一次就要几分钟。这个时候,程序员说不定就跑 moko.cc 去瞎逛了。。。

为了提高生产力,我们需要一个脚本,在 Xcode Build 的时候强制更新资源。


确定目录结构

先看下图,Xcode 项目里蓝色的文件夹表示其中的文件会直接复制到真机上,并且保持目录结构。所以其中的 data,img,snd.ios 目录有什么内容,在真机上也会有什么内容。

01.png01.png


Xcode 在真机调试时,首先进行 Build,生成 .app 文件(实际是一个目录,不过 Finder 里面看着是一个文件),其中就包含了可执行文件和所有资源。然后 Xcode 会将 .app 传输到真机,最后在真机上启动 .app。所以我们的脚本就是在 Build 的时候,确保生成的 .app 里总是包含最新的资源。

这里就需要知道两个路径:原始资源文件所在的路径,以及 .app 中资源文件所在的路径。

第一个路径需要根据 Xcode 项目文件和资源文件的相对位置来确定。

如下图所示,工程文件在项目的 proj.ios 目录中,而资源文件在项目的 res 目录中。那么第一个路径就是

工程文件所在路径/../res/

02.png02.png

由于 Xcode 提供了不少环境变量,所以“工程文件所在路径”和“.app 中资源文件所在的路径”都很容易确定,我们直接在脚本中引用即可。


添加脚本

Xcode 允许在 Build 时指定脚本代码,所以我们要修改 Xcode 的工程,加入脚本内容。

操作步骤:

  • 首先在 Xcode 里选中工程,右侧会显示工程的设置界面。

  • 从设置界面选择 Build Phases 标签,然后点击右下角的 Add Build Phases 按钮,并选择“Add Run Script”。

  • 在新出现的 Run Script 栏中输入以下内容:

    _TARGET_BUILD_CONTENTS_PATH=$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH
    echo _TARGET_BUILD_CONTENTS_PATH: $_TARGET_BUILD_CONTENTS_PATH
    echo PWD: $PWD
    
    echo Cleaning $_TARGET_BUILD_CONTENTS_PATH/
    
    rm -fr $_TARGET_BUILD_CONTENTS_PATH/data/*
    rm -fr $_TARGET_BUILD_CONTENTS_PATH/img/*
    rm -fr $_TARGET_BUILD_CONTENTS_PATH/snd.ios/*
    
    mkdir -p $_TARGET_BUILD_CONTENTS_PATH/data/
    mkdir -p $_TARGET_BUILD_CONTENTS_PATH/img/
    mkdir -p $_TARGET_BUILD_CONTENTS_PATH/snd.ios/
    
    cp -RLp $PWD/../res/data/* $_TARGET_BUILD_CONTENTS_PATH/data/
    cp -RLp $PWD/../res/img/* $_TARGET_BUILD_CONTENTS_PATH/img/
    cp -RLp $PWD/../res/snd.ios/* $_TARGET_BUILD_CONTENTS_PATH/snd.ios/
    
  • 重要: 拖动 Run Script 栏,将其移动到列表的第二个位置(也就是 Target Dependencies 后面)。最后如下图:

03.png03.png


注意事项

  1. 脚本内容需要根据项目的目录结构、资源目录结构进行调整。
  2. 偶尔真机调试时,Xcode 会报告资源文件被修改。这时退出 Xcode 重新打开就好了,比重新编译快很多。

- EOF -

Jul 31 st, 2013
i


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值