Laya 命令行l(wèi)ayacmd绪商、資源版本管理

參考
layacmd
資源版本管理

一、layacmd

注意耳璧,官方在2017.12.13發(fā)帖子(更改layacmd名字為layaair-cmd)說成箫,由于npm賬號問題導致無法修改之前的layacmd文件,所以現(xiàn)將layacmd名字改為layaair-cmd旨枯。
修改之后的文檔在官網(wǎng)的地址
在npmjs的地址
相關的幫助文檔也變成了layaair-cmd蹬昌,當然安裝方式也由之前的npm install layacmd -g,變成npm install layaair-cmd -g

layaair-cmd的大部分子命令都需要當前工作目錄下包含layaair項目攀隔,少數(shù)命令可以手動指定輸入目錄皂贩,如guetzl,atlas命令則是即可以直接$ layaair-cmd atlas昆汹,也可以指定輸入目錄先紫。

1.編譯
layacmd compile
2.發(fā)布
layacmd publish -n 1.0.1
3.導出UI
layacmd ui -c -a
4.資源版本控制
layacmd resourceVersion -i res -o . -n 1.0.0
5.guetzli
layacmd guetzli -i src
該命令不需要當前目錄包含layaair項目,取而代之的是筹煮,你需要指定輸入目錄。壓縮成功后居夹,源文件會被修改败潦。壓縮失敗則源文件保持不變本冲。
guetzli的壓縮過程很慢,而且占用資源大劫扒,所以可能要等待些時間檬洞。最好在資源版本控制生成的文件夾中使用guetzli壓縮,這可以保證不會重復壓縮一張圖沟饥。
注意這里只有-i,沒有-o添怔,也就是直接改了源文件,不如用Gulp腳本來運行guetzli更方便
6.本地服務器
layacmd open 9000 -s
9000是端口號贤旷,-s 表示 don't open browser
這個很明顯广料,用的是anywhere

二、資源版本管理

資源版本控制用于為資源生成版本幼驶。版本號默認從數(shù)字1000開始遞增艾杏,如果傳入--versionName參數(shù),則使用用戶指定的版本名稱盅藻。下次建立建立版本時如果沒有再次指定--name购桑,版本號為1002,因為每次生成版本氏淑,資源版本控制內部版本計數(shù)器都會遞增勃蜘。
在建立版本時,相對于上次版本建立假残,修改了的文件或者新增的文件會被記錄在新版本中缭贡。如果沒有新增文件或者沒有修改文件,不會有新版本生成守问。
在最終使用資源時匀归,不允許使用上層相對路徑,即路徑中包含“..”耗帕。

$ layacmd resourceVersion -h
  Usage: layacmd-resourceVersion [options]
  Options:
    -h, --help                       output usage information
    -V, --version                    output the version number
    -i --input <input>               資源目錄
    -o --output <output>             導出目錄
    -n --versionName <version name>  版本名稱穆端,默認是從1000開始遞增的數(shù)字

該命令不需要當前目錄包含layaair項目,取而代之的是仿便,你需要指定輸入目錄体啰。
比如:

layacmd resourceVersion -i res -o . -n 1.0.0

這里-i代表資源路徑,-o . 代表版本資源輸出路徑為當前路徑嗽仪,當然開發(fā)者也可以自定義輸出路徑荒勇,比如定義路徑為version文件夾等等,-n 1.0.0初始化版本為1.0.0闻坚。
參考資源版本管理問題官方回復:

Q:這個 -i res 的意思是只處理res目錄嗎沽翔?如果res目錄之外還有目錄跟js文件需要打版本那要怎么搞呢?
A:一般一個項目只會針對一個資源文件夾,很少出現(xiàn)2個完全分離的資源文件夾仅偎,所以我們的命令行目前也只能針對一個資源文件夾做資源版本控制跨蟹,-i res ,橘沥,窗轩,res可以為任意路徑!

1.資源版本
名為1000座咆、1001痢艺、1002的文件夾是默認資源版本名稱,里面保存的是對應版本被修改了的資源介陶。
2.record記錄文件
.record在Unix-like系統(tǒng)中是隱藏文件堤舒。這個文件保存最近的版本建立信息,資源版本控制由此來判定建立新版本時哪些文件被修改斤蔓。這個文件不能被刪除植酥,如果這個文件丟失,之前建立的版本就會丟失弦牡,相當于重新開始建立版本友驮。
3.manifest.json

{
    "res1": "1000",
    "res2": "1000",
    "res3": "1002",
    "sub\\res3": "1000",
    "sub\\res4": "1000"
}

