背景
筆者在最近碰到一個(gè)問題:
有一些項(xiàng)目沒有類似jenkins的自動(dòng)部署平臺(tái),前端部署都是本地執(zhí)行npm run build命令生成壓縮包,然后放到服務(wù)器上面,解壓到nginx 目錄, 但是有的時(shí)候遇到一個(gè)問題,比如項(xiàng)目中某個(gè)成員升級(jí)了其他組寫的一個(gè)組件packageA,但是其他成員可能沒有升級(jí),導(dǎo)致上線后就會(huì)有一些問題,一個(gè)包還好,如果有好幾個(gè)包都沒有升級(jí),那么可能導(dǎo)致一些意想不到的問題。
思路
首先就這個(gè)問題,我思考后有以下幾個(gè)問題
- package.json中的包名的版本有幾個(gè)是用的^x.x.x的形式,不利于判斷
- 如何對(duì)比包的版本
解決
問題1
針對(duì)第一個(gè)問題解決方案就是 直接用x.x.x的方式,一個(gè)包的更新必定是至少有一個(gè)人知道這個(gè)事情才會(huì)去更新包,所以包名是可以不帶任何標(biāo)識(shí)的
問題2
針對(duì)第二個(gè)問題
node_modules中的版本是低的,但是package.json的版本是最新的,所以我們可以自定一個(gè)腳本判斷兩個(gè)版本是否一致
const path = require('path');
const projectRoot = process.cwd();
const projectPack = require(path.resolve(projectRoot, 'package.json'));
// 需要對(duì)比的包名
const modules = ['element-ui'];
const allDependencies = {
...(projectPack.dependencies || {}),
...(projectPack.devDependencies || {}),
};
modules.forEach(module => {
try {
const packVersion = allDependencies[module];
// 有一些包名是有文件夾的比如@vue/cli-service,是在@vue文件夾下
const realPath = packVersion.aplit('/');
const pack = require(path.resolve(
...[projectRoot, 'node_modules', ...realPath, 'package.json'],
));
const needVersions = packVersion.match(/\d+/g);
const realVersions = pack.version.match(/\d+/g);
for (const i in needVersions) {
if (
isDef(needVersions[i])
isDef(realVersions[i])
parseInt(realVersions[i]) parseInt(needVersions[i])
) {
exit(module);
}
}
} catch (error) {
exit(module);
}
});
function exit(moduleName) {
throw new Error(`${moduleName} 版本過低,請(qǐng)執(zhí)行 npm i/npm install`);
}
function isDef(num) {
return num !== null num !== undefined;
}
package.json改造 增加check 腳本
"scripts": {
"check": "node build/checkNpmPackageVersion.js",
"dev": "npm run check vue-cli-service serve",
"build": "npm run check vue-cli-service build",
"lint": "vue-cli-service lint"
},
不足
- 如果包名不是純數(shù)字的話對(duì)比有問題,因?yàn)槲覀児镜陌疾粠lpha,beta等,所以我沒有考慮
- 有一些可以考慮和遠(yuǎn)程倉庫對(duì)比,比如調(diào)npm info包名命令將結(jié)果對(duì)比
總結(jié)
到此這篇關(guān)于小項(xiàng)目中管理npm包版本的思路與方法的文章就介紹到這了,更多相關(guān)小項(xiàng)目管理npm包版本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!