[LayaAirIDE 1.0]使用IDE发布小游戏时,启用了版本管理会导致使用 Laya.MiniAdpter.nativefiles 定义的本地资源文件无法加载

问题描述:
使用 IDE 发布小游戏时,若勾选了版本控制,IDE 会将所有代码及资源文件重新命名。
在代码中使用原始文件名引用资源文件,从网络加载资源时,引擎会先从<资源版本清单文件>中查找该原始文件名对应的新文件名,再用新文件名去访问资源文件。
但如果使用 Laya.MiniAdpter.nativefiles 设置了本地资源,加载本地资源文件时,引擎会忽略<资源版本清单文件>,直接用原始文件名访问资源文件,导致本地资源无法成功加载。
 
比如,发布小游戏时,勾选了版本控制,并且使用了如下代码:
        Laya.MiniAdpter.nativefiles = [
"res/atlas/launch.atlas",
"res/atlas/launch.png"
];
这将导致 launch.atlas 和 launch.png 皆无法成功加载。
 
目前我解决这个问题的办法有两个:
 
第一个办法:使用 IDE 发布小游戏之后,将涉及到的本地资源文件手动重命名为原始文件名。此方法简单有效,但每次重新发布小游戏都必须手动重命名,过程比较繁琐,虽然可以写脚本自动重命名,但如果涉及到的本地资源列表发生变化,脚本文件也必须随之变化。因此治标不治本。
 
第二个办法:修改引擎代码文件 libs/laya.wxmini.js,1.8.0beta 版本的引擎代码文件 libs/laya.wxmini.js,需修改的地方有如下几处:
 