從中得到每個資源的最新版本號,從這些文件夾讀取manifest.json對應的版本資源(資源根目錄/版本號/相對文件路徑)
4.資源版本切換
由于manifest.json保存各版本的文件版本號驾锰。所以只需要保留歷史manifest.json即可使用對應版本的資源卸留。

三、實踐
package
{
    import laya.net.Loader;
    import laya.net.ResourceVersion;
    import laya.utils.Handler;
    public class Main
    {
        private var configUrl:String ="manifest.json?"+Math.random();;
        public function Main()
        {
              Laya.init(500,500);
              ResourceVersion.enable(configUrl,Handler.create(this,this.completeHandler));
        }
        private function completeHandler(e:Object):void
        {
           var obj:Object = Laya.loader.getRes(configUrl);
           var data:Array =[
               {"url":"res/sound/a.mp3","type":Loader.BUFFER},
               {"url":"res/data/data.data","type":Loader.TEXT}
           ]
           Laya.loader.load(data,Handler.create(this,resComplete));
        }
        private function resComplete():void
        {
        }
    }
}

按照資源版本管理椭豫,如果我們修改了文件耻瑟,但一直用
layacmd resourceVersion -i res -o . -n 1.0.0來打包,其實mainfest.json是不會變的赏酥。當然新增文件喳整,會添加新的一行,版本號還是1.0.0

0 new files    (+)
0 deletions    (-)
1 modifications(*)
5 no changes   (=)

從上面的log中也能看出裸扶,這個工具實際上在對比文件變化框都,記錄到mainfest.jon中,標清每一個文件要去1.0.0里取呵晨,還是1.0.1里取魏保。

四、問題:

1.圖集和未打包圖片不在一個路徑下
IDE的資源中摸屠,有一部分是不打包的谓罗,按照默認設置,不打包的圖片直接導到bin目錄下季二,而打包的圖集資源是在res/atlas下面檩咱。這樣上面講的資源版本管理,如果只針對res目錄,那么不打包的資源就不在控制范圍內了税手。

解決辦法就是把未打包圖片蜂筹,也放到res下面。


Paste_Image.png

這樣會出現(xiàn)運行過程中加載不到這些外部圖片芦倒,因為basePath默認指向根目錄。解決辦法就是改basePath不翩。具體參考Laya Loader 圖集 圖片

var addPath:string = Laya.URL.basePath += "res/";
Laya.URL.rootPath=Laya.URL.basePath = addPath;

2.在哪里做資源版本兵扬?
Q:資源管理,是放在bin下口蝠,在發(fā)布release時一并導出器钟。還是發(fā)完release后,再去release下的資源目錄中做資源管理呢妙蔗?
A:LAYA IDE自帶的發(fā)布功能傲霸,每次都需要一個新的版本號,比如1.0.4眉反。那么在1.0.4資源目錄中昙啄,是沒辦法找到之前的mainfest和資源的,除非去1.0.3里寸五,復制過來梳凛。然后再運行l(wèi)ayacmd。另外梳杏,還要添加代碼

var configUrl:string ="manifest.json?"+Math.random();
Laya.ResourceVersion.enable(configUrl,Handler.create(this,this.completeHandler));

雖然可以在debug版本中通過標記變量判斷是release版本才執(zhí)行這段代碼韧拒。
綜上,我選擇了在debug中就做資源版本
3.直接在res目錄下運行layacmd resourceVersion -i . -o . -n 1.0.0,生成的mainfest.json中都是這樣的:"res\/1.0.0\/res\/atlas\/comp.json": "1.0.1",.然后ResourceVersion.as中這段代碼就會出問題

        /**
         * 為加載路徑添加版本前綴十性。
         * @param   originURL   源路徑叛溢。
         * @return 格式化后的新路徑。
         */
        public static function addVersionPrefix(originURL:String):String {
            if (manifest && manifest[originURL])
                return manifest[originURL] + "/" + originURL;
            return originURL;
        }

因為傳進來的參數(shù)originURL前面并沒有帶res劲适,所以if (manifest && manifest[originURL])判斷 失效楷掉。于是我悲劇地重寫這個方法:

Laya.ResourceVersion.addVersionPrefix=function(originURL){
    originURL = "res/"+originURL;
    if (Laya.ResourceVersion.manifest && Laya.ResourceVersion.manifest[originURL])
        return Laya.ResourceVersion.manifest[originURL]+"/"+originURL;
    return originURL;
}

