crootfast
Version:
大前端工程化命令行脚手架
248 lines (234 loc) • 7.01 kB
JavaScript
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
};