453 lines
15 KiB
JavaScript
453 lines
15 KiB
JavaScript
// 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");
|
||
}); |