UNPKG

crootfast

Version:

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

248 lines (234 loc) 7.01 kB
const shelljs = require('shelljs'); const { switchNodeVersion, responseFormat, executeCommand, shelljsChildProcessSpawn } = require('../common/utils'); const { checkVersion, checkPkgVersion } = require('../common/utils/checkers'); const { mlog } = require('../common/utils/logWithLineInfo'); const { pathJoin } = require('../common/utils/path'); const { isWin, getOS } = require('./cmd'); const { dependencies, devDependencies } = require('./package/packagerc'); // 检查基建工具的版本,版本不对就更新,没安装就安装。 function baseToolSwitchOrInstall() { return new Promise(async (resolve, reject) => { try { const SYSTEMSTATUS = await isWin(); if (!SYSTEMSTATUS) { // await theNSpecifiedVersion(); // await theNodeSpecifiedVersion(); // await theNpmSpecifiedVersion(); } await thePnpmSpecifiedVersion(); resolve( responseFormat({ code: 200, success: true }) ); } catch (e) { mlog(e); reject( responseFormat({ code: 4000, success: false, message: e.message }) ); } }); // checkVersion('npm', '8.5.0').then(resp => { // console.log(resp); // }); // checkVersion('pnpm', '6.30.1').then(resp => { // console.log(resp); // }); // checkVersion('webpack', '5.71.0').then(resp => { // console.log(resp); // }); }; /** * 全局安装 n 版本 */ function theNSpecifiedVersion() { return new Promise((resolve, reject) => { checkVersion('n', '8.0.0').then(async resp => { if (resp.code === 4030) { executeCommand( 'sudo', `npm install n@8.0.0 -g` ).then(resolve).catch(reject); } if (resp.code === 200) { resolve(); } }).catch(err => { if (err.code === 4010) { executeCommand( 'sudo', `npm install n@8.0.0 -g` ).then(resolve).catch(reject); } }); }); }; /** * 安装指定 node@16.14.2 版本 */ function theNodeSpecifiedVersion() { return checkVersion('node', '16.14.2').then(async resp => { // console.log('node', resp.code); // 安装的node版本不符合要求,使用包工具 => n,对node版本进行“优雅”切换。 if (resp.code === 4030) { switchNodeVersion('16.14.2'); } }).catch(err => { if (err.code === 4010) { mlog(`[${err.code}] ${err.message} [发生依赖包未安装的错误]。`); } else { mlog(`[${err.code}] ${err.message} [检查基建工具的版本,发生其他异常]。`); } }); }; /** * 安装指定 npm@8.5.0 版本 */ function theNpmSpecifiedVersion(version = '8.5.0') { return new Promise((resolve, reject) => { checkVersion('npm', version).then(async resp => { if (resp.code === 4030) { executeCommand( 'sudo', `npm install -g npm@${version}` ).then(resp => { resolve( responseFormat({ code: 200, success: true, message: `使用 npm 工具,成功切换到 npm 版本 ${version}` }) ); }).catch(err => { mlog(err); // console.log(err); reject( responseFormat({ code: 4030, message: `使用 npm 工具,切换 npm 版本时出错 ${err}` }) ); }); } else if (resp.code === 200) { resolve(resp); } }).catch(err => { if (err.code === 4010) { mlog(`npm [${err.code}] ${err.message} [发生依赖包未安装的错误]。`); } else { mlog(`npm [${err.code}] ${err.message} [检查基建工具的版本,发生其他异常]。`); } }) }); }; /** * 安装指定 pnpm@6.30.1 版本 */ function thePnpmSpecifiedVersion(version = '6.30.1') { const installPnpmPackage = async (version, resolve, reject) => { const SYSTEMSTATUS = await getOS(); if (SYSTEMSTATUS === "win32") { shelljsChildProcessSpawn('npm', `install -g pnpm@${version}`).then(resp => { resolve( responseFormat({ code: 200, success: true, message: `使用 pnpm 工具,成功切换到 npm 版本 ${version}` }) ); }).catch(err => { mlog(err); reject( responseFormat({ code: 4030, message: `使用 pnpm 工具,切换 npm 版本时出错 ${err}` }) ); }); } else if (SYSTEMSTATUS === "Linux") { shelljsChildProcessSpawn('npm', `install -g pnpm@${version}`).then(resp => { resolve( responseFormat({ code: 200, success: true, message: `使用 pnpm 工具,成功切换到 npm 版本 ${version}` }) ); }).catch(err => { mlog(err); reject( responseFormat({ code: 4030, message: `使用 pnpm 工具,切换 npm 版本时出错 ${err}` }) ); }); } else { executeCommand( 'sudo', `npm install -g pnpm@${version}` ).then(resp => { resolve( responseFormat({ code: 200, success: true, message: `使用 pnpm 工具,成功切换到 npm 版本 ${version}` }) ); }).catch(err => { mlog(err); reject( responseFormat({ code: 4030, message: `使用 pnpm 工具,切换 npm 版本时出错 ${err}` }) ); }); } }; return new Promise((resolve, reject) => { checkVersion('pnpm', version).then(async resp => { if (resp.code === 4030) { installPnpmPackage(version, resolve, reject); } else if (resp.code === 200) { resolve(resp); } }).catch(err => { if (err.code === 4010) { installPnpmPackage(version, resolve, reject); mlog(`pnpm [${err.code}] ${err.message} [发生依赖包未安装的错误]。`); } else { mlog(`pnpm [${err.code}] ${err.message} [检查基建工具的版本,发生其他异常]。`); } }) }); }; // 检查“开发环境”依赖包中依赖的版本,如果没有或者版本不正确就重新安装。 async function checkDevDependenciesVersionAndInstall() { // Object.entries(devDependencies).map(([key, value], index) => { // console.log(key, value, index); // }); for (let key in devDependencies) { let version = devDependencies[key]; console.log(key, version); await checkPkgVersion(key, version); } // executeCommand( // 'pnpm', `install webpack@5.71.0 -D` // ).then(resp => { // mlog(resp); // // resolve(resp); // }).catch(err => { // mlog(err); // // reject(err); // }); // console.log( // devDependencies, // pathjoin('./package.json') // ); }; module.exports = { baseToolSwitchOrInstall, checkDevDependenciesVersionAndInstall };