Egret 4.x 和 5.x 項目共存的方法

正常來講,安裝了對應的引擎以後,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
相關文章
相關標籤/搜索