正常來講,安裝了對應的引擎以後,4.x的項目和5.x的項目是各自編譯互相不影響的。node
可是因爲引擎的bug,我在實際使用中,出現了編譯5.x的項目正常,以後切換到4.x的項目編譯時,顯示正常編譯完畢,可是實際會變成使用5.x的引擎來編譯的狀況,結果是lib下的文件變成了5.x的lib,當我手動替換了lib以後,發現運行報錯,原來bin-debug下的js也變成了5.x的編譯以後的代碼,沒法兼容4.x的lib的問題。npm
接下來就是一通嘗試,包括重啓,重裝引擎等等,中間還出現了4.x編譯出現一直在編譯中不結束的bug(頭痛),一直沒有解決這個問題,致使4.x的項目沒法編譯。app
快奔潰時,終於找到以下的解決方法:ui
命令行進入4.x項目,執行clean命令:this
egret cleanspa
命令執行完畢後,再編譯就正常了。prototype
另外還發現,只要5.x進行過編譯的命令,就會出現這個問題,其它命令正常,但願官方能夠修復這個bug。命令行
這個算是在嘗試中獲得的一點經驗,記錄一下,當時想,我手動調用指定的版本的引擎來編譯是否是就能夠避開這個bug了(後面證實不能避開這個bug)。debug
咱們調用egret命令時,其實是在環境變量中尋找名爲egret的可執行文件,個人機器是在目錄C:\Users\Administrator\AppData\Roaming\npm下的egret.cmd文件,打開該文件後咱們能夠發現其實是用node調用執行位於引擎安裝目錄下的selector.js文件,個人全路徑是C:\Program Files (x86)\Egret\EgretLauncher\resources\app\engine\win\selector.js,selector.js文件會獲取用於編譯的版本,同時會獲得這個版本引擎的位置,而後調用引擎目錄下的tools\bin\egret文件執行便可,好比個人4.1.0的全路徑是C:\Users\Administrator\AppData\Roaming\Egret\engine\4.1.0\tools\bin\egret,egret文件又會調用Entry.js文件進行實際的執行。code
上面是調用流程,有興趣的朋友能夠自行查看引擎的編譯js代碼。
咱們只要本身寫一個自定義調用的方法便可,個人5.x的引擎放在E:\\Egret\\5.1.2的目錄下,我在C:\Users\Administrator\AppData\Roaming\npm下新建了兩個文件,以下:
egret2.cmd
"C:\Program Files (x86)\Egret\EgretLauncher\resources\app\engine\win\node.exe" --max-old-space-size=2000 "C:\Users\Administrator\AppData\Roaming\npm\egret2.js" %*
egret2.js
1 function entry() { 2 process.env["EGRET_PATH"] = "E:\\Egret\\5.1.2"; 3 require("E:\\Egret\\5.1.2\\tools\\bin\\egret"); 4 } 5 6 entry();
因爲這個引擎已經在引擎面板中移除了,還須要添加5.1.2的引擎到引擎組中,打開E:\Egret\5.1.2\tools\project\ProjectData.js文件,找到下面的代碼:
1 EngineData.prototype.init = function () { 2 return __awaiter(this, void 0, void 0, function () { 3 var egretjs, data, item, value; 4 return __generator(this, function (_a) { 5 egretjs = this.getLauncherLibrary(); 6 data = egretjs.getAllEngineVersions(); 7 for (item in data) { 8 value = data[item]; 9 this.versions.push({ version: value.version, path: value.root }); 10 } 11 return [2 /*return*/]; 12 }); 13 }); 14 };
改成下面的樣子:
1 EngineData.prototype.init = function () { 2 return __awaiter(this, void 0, void 0, function () { 3 var egretjs, data, item, value; 4 return __generator(this, function (_a) { 5 egretjs = this.getLauncherLibrary(); 6 data = egretjs.getAllEngineVersions(); 7 for (item in data) { 8 value = data[item]; 9 this.versions.push({ version: value.version, path: value.root }); 10 } 11 this.versions.push({ version: "5.1.2", path: "E:\\Egret\\5.1.2" }); 12 return [2 /*return*/]; 13 }); 14 }); 15 };
下面使用命令行進入5.x項目,執行下面的命令便可:
egret2 build
而後發現編譯成功,可是回來在編譯4.x時仍是老樣子,仍是使用5.x的引擎,可是,若是使用clean則不會出現問題,同時clean也會編譯項目,因此編譯5.x的項目時使用下面的命令便可:
egret2 clean