构建发布后import下的文件目录及文件名命名规则?

构建发布项目后,import下的文件目录及目录下的文件名命名有什么规则么?在没修改项目任何文件的情况下,重复的构建发布项目,大部分时候生成的目录名、文件名、文件所属目录都不相同,请问官方这有什么规律么,是根据什么规则生成的目录及文件呢?
因为我要做热更新,每次构建发布,由于import下的目录和文件都变了,就要重新生成manifest、部署res和src。如果更新了项目后所有的json文件都改变了,那热更新的时候两个版本的manifest文件上管理的资源文件的名字是不是都对应不上了?

没有变化的场景和资源文件,构建发布后所对应的json文件名是不是应该保持不变?
新增的合并json的功能,是依据什么规则合并的呢?

你好,文件名不同的部分,应该是自动合并的 json,这些 json 的名字是随机生成的。这部分 json 的体积一般不是很大,是否可以当做全新不同资源来进行热更新呢?

我暂时也想不出要叫做什么名字才能在重复构建时保持稳定。这些自动合并的 json 数量是不固定的,难不成要比较两次构建的结果,然后自动匹配最接近的 json 文件……

合并到 json 以后,最终的包名是随机的。

目前的规则是保证所有原始资源,最多只会包含进一个 json 文件,防止增大包体。并且所有用户直接通过 API 能访问到的资源,都单独一个 json 文件。在此基础上,尽量把 json 文件合并到数量最少。

全部更新这个不太好,应该不能接受。

合并之前的文件名也不是固定的吗?

感谢您的详细解答:)

恩,现在项目每次重新打包后,如果有更新,就是更新全部了,根据文件名不同识别为新的资源,md5等于没用上。
重复构建保持目录及文件命名的稳定,可以逐步优化:)

我现在遇到新的问题是,热更新下载了资源到可写路径后,按照官方教程代码是应该先重启,即调用game.restart()方法,看AssetsManagerTest.js中的注释是// Restart the game to make all scripts take effect.,重启的话是可以。
但我不想重启,我想更新成功后,直接切换到另一个场景,报错如下:
Load pack e3f16f1d-c7ea-43e1-8714-47f9d59f70b2 for 56ac4e7d-496b-43de-9162-3fbcd9d55034
ERROR : The asset 56ac4e7d-496b-43de-9162-3fbcd9d55034 is not a scene
在setings.js中可以看到这两个资源id的关系。
为什么不重启的话,就说这个 uuid is not a scene呢?更新之前也都是有场景的,现在只是做了一个资源下载,为什么会影响加载场景了呢?
如果不重启的话,怎么才可以达到同等的效果,可以直接切换场景呢?
ps:主场景之前有个luanch场景,在主场景执行热更新动作,,在主场景中有若干图标,点击后进入不同的场景。

JSON 文件很小的,全部更新也没多少

这里不是要更新合并之前的文件

不重启的话不会重新加载 settings.js,至于为什么报错会是这个我不太清楚。

@panda 大大看看

这个错误ERROR : The asset 56ac4e7d-496b-43de-9162-3fbcd9d55034 is not a scene。
56ac4e7d-496b-43de-9162-3fbcd9d55034是场景的uuid。
打包运行的项目中包含了所有的项目资源,只是初始化时manifest文件中没有包含这些资源,然后我把服务器端的manifest文件提高了一个版本号,这样程序第一次运行时,就检查到有高版本,并将所有资源下载到了可写路径,下载之前和下载之后的settings.js是相同的。
在下载成功后的代码中我关闭了新增searchpath,想让这个逻辑变为下载成功后根据初始化的相关文件切换场景,也还是报这个错误,是不是就可以认为和settings.js无关呢。
错误位置在jsb_polyfill.js中的这段代码,这段代码错误是不是和合并json有关,因为合并之前这个uuid也对应一个json,但合并后没有这个文件了:
_loadSceneByUuid: function(uuid, onLaunched, onUnloaded) {
cc.AssetLibrary.loadAsset(uuid, function(error, sceneAsset) {
var self = cc.director;
self._loadingScene = “”;
var scene;
if (error) {
error = "Failed to load scene: " + error;
cc.error(error);
if (false) {
console.assert(false, error);
}
} else {
scene = sceneAsset.scene;
if (scene instanceof cc.Scene) {
scene._id = sceneAsset._uuid;
self.runScene(scene, onUnloaded, onLaunched);
} else {
error = “The asset " + uuid + " is not a scene”;
cc.error(error);
scene = null;
}
}
if (error && onLaunched) {
onLaunched(error);
}
});
}
@jare @panda

