crootfast
Version:
大前端工程化命令行脚手架
143 lines (129 loc) • 4.08 kB
JavaScript
const { exec } = require('child_process');
const fs = require('fs');
const os = require('os');
const path = require('path');
const colors = require('colors');
const shelljs = require('shelljs');
const { changePermissions } = require('../common/utils/file');
const { getclipath, pathJoin, getpropath } = require('../common/utils/path');
// const { shelljsChildProcessSpawn } = require('../common/utils');
function commandLoggerError(...content) {
console.error(colors.red(`[日志-异常]:`, ...content));
};
function commandLoggerWarning(...content) {
console.error(colors.yellow(`[日志-提醒]:`, ...content));
};
function commandLoggerSuccess(...content) {
console.error(colors.green(`[日志]:`, ...content));
};
// 软链接工程目录,createSymlink('/path/to/real/directory', '/path/to/cli/project/directory');
function createSymlink(source, target, type = 'symbolic') {
return new Promise((resolve, reject) => {
let cmd;
// 验证源目录是否存在
if (!fs.existsSync(source)) {
console.error(`源目录 ${source} 不存在`);
reject();
return;
}
// 验证目标是否已经存在,且是一个符号链接
if (fs.existsSync(target)) {
if (fs.lstatSync(target).isSymbolicLink()) {
// 如果符号链接已经存在,确认它指向的位置是否与源目录一致
if (fs.readlinkSync(target) === path.resolve(source)) {
// 目标已经存在,且指向正确的源目录
return;
} else {
// 目标已经存在,但指向不正确的源目录,将重置该链接
fs.unlinkSync(target); // 删除存在的链接
}
} else {
// 目标已经存在,但不是一个符号链接,将删除并创建新的链接
fs.rmdirSync(target, { recursive: true }); // 删除存在的目录
}
}
// 选择正确的命令
if (os.platform() === 'win32') {
// Windows
if (type === 'symbolic') {
cmd = `mklink /D ${target} ${source}`;
} else {
cmd = `mklink /H ${target} ${source}`;
}
} else {
// Unix-like
if (type === 'symbolic') {
cmd = `ln -s ${source} ${target}`;
} else {
cmd = `ln ${source} ${target}`;
}
}
// 执行命令
exec(cmd, (error, stdout, stderr) => {
if (error) {
console.error(`执行错误: ${error}`);
return;
}
resolve();
stdout && commandLoggerSuccess(stdout);
stderr && commandLoggerError(stderr);
});
})
};
// 把工程中的node_module链接到项目中
function commandRunNodeModuleToPro() {
let webPack = pathJoin('./node_modules', getclipath('./webProject'));
let target = pathJoin('./node_modules', getpropath('.'));
if (shelljs.test('-d', target)) {
shelljs.rm('-rf', target);
}
return createSymlink(webPack, target);
};
async function createSynlinkCommand(source, target) {
let webPack = pathJoin('.', getclipath('./webProject'));
console.log(source, target, webPack);
await changePermissions(webPack, isWin);
if (shelljs.test('-d', target)) {
shelljs.rm('-rf', target);
}
shelljs.mkdir(target);
// return linkDirectoriesAndFiles(source, target);
return createSymlink(source, target);
}
function isWin() {
// if (os.platform() === 'win32') {
// cb1(os);
// } else {
// cb2(os);
// }
return Promise.resolve((os.platform() === 'win32'));
};
function getOS() {
return new Promise((resolve) => {
const platform = os.platform();
console.log('platformplatformplatformplatformplatformplatformplatform', platform);
switch (platform) {
case 'win32':
resolve('Windows');
break;
case 'darwin':
resolve('macOS');
break;
case 'linux':
resolve('Linux');
break;
default:
resolve('Unknown OS');
}
});
}
module.exports = {
commandLoggerError,
commandLoggerSuccess,
commandLoggerWarning,
createSymlink,
isWin,
getOS,
createSynlinkCommand,
commandRunNodeModuleToPro
};