ok,一切正常了。然而事情并沒完减响,當我修改文件靖诗,去打1.0.1時,由于還是在res內打包支示,就出現(xiàn)把之前的1.0.0也打包到1.0.1里……

Paste_Image.png

所以我們不能在res目錄內用命令來分資源版本刊橘。
4.重新回到bin目錄下,使用命令:
layacmd resourceVersion -i res -o . -n 1.0.0
manifes.json:
"res\/atlas\/.rec": "1.0.0"
發(fā)現(xiàn)1.0.0下面已經(jīng)有res目錄颂鸿,所以basePath不需要再添加res了促绵。
那么addVersionPrefix還要不要重寫呢,測試了下,還是需要的败晴。因為IDE中未打包資源的skin并未攜帶res前綴浓冒,雖然其它資源我們可以手動上res前綴,比如

        function loadSound():void
        {
            var obj:Object = Laya.loader.getRes("res/sound/a.mp3");
        }

         function resComplete():void
        {
            Laya.loader.load([{ url: "res/atlas/comp.json", 
                  type: Loader.ATLAS }], Handler.create(this, this.onLoaded));
        }

重寫addVersionPrefix方法就相當于給所有經(jīng)過版本控制的資源尖坤,都添加了res前綴稳懒,這樣不管是圖集,音樂慢味,還是外部加載圖片场梆,都不需要再添加res前綴了
5.最后根據(jù)debug,release來分策略加載

private loadByResVersion() {
    var bgInfo = window["bgInfo"];
    if (!bgInfo["debug"]) {
        //重寫版本控制中路徑方法
        Laya.ResourceVersion.addVersionPrefix = function (originURL) {
            originURL = "res/" + originURL;
            if (Laya.ResourceVersion.manifest && Laya.ResourceVersion.manifest[originURL]) {
                return Laya.ResourceVersion.manifest[originURL] + "/" + originURL;
            }
            return originURL;
        }
        var configUrl: string = "manifest.json?" + Math.random();
        Laya.ResourceVersion.enable(configUrl, Laya.Handler.create(this, this.beginGameLoad));
    } else {
        var addPath: string = Laya.URL.basePath += "res/";
        Laya.URL.rootPath = Laya.URL.basePath = addPath;
        this.beginGameLoad();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纯路,隨后出現(xiàn)的幾起案子或油,更是在濱河造成了極大的恐慌,老刑警劉巖驰唬,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顶岸,死亡現(xiàn)場離奇詭異,居然都是意外死亡叫编,警方通過查閱死者的電腦和手機辖佣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宵溅,“玉大人凌简,你說我怎么就攤上這事∈崖撸” “怎么了雏搂?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寇损。 經(jīng)常有香客問我凸郑,道長,這世上最難降的妖魔是什么矛市? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任芙沥,我火速辦了婚禮,結果婚禮上浊吏,老公的妹妹穿的比我還像新娘而昨。我一直安慰自己,他們只是感情好找田,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布歌憨。 她就那樣靜靜地躺著,像睡著了一般墩衙。 火紅的嫁衣襯著肌膚如雪务嫡。 梳的紋絲不亂的頭發(fā)上甲抖,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音心铃,去河邊找鬼准谚。 笑死,一個胖子當著我的面吹牛去扣,可吹牛的內容都是我干的柱衔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼厅篓,長吁一口氣:“原來是場噩夢啊……” “哼秀存!你這毒婦竟也來了?” 一聲冷哼從身側響起羽氮,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惫恼,沒想到半個月后档押,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡祈纯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年令宿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腕窥。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡粒没,死狀恐怖,靈堂內的尸體忽然破棺而出簇爆,到底是詐尸還是另有隱情癞松,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布入蛆,位于F島的核電站响蓉,受9級特大地震影響,放射性物質發(fā)生泄漏哨毁。R本人自食惡果不足惜枫甲,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扼褪。 院中可真熱鬧想幻,春花似錦、人聲如沸话浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凳枝。三九已至抄沮,卻和暖如春跋核,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叛买。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工砂代, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人率挣。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓刻伊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椒功。 傳聞我的和親對象是個殘疾皇子捶箱,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)动漾,斷路器丁屎,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • github地址删豺,歡迎大家提交更新共虑。 express() express()用來創(chuàng)建一個Express的程序。ex...
    Programmer客棧閱讀 2,500評論 0 1
  • loader 是作用于應用中資源文件的轉換行為呀页。它們是函數(shù)(運行在 Node.js 環(huán)境中)妈拌,接收資源文件的源代碼...
    賽亞人之神閱讀 201評論 0 0