1、在第8行下面添加对 laya.net.ResourceVersion 的引用:
    var ResourceVersion = laya.net.ResourceVersion;

 2、第330-336行,将
    MiniFileMgr.isLocalNativeFile=function(url){
for(var i=0,sz=MiniAdpter.nativefiles.length;i<sz;i++){
if(url.indexOf(MiniAdpter.nativefiles)!=-1)
return true;
}
return false;
}
修改为:
    MiniFileMgr.isLocalNativeFile=function(url){
for(var i=0,sz=MiniAdpter.nativefiles.length;i<sz;i++){
if(url.indexOf(MiniAdpter.nativefiles)!=-1)
return true;
}
// 白珞琰 于 2018.08.07 00:55 修改
if (ResourceVersion.manifest && !MiniAdpter.nativefiles_prefix) {
MiniAdpter.nativefiles_prefix = [];
for(let j=0,sz=MiniAdpter.nativefiles.length;j<sz;j++){
let u = MiniAdpter.nativefiles[j];
MiniAdpter.nativefiles_prefix.push(ResourceVersion.addVersionPrefix(u));
}
}
if (MiniAdpter.nativefiles_prefix) {
for(let k=0,sz=MiniAdpter.nativefiles_prefix.length;k<sz;k++){
if(url.indexOf(MiniAdpter.nativefiles_prefix[k])!=-1)
return true;
}
}
return false;
}

 3、第692-704行,将
        if (!MiniFileMgr.getFileInfo(url)){
if (url.indexOf("http://";)!=-1 || url.indexOf("https://";)!=-1){
if(MiniAdpter.isZiYu){
MiniImage.onCreateImage(url,thisLoader,true);
}else{
MiniFileMgr.downOtherFiles(url,new Handler(MiniImage,MiniImage.onDownImgCallBack,[url,thisLoader]),url);
}
}
else
MiniImage.onCreateImage(url,thisLoader,true);
}else {
MiniImage.onCreateImage(url,thisLoader,!isTransformUrl);
}
修改为:
        if (!MiniFileMgr.getFileInfo(url)){
if (url.indexOf("http://";)!=-1 || url.indexOf("https://";)!=-1){
if(MiniAdpter.isZiYu){
MiniImage.onCreateImage(url,thisLoader,true);
}else{
MiniFileMgr.downOtherFiles(url,new Handler(MiniImage,MiniImage.onDownImgCallBack,[url,thisLoader]),url);
}
}
else{
// 白珞琰 于 2018.08.07 00:55 修改
let real_url = ResourceVersion.addVersionPrefix(url);
MiniImage.onCreateImage(real_url,thisLoader,true);
}
}else {
// 白珞琰 于 2018.08.07 00:55 修改
let real_url = ResourceVersion.addVersionPrefix(url);
MiniImage.onCreateImage(real_url,thisLoader,!isTransformUrl);
}

 4、第1138-1157行,将
                if (MiniFileMgr.isLocalNativeFile(url)){
if (MiniAdpter.subNativeFiles && MiniAdpter.subNativeheads.length==0){
for (var key in MiniAdpter.subNativeFiles){
var tempArr=MiniAdpter.subNativeFiles[key];
MiniAdpter.subNativeheads=MiniAdpter.subNativeheads.concat(tempArr);
for (var aa=0;aa < tempArr.length;aa++){
MiniAdpter.subMaps[tempArr[aa]]=key+"/"+tempArr[aa];
}
}
}
if(MiniAdpter.subNativeFiles && url.indexOf("/")!=-1){
var curfileHead=url.split("/")[0]+"/";
if(curfileHead && MiniAdpter.subNativeheads.indexOf(curfileHead)!=-1){
var newfileHead=MiniAdpter.subMaps[curfileHead];
url=url.replace(curfileHead,newfileHead);
}
}
MiniFileMgr.read(url,encoding,new Handler(MiniLoader,MiniLoader.onReadNativeCallBack,[encoding,url,type,cache,group,ignoreCache,thisLoader]));
return;
};
修改为:
                if (MiniFileMgr.isLocalNativeFile(url)){
if (MiniAdpter.subNativeFiles && MiniAdpter.subNativeheads.length==0){
for (var key in MiniAdpter.subNativeFiles){
var tempArr=MiniAdpter.subNativeFiles[key];
MiniAdpter.subNativeheads=MiniAdpter.subNativeheads.concat(tempArr);
for (var aa=0;aa < tempArr.length;aa++){
MiniAdpter.subMaps[tempArr[aa]]=key+"/"+tempArr[aa];
}
}
}
if(MiniAdpter.subNativeFiles && url.indexOf("/")!=-1){
var curfileHead=url.split("/")[0]+"/";
if(curfileHead && MiniAdpter.subNativeheads.indexOf(curfileHead)!=-1){
var newfileHead=MiniAdpter.subMaps[curfileHead];
url=url.replace(curfileHead,newfileHead);
}
}
// 白珞琰 于 2018.08.07 00:55 修改
let real_url = ResourceVersion.addVersionPrefix(url);
MiniFileMgr.read(real_url,encoding,new Handler(MiniLoader,MiniLoader.onReadNativeCallBack,[encoding,url,type,cache,group,ignoreCache,thisLoader]));
return;
};

经过以上修改,以后再发布小游戏时,启用了版本控制,亦无需再手动重命名本地文件,也可以正常访问本地文件。
 
发布百度小游戏时也遇到同样的问题,需在 libs/laya.bdmini.js 文件中找到类似的地方修改。
 
第二种办法可以在根上解决问题,但我并未做过深度测试,不知道这样修改之后会不会有其他问题,并且如果更新了引擎库,对应的 laya.wxmini.js 和 laya.bdmini.js 等文件都会被恢复成引擎的原始文件,需再次修改。由于引擎并未提供配套的压缩混淆引擎代码的脚本,这两个文件也不能压缩混淆,只能使用原始代码。
 
现希望官方团队能将这个问题彻底解决。
 
另外,1.x 版本的 IDE 内置的压缩混淆代码的工具是 UglifyJS,不支持 es6 规范的代码压缩混淆,是否可以考虑将该工具替换为 UglifyJS-es呢?
 
 
 
 
 
 
已邀请:

麟。

赞同来自:

我也遇到了同样的问题
我觉得还可以有个第三种办法,发布工具的版本管理增加个文件或文件夹过滤功能。
希望官方能彻底解决这个问题

吉日-jerry

赞同来自:

@官方人员 我也遇到了同样的问题,麻烦尽快解决哈

要回复问题请先

商务合作
商务合作