优化热更插件.
This commit is contained in:
parent
3106b54566
commit
2282ce8881
@ -156,8 +156,8 @@
|
|||||||
],
|
],
|
||||||
"_srcBlendFactor": 770,
|
"_srcBlendFactor": 770,
|
||||||
"_dstBlendFactor": 771,
|
"_dstBlendFactor": 771,
|
||||||
"_string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V3",
|
"_string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V4",
|
||||||
"_N$string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V3",
|
"_N$string": "这是Bundle2,修改此bundle 并上传更新包,然后运行查看效果.\n当前版本V4",
|
||||||
"_fontSize": 60,
|
"_fontSize": 60,
|
||||||
"_lineHeight": 60,
|
"_lineHeight": 60,
|
||||||
"_enableWrapText": true,
|
"_enableWrapText": true,
|
||||||
|
@ -180,7 +180,7 @@
|
|||||||
"array": [
|
"array": [
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
533.7828766106993,
|
535.5690540060046,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
@ -795,8 +795,8 @@
|
|||||||
],
|
],
|
||||||
"_srcBlendFactor": 770,
|
"_srcBlendFactor": 770,
|
||||||
"_dstBlendFactor": 771,
|
"_dstBlendFactor": 771,
|
||||||
"_string": "当前为新版本:V3",
|
"_string": "当前为新版本:V4",
|
||||||
"_N$string": "当前为新版本:V3",
|
"_N$string": "当前为新版本:V4",
|
||||||
"_fontSize": 40,
|
"_fontSize": 40,
|
||||||
"_lineHeight": 40,
|
"_lineHeight": 40,
|
||||||
"_enableWrapText": true,
|
"_enableWrapText": true,
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"versionCfg": {
|
"versionCfg": {
|
||||||
"versionCode": "3",
|
"versionCode": "4",
|
||||||
"versionName": "1.0.2",
|
"versionName": "1.0.3",
|
||||||
"versionType": "dev",
|
"versionType": "dev",
|
||||||
"versionLog": "adfadsfdsfdsfsdf",
|
"versionLog": "测试V4发布版本",
|
||||||
"baseUrl": "https://cdn-awdxc.8zy.com/"
|
"baseUrl": "https://cdn-awdxc.8zy.com/"
|
||||||
},
|
},
|
||||||
"ftpCfg": {
|
"ftpCfg": {
|
||||||
@ -12,6 +12,7 @@
|
|||||||
"user": "cos1",
|
"user": "cos1",
|
||||||
"password": "dkJrWrVy11",
|
"password": "dkJrWrVy11",
|
||||||
"rootPath": "temp001/",
|
"rootPath": "temp001/",
|
||||||
"keepalive": 100000
|
"keepalive": 100000,
|
||||||
|
"maxThread": "10"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -8,12 +8,23 @@ class FileUploader {
|
|||||||
maxClients = 3;
|
maxClients = 3;
|
||||||
options = {};
|
options = {};
|
||||||
queue = [];
|
queue = [];
|
||||||
|
idleCallback = null;
|
||||||
|
loopId = 0;
|
||||||
|
lastIdleState = true;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.loopId = setInterval(this.loop.bind(this), 200);
|
||||||
|
}
|
||||||
|
|
||||||
setOption(options, maxThread) {
|
setOption(options, maxThread) {
|
||||||
this.options = options;
|
this.options = options;
|
||||||
this.maxClients = maxThread || 1;
|
this.maxClients = maxThread || 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setStateListener(callback) {
|
||||||
|
this.idleCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
prepare() {
|
prepare() {
|
||||||
const currLen = Object.keys(this.ftps).length;
|
const currLen = Object.keys(this.ftps).length;
|
||||||
logger.info('准备创建上传线程:', this.maxClients, currLen);
|
logger.info('准备创建上传线程:', this.maxClients, currLen);
|
||||||
@ -30,6 +41,28 @@ class FileUploader {
|
|||||||
this.ftps[id].destroy();
|
this.ftps[id].destroy();
|
||||||
delete this.ftps[id];
|
delete this.ftps[id];
|
||||||
}
|
}
|
||||||
|
if (this.loopId) {
|
||||||
|
clearInterval(this.loopId)
|
||||||
|
this.loopId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// event loop.
|
||||||
|
loop() {
|
||||||
|
const curState = this.checkState();
|
||||||
|
if (curState != this.lastIdleState) {
|
||||||
|
this.lastIdleState = curState;
|
||||||
|
this.idleCallback && this.idleCallback(curState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkState() {
|
||||||
|
let idleState = true;
|
||||||
|
for (let i in this.ftps) {
|
||||||
|
idleState = idleState && this.ftps[i].idleState;
|
||||||
|
if (!idleState) break;
|
||||||
|
}
|
||||||
|
return idleState;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,6 +104,7 @@ class UploadThread {
|
|||||||
ready = false;
|
ready = false;
|
||||||
stopped = false;
|
stopped = false;
|
||||||
options = null;
|
options = null;
|
||||||
|
idleState = true;
|
||||||
|
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
this.options = options;
|
this.options = options;
|
||||||
@ -89,19 +123,15 @@ class UploadThread {
|
|||||||
this.ready = false;
|
this.ready = false;
|
||||||
const ftp = new Client();
|
const ftp = new Client();
|
||||||
ftp.on('ready', () => {
|
ftp.on('ready', () => {
|
||||||
logger.log('ftp ready');
|
|
||||||
this.ready = true;
|
this.ready = true;
|
||||||
});
|
});
|
||||||
ftp.on('close', () => {
|
ftp.on('close', () => {
|
||||||
logger.log('ftp client has close');
|
|
||||||
this.ready = false;
|
this.ready = false;
|
||||||
});
|
});
|
||||||
ftp.on('end', () => {
|
ftp.on('end', () => {
|
||||||
logger.log('ftp client has end');
|
|
||||||
this.ready = false;
|
this.ready = false;
|
||||||
});
|
});
|
||||||
ftp.on('error', (err) => {
|
ftp.on('error', (err) => {
|
||||||
logger.log('ftp client has an error : ', JSON.stringify(err));
|
|
||||||
this.ready = false;
|
this.ready = false;
|
||||||
});
|
});
|
||||||
ftp.connect(this.options);
|
ftp.connect(this.options);
|
||||||
@ -123,8 +153,10 @@ class UploadThread {
|
|||||||
while (!this.stopped) {
|
while (!this.stopped) {
|
||||||
if (!this.ready || this.queue.length <= 0) {
|
if (!this.ready || this.queue.length <= 0) {
|
||||||
await this.sleep(500);
|
await this.sleep(500);
|
||||||
|
this.idleState = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
this.idleState = false;
|
||||||
const once = this.queue[0];
|
const once = this.queue[0];
|
||||||
const err = await this.uploadOnce(this.ftp, once);
|
const err = await this.uploadOnce(this.ftp, once);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
|
@ -63,10 +63,25 @@ module.exports = {
|
|||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
Editor.url('packages://update-manager/.settings.conf'), JSON.stringify({}, null, 2), 'utf-8');
|
Editor.url('packages://update-manager/.settings.conf'), JSON.stringify({}, null, 2), 'utf-8');
|
||||||
}
|
}
|
||||||
|
if (!this.ftp) {
|
||||||
|
this.ftp = FileUpload();
|
||||||
|
}
|
||||||
|
this.ftp.setStateListener(this.onUploadStateChange.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
|
onUploadStateChange(state) {
|
||||||
|
if (!state) {
|
||||||
|
Editor.info('开始上传更新包');
|
||||||
|
} else {
|
||||||
|
Editor.success('所有文件上传完成!');
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
unload() {
|
unload() {
|
||||||
Editor.Builder.removeListener('build-finished', doMakeUpdatePackage);
|
Editor.Builder.removeListener('build-finished', doMakeUpdatePackage);
|
||||||
|
if (this.ftp) {
|
||||||
|
this.ftp.destroy();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
messages: {
|
messages: {
|
||||||
'open'() {
|
'open'() {
|
||||||
@ -74,12 +89,12 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
'upload'(event, dir, dst, options) {
|
'upload'(event, dir, dst, options) {
|
||||||
logger.info('upload....');
|
logger.info('upload....');
|
||||||
if (!this.ftp) {
|
|
||||||
this.ftp = FileUpload();
|
|
||||||
}
|
|
||||||
this.ftp.setOption(options, options.maxThread);
|
this.ftp.setOption(options, options.maxThread);
|
||||||
this.ftp.upload(dir, dst);
|
this.ftp.upload(dir, dst);
|
||||||
},
|
},
|
||||||
|
'getProjectPath'(event) {
|
||||||
|
event.reply(Editor.Project.path);
|
||||||
|
},
|
||||||
'uploadStop'() {
|
'uploadStop'() {
|
||||||
if (this.ftp) {
|
if (this.ftp) {
|
||||||
this.ftp.destroy();
|
this.ftp.destroy();
|
||||||
|
@ -56,11 +56,11 @@
|
|||||||
<el-form ref="ftpCfg" :model="ftpCfg" label-width="100px">
|
<el-form ref="ftpCfg" :model="ftpCfg" label-width="100px">
|
||||||
<el-tooltip effect="dark" :content="tip.ip" placement="top" open-delay=500>
|
<el-tooltip effect="dark" :content="tip.ip" placement="top" open-delay=500>
|
||||||
<el-form-item label="IP:">
|
<el-form-item label="IP:">
|
||||||
<el-col :span="18">
|
<el-col :span="15">
|
||||||
<el-input type="text" v-model="ftpCfg.host" placeholder="127.0.0.1"></el-input>
|
<el-input type="text" v-model="ftpCfg.host" placeholder="127.0.0.1"></el-input>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col class="line" :span="2">-</el-col>
|
<el-col class="line" :span="1">-</el-col>
|
||||||
<el-col :span="4">
|
<el-col :span="6">
|
||||||
<el-input type="number" v-model="ftpCfg.port" placeholder="端口号"></el-input>
|
<el-input type="number" v-model="ftpCfg.port" placeholder="端口号"></el-input>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -68,16 +68,16 @@
|
|||||||
|
|
||||||
<el-tooltip effect="dark" :content="tip.user" open-delay=500 placement="top">
|
<el-tooltip effect="dark" :content="tip.user" open-delay=500 placement="top">
|
||||||
<el-form-item label="登录帐号:">
|
<el-form-item label="登录帐号:">
|
||||||
<el-col :span="11">
|
<el-col :span="12">
|
||||||
<el-input type="text" v-model="ftpCfg.user" placeholder="登录帐号"></el-input>
|
<el-input type="text" v-model="ftpCfg.user" placeholder="登录帐号"></el-input>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col class="line" :span="2">-</el-col>
|
<el-col class="line" :span="1">-</el-col>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-input type="password" v-model="ftpCfg.password" placeholder="密码"></el-input>
|
<el-input type="password" v-model="ftpCfg.password" placeholder="密码"></el-input>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip effect="dark" content="FTP长连接持续心跳时间" open-delay=500 placement="top">
|
<el-tooltip effect="dark" content="FTP长连接持续心跳时间,一般情况下忽略此选项" open-delay=500 placement="top">
|
||||||
<el-form-item label="KeepAlive:">
|
<el-form-item label="KeepAlive:">
|
||||||
<el-input type="number" v-model="ftpCfg.keepalive" placeholder="10000"></el-input>
|
<el-input type="number" v-model="ftpCfg.keepalive" placeholder="10000"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -85,7 +85,7 @@
|
|||||||
<el-tooltip effect="dark" content="FTP同时上传文件数,数量越大,上传效率越高<br/>受限于带宽性能,并非越大越好,推荐5~10" open-delay=500
|
<el-tooltip effect="dark" content="FTP同时上传文件数,数量越大,上传效率越高<br/>受限于带宽性能,并非越大越好,推荐5~10" open-delay=500
|
||||||
placement="top">
|
placement="top">
|
||||||
<el-form-item label="并发数量:">
|
<el-form-item label="并发数量:">
|
||||||
<el-input type="number" v-model="ftpCfg.maxThread" placeholder="5"></el-input>
|
<el-input type="number" v-model="ftpCfg.maxThread" placeholder="同时上传文件数"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip effect="dark" :content="tip.rootPath" open-delay=500 placement="top">
|
<el-tooltip effect="dark" :content="tip.rootPath" open-delay=500 placement="top">
|
||||||
@ -114,7 +114,8 @@
|
|||||||
<el-step title="版本配置"
|
<el-step title="版本配置"
|
||||||
description="使用前需要先配置版本信息,并点击保存配置."></el-step>
|
description="使用前需要先配置版本信息,并点击保存配置."></el-step>
|
||||||
<el-step title="构建版本"
|
<el-step title="构建版本"
|
||||||
description="开始构建版本,构建完成后会在构建目录中生成remote文件夹以及update-dev.json更新描述文件"></el-step>
|
description="开始构建版本,构建完成后会在构建目录中生成remote文件夹以及update-dev.json更新描述文件
|
||||||
|
注:不需要设置Bundle为远程包,插件将自动调整远程包设置"></el-step>
|
||||||
<el-step title="上传更新包"
|
<el-step title="上传更新包"
|
||||||
description="构建完成时,如需发布新版本,则需要点击[上传更新包],更新包会向游戏代码中注入热更逻辑."></el-step>
|
description="构建完成时,如需发布新版本,则需要点击[上传更新包],更新包会向游戏代码中注入热更逻辑."></el-step>
|
||||||
</el-steps>
|
</el-steps>
|
||||||
@ -142,6 +143,7 @@
|
|||||||
<script>
|
<script>
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
new Vue({
|
new Vue({
|
||||||
el: '#app',
|
el: '#app',
|
||||||
data() {
|
data() {
|
||||||
@ -163,7 +165,7 @@
|
|||||||
rootPath: "",
|
rootPath: "",
|
||||||
keepalive: 100000,
|
keepalive: 100000,
|
||||||
onlyJson: false,
|
onlyJson: false,
|
||||||
maxThread: 5
|
maxThread: 1
|
||||||
},
|
},
|
||||||
tip: {
|
tip: {
|
||||||
versionCode: "递增版本号,如果与旧版本号相同,则会替换线上版本包.",
|
versionCode: "递增版本号,如果与旧版本号相同,则会替换线上版本包.",
|
||||||
@ -184,10 +186,11 @@
|
|||||||
if (data) {
|
if (data) {
|
||||||
Object.assign(this, JSON.parse(data));
|
Object.assign(this, JSON.parse(data));
|
||||||
}
|
}
|
||||||
|
//Bugfix: simple类型的面板无法在渲染进程中拿到项目路径.
|
||||||
this.projectPath = Editor.url('packages://update-manager');
|
const self = this;
|
||||||
this.projectPath = this.projectPath.substring(0, this.projectPath.length - 'packages/update-manager'.length)
|
Editor.Ipc.sendToMain('update-manager:getProjectPath', function (arg) {
|
||||||
Editor.log('当前项目路径:', this.projectPath);
|
self.projectPath = arg;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@ -261,6 +264,6 @@
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
</script>
|
</script>
|
||||||
</html>
|
</html>
|
Loading…
Reference in New Issue
Block a user