UNPKG

crootfast

Version:

大前端工程化命令行脚手架

143 lines (129 loc) 4.08 kB
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 };