修改项目配置,使一个工程支持多个项目,所有项目共用工具类和结算界面

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


要是不用修改引擎就能做这种扩展就好了,否则每次升级引擎又要重新修改一次,特别是多人协作的时候,每台机器上都要修改一次
另外独立App版本和H5版本用到的js文件可能不一样,要是能直接在project.json配置加载不同的js就好了

如果官方引入我上述做法的话,引擎就不用修改了呀 呵呵

已经改成每个项目对应一个localModule.json文件了

:867: 感谢分享

可是我觉得,多模块的支持不需要如此复杂呀。你可以看下samples下,js-moonwarriors, js-tests 使用的是同一个引擎文件, 同样的道理, 如果你有需要共享的文件,直接在跟framework同级目录下建一个共享的src就可以了。 这样每个工程都可以自由的引用。

对 你说的是一种方案 我昨天下午就在试你说的这种方案 呵呵
之前我那个是按照自己思路来的 总感觉有点复杂 最主要是得修改编译代码较为麻烦

但是你说的这个方案 共享的res资源不太好处理,而且每个项目都要当成一个工程去处理,都要有自己的res src project.json文件,也有一定的不便之处

每个工程都有自己的文件这样耦合度就不会那么高。单独放到外面也能跑。然后至于res,你放到framework目录那级,就跟你方案一样了。 放到里面就是私有的资源。打包的时候也不会多资源出来。方便处理。