一、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下面。
這樣會出現(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里……
所以我們不能在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();
}
}