cocos-creator-multiplayer/examples/layaair/frontend/.laya/publish_layame.js
2021-07-21 23:11:13 +08:00

453 lines
15 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// v1.1.5
const ideModuleDir = global.ideModuleDir;
const workSpaceDir = global.workSpaceDir;
var Stream = require('stream');
//引用插件模块
const gulp = require(ideModuleDir + "gulp");
const fs = require("fs");
const path = require("path");
const del = require(ideModuleDir + "del");
let copyLibsTask = ["copyPlatformLibsJsFile"];
let versiontask = ["version2"];
let exec = require('child_process').exec;
let tsconfigPath = path.join(workSpaceDir, "tsconfig.json");
let isTS = fs.existsSync(tsconfigPath);
let buildOptions = null;
gulp.task("preCreate_LayaMe", copyLibsTask, function() {
releaseDir = global.releaseDir;
config = global.config;
buildOptions = config.buildOptions;
commandSuffix = global.commandSuffix;
});
// 是否build指定部分debug版本layame)
function toBuildPart(part) {
if (!buildOptions) {
return true;
}
if ('all' == part ) {
return buildOptions.type == 'all';
}
if (buildOptions.type == 'all') {
return true;
}
return (buildOptions.buildList.includes(part));
}
function toBuildTs() {
if (!buildOptions) {
return true;
}
return buildOptions.hasScript;
}
gulp.task("del", ["preCreate_LayaMe"], function(cb) {
let buildFolder = path.join(workSpaceDir, "build");
if (!isTS || !fs.existsSync(buildFolder)) {
return cb();
}
let delList = [`${buildFolder}/**`];
del(delList, { force: true }).then(paths => {
cb();
}).catch((err) => {
throw err;
})
});
gulp.task("tsc", ["del"], function(cb) {
if (!isTS) {
return cb();
}
if(!toBuildTs()) {
return cb();
}
console.log('tsconfigPath', tsconfigPath);
let tscPath = path.join(ideModuleDir, ".bin", `tsc${commandSuffix}`);
return exec(` "${tscPath}" -p "${tsconfigPath}"`, {
cwd: workSpaceDir,
shell: true
}, function(error, stdout, stderr) {
let errStr = stderr || '';
if (errStr.indexOf(": node: ") >= 0 || errStr.indexOf("'node'") >= 0) {
// 提示未安装node
console.log("err");
console.log("node not installed");
} else {
if (error) console.log("error", error);
if (stdout) console.log("stdout", stdout);
if (stderr) console.log("stderr", stderr);
cb();
}
});
});
function getFolderList(rootPath, fileList, fileType, deep= 0) {
if (!fs.existsSync(rootPath)) {
return fileList;
}
let dirList = fs.readdirSync(rootPath);
let fileName, fileFullPath;
for (let i = 0, len = dirList.length; i < len; i++) {
fileName = dirList[i];
fileFullPath = path.join(rootPath, fileName);
if (fs.statSync(fileFullPath).isDirectory()) {
getFolderList(fileFullPath, fileList, fileType, deep + 1);
} else {
if (!!fileType && !fileFullPath.endsWith(fileType)) {
continue;
}
fileList.push({path: fileFullPath,deep:deep});
}
}
}
// 把ui里type为view的runtime删除
gulp.task("deletRuntime", ["tsc"], function() {
// const pageUIFolder = path.join(releaseDir, "pageUI");
// let sceneList= [];
// getFolderList(pageUIFolder, sceneList, ".json");
// for (let i = 0, len = sceneList.length; i < len; i++) {
// let filePath = sceneList[i].path;
// let fileCon = fs.readFileSync(filePath, "utf8");
// let jsonData = JSON.parse(fileCon);
// if (jsonData.type == 'View') {
// if (jsonData.props && jsonData.props.runtime) {
// delete jsonData.props.runtime;
// fs.writeFileSync(filePath, JSON.stringify(jsonData), 'utf8');
// }
// }
// }
});
// 将引入的库的路径改为src根目录的LayaMeMain,并且将引入的该类合并到最终发布目录的根目录下的LayaMeMain.js里
function sortJS (a, b) {
return b.c - a.c;
}
function getFInfoByPath(path, list) {
for (let i = 0, len = list.length; i < len; i++) {
let info = list[i];
if (info.path === path) {
return info;
}
}
return null;
}
gulp.task("mergrToLayaMeMain", ["deletRuntime"], function() {
if (!toBuildPart('LayaMeMain')) {
return;
}
let source = "src";
if (isTS) {
source = "build";
}
let sourceFolder = path.join(workSpaceDir, source);
const scriptPath = path.join(sourceFolder, "script");
let jsList= [];
let scriptStrList = [];
let filePath, fileCon, deep;
// 遍历所有的script合并到LayaMeMain.js
jsList= [];
scriptStrList = [];
getFolderList(scriptPath, jsList, ".js");
// sort jsList
let needSort = false;
let sortList = [];
let otherList = [];
for (let i = 0, len = jsList.length; i < len; i++) {
let jsInfo = jsList[i];
filePath = jsInfo.path;
fileCon = fs.readFileSync(filePath, "utf8");
jsInfo.content = fileCon;
let extendsCls = fileCon.match((/\ s*extends \s*(.+?)\{/));
if (extendsCls) {
if (extendsCls[1]) {
extendsCls = extendsCls[1].trim();
if (extendsCls && !extendsCls.includes('.')) { // not include Laya.
let importCls = fileCon.match(`import\\s*[{| ]\\s*${extendsCls}\\s*[}| ]\\s*from (.+?)["']`) ;
// console.log( extendsCls, jsInfo.path, !!importCls );
if (importCls && importCls[1]) {
importCls = importCls[1].trim();
importCls = importCls.substr(1); console.log( importCls);
let deep = jsInfo.deep;
let currPath = null;
let _index = importCls.lastIndexOf('./');
let parenPath = '';
if (_index >= 0) {
let fPath = jsInfo.path;
let _index2 = fPath.indexOf('/') >= 0 ? fPath.lastIndexOf('/') : fPath.lastIndexOf('\\') ;
currPath = fPath.substring(0,_index2);
currPath = path.join(jsInfo.path,parenPath + '../', importCls) + '.js';
jsInfo.extendsCls = extendsCls;// currPath;
// console.log(jsInfo);
needSort = true;
if (!sortList.includes(jsInfo)) {
sortList.push(jsInfo);
}
let importJs = getFInfoByPath(currPath, jsList);
if (!importJs) {
throw new Error('not found', currPath);
}
if (!jsInfo.c) {
jsInfo.c = 0;
}
importJs.c = jsInfo.c + 1;
if (!sortList.includes(importJs)) {
sortList.push(importJs);
}
// console.log(currPath,_index,parenPath, jsInfo.path, importCls, extendsCls);
}
}
}
}
}
// .vs .fs 解析
let fileConTmp = fileCon + '';
let vsOrfsImport = fileConTmp.match(/import \s*(.+?) from \s*(.+?).[fv]s['"]/);
while (vsOrfsImport) {
let importVar = vsOrfsImport[1];
let filetype = vsOrfsImport[0];
let importFile = vsOrfsImport[2];
importFile = importFile.replace("'", '');
importFile = importFile.replace('"', '');
if (filetype.indexOf('.vs') >= 0) {
filetype = '.vs';
} else {
filetype = '.fs';
}
importFile = importFile + filetype;
let importFilePath = path.join(filePath,'../',importFile );
console.log('importFilePath', importFilePath);
fileConTmp = fileConTmp.replace(vsOrfsImport[0], '');
// console.log('fileConTmp', fileConTmp);
vsOrfsImport = fileConTmp.match(/import \s*(.+?) from \s*(.+?).[fv]s['"]/);
let srcPath = path.join(workSpaceDir, 'src');
importFilePath = importFilePath.replace(sourceFolder, srcPath);
let importFileStr = fs.readFileSync(importFilePath, 'utf8');
importFileStr = importFileStr.replace(/\r?\n/gm, '\\n');
importFileStr = importFileStr.replace(/"/gm,'\'');
importFileStr = importFileStr.replace(/\t/gm,'\\t');
importFileStr = importFileStr.replace(/\\n\s*/g,'\\n');
importFileStr = importFileStr.replace(/\\n\\n/g,'\\n');
// let lineList = importFileStr.split('\n');
// let rStr = '';
// for(let i = 0,len = lineList.length; i < len; i ++) {
// let lineStr = lineList[i];
// lineStr = lineStr.replace(/\r?\n/gm, '\\n');
// lineStr = lineStr.replace(/"/gm,'\\"');
// lineStr = lineStr.replace(/\t/gm,'\\t');
// lineStr = lineStr.trim();
// rStr = rStr + lineStr + '\\n';
// }
// // fs.writeFileSync(importFilePath + '2',rStr.replace(/\\n/gm,'\n'), 'utf8');
jsInfo.content = `var ${importVar} = "${importFileStr}";\n` + jsInfo.content;
}
}
// console.log('ssssssssss',sortList);
if (needSort) {
sortList.sort(sortJS);
for (let i = 0, len = sortList.length; i < len; i++) {
let jsInfo = sortList[i];
scriptStrList.push(jsInfo.content);
}
}
for (let i = 0, len = jsList.length; i < len; i++) {
let jsInfo = jsList[i];
if (!needSort || !sortList.includes(jsInfo)) {
scriptStrList.push(jsInfo.content);
}
}
let layaMeMainStr = '';
const layaMeMainPath = path.join(sourceFolder, "LayaMeMain.js");
if (fs.existsSync(layaMeMainPath)) {
layaMeMainStr = fs.readFileSync(layaMeMainPath, "utf8");
}
if (scriptStrList.length > 0) {
let scriptStrAll = scriptStrList.join('\n');
layaMeMainStr = scriptStrAll + layaMeMainStr;
}
if (layaMeMainStr) {
// console.log(jsList.length,'layaMeMainStr' , layaMeMainStr);
layaMeMainStr = layaMeMainStr.replace(/import/mg, "// import");
// 去掉class前面的字符
layaMeMainStr = layaMeMainStr.replace(/export\s+default\s+[class\.]+\s*/mg, "class ");
layaMeMainStr = layaMeMainStr.replace(/export\s+[class\.]+\s*/mg, "class ");
fs.writeFileSync(`${releaseDir}/LayaMeMain.js`, layaMeMainStr, "utf8");
}
});
// 修改extends Laya.Script3D 为 extends GameScript
// 修改 config.json把.ts替换为.js
function commentImport (str){
str = str.replace(/import/mg, "// import");
return str;
}
function changeComponentsFile() {
var stream = new Stream.Transform({ objectMode: true });
let source = "src";
if (isTS) {
source = "build";
}
let sourceFolder = path.join(workSpaceDir, source);
const scriptPath = path.join(sourceFolder, "script");
const componentsPath = path.join(sourceFolder, "components");
const actionScriptPath = path.join(sourceFolder, "actionScript", "actionFunc.js");
const uiScriptPath = path.join(sourceFolder, "uiScript");
let importPathList = [scriptPath, componentsPath, actionScriptPath, uiScriptPath];
stream._transform = function (originalFile, unused, callback) {
let fPath = originalFile.path;
// throw new Error();
let file = null;
const getFile = () => {
if (!file) {
file = originalFile.clone({ contents: false });
}
return file;
}
// console.log('fPth', fPath, componentsPath);
// 注释import
for(let k =0; k <importPathList.length; k ++) {
let _path = importPathList[k];
if (fPath.startsWith(_path)) {
file = getFile();
let stringData = String(file.contents);
stringData = commentImport(stringData);
let finalBinaryData = Buffer.from(stringData);
file.contents = finalBinaryData;
}
}
if (fPath.indexOf('components') >= 0) {
if ( fPath.endsWith('.js')) {
file = getFile();
let stringData = String(file.contents);
stringData = stringData.replace(/extends\s+[Laya.Script3D\.]+\s*{/mg, "extends GameScript {");
let finalBinaryData = Buffer.from(stringData);
file.contents = finalBinaryData;
} else if (fPath.endsWith('config.json')) {
file = getFile();
let stringData = String(file.contents);
stringData = stringData.replace(/.ts\"/mg, '.js"');
let finalBinaryData = Buffer.from(stringData);
file.contents = finalBinaryData;
}
}
// 去掉class前面的字符
if (fPath.endsWith('.js')) {
file = getFile();
let stringData = String(file.contents);
stringData = stringData.replace(/export\s+default\s+[class\.]+\s*/mg, "class ");
stringData = stringData.replace(/export\s+[class\.]+\s*/mg, "class ");
let finalBinaryData = Buffer.from(stringData);
file.contents = finalBinaryData;
}
if (file) {
callback(null, file);
} else {
callback(null, originalFile);
}
};
return stream;
}
gulp.task("genPreloadMap", ["mergrToLayaMeMain"], function() {
let atlasList = [];
getFolderList(releaseDir,atlasList, '.atlas');
let preloadJson = {
atlas: [],
atlasPng:[],
textures: []
};
let releaseDirTmp = releaseDir.replace(/\\/g, '/');
for(let i = 0,len = atlasList.length; i < len; i ++) {
let file = atlasList[i].path;
file = file.replace(/\\/g, '/');
file = file.replace(releaseDirTmp, '');
file = file.replace('/', '');
preloadJson.atlas.push(file);
preloadJson.atlasPng.push( file.replace('.atlas', '.png'));
}
let texturesList = [];
let texturesDir = path.join(releaseDir, 'textures');
getFolderList(texturesDir,texturesList, '.png');
getFolderList(texturesDir,texturesList, '.jpg');
getFolderList(texturesDir,texturesList, '.jpeg');
let texturesDirTmp = releaseDir.replace(/\\/g, '/');
for(let i = 0,len = texturesList.length; i < len; i ++) {
let file = texturesList[i].path;
file = file.replace(/\\/g, '/');
file = file.replace(texturesDirTmp, '');
file = file.replace('/', '');
preloadJson.textures.push(file);
}
fs.writeFileSync(path.join(releaseDir, 'preload.json'), JSON.stringify(preloadJson, null ,4), 'utf8');
// console.log('atlasList', preloadJson);
});
gulp.task("copy", ["genPreloadMap"], function() {
let source = "src";
if (isTS) {
source = "build";
}
let sourceFolder = path.join(workSpaceDir, source);
let layameInfo = config.layameInfo;
let filter1list = [];
if (toBuildPart('uiScript')) {
filter1list.push('uiScript/**/*.*');
}
if (toBuildPart('actionScript')) {
filter1list.push('actionScript/**/*.*');
}
if (toBuildPart('components')) {
filter1list.push('components/**/*.*');
}
let filter1 = ``;
if (filter1list.length > 1) {
filter1 = `${sourceFolder}/{`;
filter1 += filter1list.join(',');
filter1 += '}';
} else if (filter1list.length == 1) {
filter1 = `${sourceFolder}/{,`;
filter1 += filter1list[0];
filter1 += '}';
} else {
return;
}
let filters = [filter1];
// console.log('filter1', filter1);throw new Error();
if (isTS) {
let filter2 = `${workSpaceDir}/src/{,`;
let filter2list =[];
if (toBuildPart('uiScript')) {
filter2list.push('uiScript/**/!(*.ts)');
}
if (toBuildPart('actionScript')) {
filter2list.push('actionScript/**/!(*.ts)');
}
if (toBuildPart('components')) {
filter2list.push('components/**/!(*.ts)');
}
if (filter2list.length > 1) {
filter2 += filter2list.join(',');
} else if (filter2list.length == 1) {
filter2 += filter2list[0];
}
filter2 += '}';
filters.push(
filter2
);
}
return gulp.src(filters)
.pipe(changeComponentsFile())
.pipe(gulp.dest(releaseDir));
});
gulp.task("buildLayaMeProj", versiontask, function() {
console.log("all tasks completed");
});