1.creator编辑器扩展实现自动打包 2.Tomcat当静态文件服务器 部署h5项目

烈酒焚心 提交于 2020-12-11 05:42:28

1)操作:选中要打包的文件夹,然后点击编译,则按照一个文件夹为一个工程,进行编译。start是指定的启动场景。

2)将编译好的文件放到Tomcat的webapps目录

3)启动Tomcat

4)访问得到运行结果

5)实现

Administrator@Administrator MINGW64 /e/3_demo/demo_ext/packages (master)        
$ tree                                                                          
.                                                                               
`-- my-build-web-mobile                                                         
    |-- main.js                                                                 
    |-- package.json                                                            

`-- 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"
    }
  }
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!