我们公司做的小游戏都共用同一个结算界面类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配置,指定不同的项目进行测试