1)操作:选中要打包的文件夹,然后点击编译,则按照一个文件夹为一个工程,进行编译。start是指定的启动场景。
2)将编译好的文件放到Tomcat的webapps目录
3)启动Tomcat
4)访问得到运行结果
5)实现
|
`-- my-build-web-mobile
|-- main.js
let buildUtils = require(Editor.url("app://editor/share/build-utils"));
const {shell} = require('electron');
// 可以删除文件夹
let fs = require("fs-extra");
let path = require("path");
/**
* 思考:
1.如何实现的一个个编译
2.为何是scenes,而不是excludeScenes
3.哪里实现的重命名
*/
function onBuildFinished(options, callback) {
// 开始场景决定文件夹的名字
let dir_path = Editor.assetdb._uuid2path[options.startScene];
Editor.warn("onBuildFinished:", dir_path);
let startIndex = dir_path.lastIndexOf('\\');
let endIndex = dir_path.lastIndexOf("_start.fire");
// 文件夹名字
let dstFileName = dir_path.substr(startIndex + 1, endIndex - startIndex - 1);
let dstFilePath = path.join(options.buildPath, dstFileName);
// 文件已存在就删除
if (fs.existsSync(dstFilePath)) {
fs.removeSync(dstFilePath);
}
// 将编译结果重命名
fs.renameSync(options.dest, dstFilePath);
// 递归构建下一个
Editor.Ipc.sendToMain("my-build-web-mobile:Build");
callback();
}
module.exports = {
load() {
Editor.Builder.on("build-finished", onBuildFinished);
},
unload() {
Editor.Builder.removeListener("build-finished", onBuildFinished);
},
/**
* 通过选中的文件夹得到编译的场景信息
* @param dir_path
* @returns {*}
*/
prepareOptionByFolder(dir_path) {
// 读取文件夹下的文件信息,场景名字
// 是一个数组 xx.fire xx.meta
let files = fs.readdirSync(dir_path);
// 选择的场景名字的信息
let selectScenes = [];
// 开始场景的uuid
let startSceneUuid = "";
for (let i = 0; i < files.length; i++) {
let fs_path = files[i];
//发现一个场景
if (fs_path.indexOf(".meta") > -1) {
// 将读取到的meta文件反序列化为obj对象,从而得到场景的uuid
let obj = JSON.parse(fs.readFileSync(path.join(dir_path, fs_path)))
selectScenes.push(obj.uuid);
if (fs_path.indexOf("start") > -1) {
startSceneUuid = obj.uuid;
}
}
}
// 准备编译信息
let option = buildUtils.getOptions();
option.startScene = startSceneUuid; // 开始场景
option.scenes = selectScenes; // 编译的场景. 但是这个变量没有
option.md5Cache = true;
option.platform = "web-mobile";
return option;
},
messages: {
// 真正的编译
"Build"() {
if (this.buildOptions.length > 0) {
// 取出一个编译任务
let i = this.buildOptions.shift();
// 通过Ipc方式构建
Editor.Ipc.sendToMain("builder:start-task", "build", i);
// 记录下来最后一个文件的路径,编译完毕后打开文件夹
this.buildPath = i.buildPath;
} else {
if (this.buildPath) {
let path = buildUtils.getAbsoluteBuildPath(this.buildPath);
shell.openItem(path);
}
Editor.success("all finish!");
}
},
// 准备编译信息
"MyBuild-Game"() {
this.buildOptions = [];
// 得到选中的所有 文件和者文件夹的uuid
// 这是一个数组
let uuids = Editor.Selection.curSelection("asset");
if (uuids.length == 0) {
Editor.error("please select at lease one folder!");
return;
}
for (let i = 0; i < uuids.length; i++) {
let uuid = uuids[i];
// 通过uuid获选中的路径
let dir_path = Editor.assetdb._uuid2path[uuid];
let stat = fs.statSync(dir_path, {bigint: false});
// 必须选中所有的都是文件夹
if (!stat.isDirectory()) {
Editor.error(dir_path, "is not a folder!");
return;
}
// 以选中的一级文件夹为单位准备编译信息
this.buildOptions.push(this.prepareOptionByFolder(dir_path));
}
Editor.Ipc.sendToMain("my-build-web-mobile:Build");
}
}
};
|-- package.json
{
"name": "my-build-web-mobile",
"version": "1.0.0",
"main": "main.js",
"main-menu": {
"MyPackages/MyBuild": {
"message": "my-build-web-mobile:MyBuild-Game"
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4273344/blog/4789892