是指哪些json文件呢?
我看了下我现在项目(1.1.1)的library/import的json有1045个文件,9M,压缩完了900K。等游戏做完了,至少会有3~4M吧。

能否提供接口让使用者自定义合并规则?

经过跟踪调试发现如果不热更新的话,scene instanceof cc.Scene判断后,确认sceneAsset.scene是一个场景的实例。

如果热更新成功后,通过sceneAsset.scene得到的scene是一个数组,数组的内容为:0: /Users/*/Library/Developer/CoreSimulator/Devices/B15B6180-8B20-4028-A29D-714FAAD058E1/data/Containers/Data/Application/C2CBDB81-6725-4CD9-B280-026FB5C6094B/Documents/remote-assets/, 1: /Users/*/Library/Developer/CoreSimulator/Devices/B15B6180-8B20-4028-A29D-714FAAD058E1/data/Containers/Data/Application/C2CBDB81-6725-4CD9-B280-026FB5C6094B/Documents/remote-assets/。

可以看出来这个数组的内容是本地的searchPath(通过获得的可写路径拼出来的),两个元素还是重复的, scene被赋值为这个数组是系统的bug么?

为什么走热更新的话,sceneAsset.scene会被赋值为这个数组呢?是cc.AssetLibrary.loadAsset(uuid, function(error, sceneAsset) {这个代码决定了加载后的sceneAsset.scene的类型么?

jsb_polyfiil.js中代码段如下:
_loadSceneByUuid: function(uuid, onLaunched, onUnloaded) {
cc.AssetLibrary.loadAsset(uuid, function(error, sceneAsset) {
var self = cc.director;
self._loadingScene = “”;
var scene;
if (error) {
error = "Failed to load scene: " + error;
cc.error(error);
if (false) {
console.assert(false, error);
}
} else {
scene = sceneAsset.scene;
if (scene instanceof cc.Scene) {
scene.id = sceneAsset.uuid;
self.runScene(scene, onUnloaded, onLaunched);
} else {
error = “The asset " + uuid + " is not a scene”;
cc.error(error);
scene = null;
}
}
if (error && onLaunched) {
onLaunched(error);
}
});
}

请看发布后的版本,那个会小很多。

也不小。

选择cocoscreator的最主要原因就是热更新,请一定要解决。哪怕开放接口让开发者自己来做也行。

@timium 问你发布的是哪个平台?

技术上我们会在探索一下,如果是原生平台,我们会考虑去掉合并 JSON 功能,反正优化不是很明显。如果是 runtime 平台,也不会有这个问题因为不会合并 JSON。
不过我还是要啰嗦下,热更新时的包体不会太大的。因为热更新时,文件名会修改的包体只是合并了 json 后的部分,不是所有 json 的文件名都会改变。而且打包成热更新版本时,import 目录还会包含 spine 和 tmx 等数据,并不完全是 json 文件,所以你这里看到的结果 import.zip 会比较大。

主要是android/ios。 也会有pc的html5

看了下,纯json是406K。
我们的新项目还处于初期,还没开始做热更新。不过根据以前上线的项目经验来看,我们用的amazon的cdn,有些地区的用户下载资源会比较困难。每次更新资源较多较大的时候,都有不少玩家反映下载失败。

嗯,我们会试着在手机原生平台去掉打包 JSON 功能,方便你们做热更新。 H5 平台就不需要考虑热更新问题了吧!

恩呢,h5平台不需要考虑热更新。但h5平台(即web包)保留json合并还是可以提高效率的:)

场景列表是启动时从 Settings.js 中读取的,不重启的话,读不到新的 Settings.js,也就无法得知新场景信息。hack 的方法可能可以,不过没有提供公开的 API