我们公司做的小游戏都共用同一个结算界面类GameOver.js、使用相同的工具类Util.js等,如果一个项目建一个工程后,每次修改结算界面,所有项目都得修改一遍,然后再编译、发布,很是麻烦。
今天上午做了个简单地研究,致力于把所有项目合并到一个工程里,然后分项目模块去编译、发布-----------目前仅针对src目录,res目录尚未做优化
现将研究结果记录下来,分享给大家,供研究和学习,有误之处,欢迎批评指正。
本人使用开发工具为WebStorm
引擎版本为cocos2d-js-V3.0-RC2(尚未替换为最新版本的引擎)
如有类似需求,可参考此方案!希望大家多提宝贵意见。
1、引入localModule定义
该localModule指的是工程下的项目模块,例如工程下有个项目叫 test 则在project.json中增加字段 “localModule” : “test”
{
"project_type": "javascript",
"debugMode" : 1,
"showFPS" : true,
"frameRate" : 60,
"id" : "gameCanvas",
"renderMode" : 0,
"engineDir":"frameworks/cocos2d-html5",
"modules" : "cocos2d"],
"localModule": "test",
"jsList" :
"src/md5.js",
"src/Util.js",
"src/Loading.js",
"src/GameOver.js"
]}
```
2、工程目录下添加localModule.json(后续将研究放到各个项目目录中)
定义各个项目为localModule
{
"localModules":{
"cssm":
"src/cssm/resource.js",
"src/cssm/StartScene.js"
],
"test":
"src/test/resource.js",
"src/test/StartScene.js"
]
}
}
```
3、修改CCBoot.js,支持本地运行时加载localModule
修改prepare: function (cb)方法
在var jsList = config || ];之后添加
if(config){
var vv = config;
var tmpTxt = cc.loader._loadTxtSync("localModule.json");
var tmpData = JSON.parse(tmpTxt);
jsList = jsList.concat(tmpData"localModules"]);
}
```
4、编译命令的修改
由于我们发布的是纯web版的,所以只需要修改cocos命令的build_web模块
需要修改的文件在${cocos2d-js引擎目录}/tools/cocos2d-console/plugins/project_compile目录下
project_compile.py文件修改的地:
找到该文件中的build_web方法,在del project_json"jsList"]之后添加如下代码,目的是删除掉编译后的localModule配置
if project_json.get("localModule") != None:
del project_json"localModule"]
```
build_web/__init__.py文件修改的地方:
找到gen_buildxml方法,在userJsList.append(mainJs)之前添加如下代码,目的是把localModule中指定的项目模块代码加载到build.xml文件中便于编译
# added for localModule
mLocalModule = project_json.get("localModule")
if mLocalModule != None :
try:
f = open(os.path.join(project_dir, "localModule.json"))
mLocalModule_cfg = json.load(f)
finally:
f.close()
mLocalModuleMap = mLocalModule_cfg"localModules"]
mLocalJsList = mLocalModuleMap
userJsList = userJsList + mLocalJsList
```
然后编译项目测试,如果运行没有问题,表示大功告成
可以修改project.json中的localModule配置,指定不同的项目进行测试