小專案中管理npm包版本的思路與方法
阿新 • • 發佈:2021-06-10
背景
筆者在最近碰到一個問題:
有一些專案沒有類似jenkins的自動部署平臺,前端部署都是本地執行npm run build命令生成壓縮包,然後放到伺服器上面,解壓到nginx 目錄,但是有的時候遇到一個問題,比如專案中某個成員升級了其他組寫的一個元件packageA,但是其他成員可能沒有升級,導致上線後就會有一些問題,一個包還好,如果有好幾個包都沒有升級,那麼可能導致一些意想不到的問題。
思路
首先就這個問題,我思考後有以下幾個問題
- package.json中的包名的版本有幾個是用的^x.x.x的形式,不利於判斷
- 如何對比包的版本
解決
問題1
針對第一個問題解決方案就是 直接用x.x.x的方式,一個包的更新必定是至少有一個人知道這個事情才會去更新包,所以包名是可以不帶任何標識的
問題2
針對第二個問題
node_modules中的版本是低的,但是package.json的版本是最新的,所以我們可以自定一個指令碼判斷兩個版本是否一致
const path = require('path'); const projectRoot = process.cwd(); const projectPack = require(path.resolve(projectRoot,'package.json')); // 需要對比的包名 const modules = ['element-ui']; const allDependencies = { ...(projectPack.dependencies || {}),...(projectPack.devDependencies || {}),}; modules.forEach(module => { try { const packVersion = allDependencies[module]; // 有一些包名是有資料夾的比如@vue/cli-service,是在@vue資料夾下 www.cppcns.com 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]) CvukGMRf) { exit(module); } } } catch (error) { exit(module); } }); function exit(moduleName) { throw new Error(`${moduleName} 版本過低,請執行 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" },
不足
- 如果包名不是純數字的話對比有問題,因為我們公司的包名都不帶alpha,beta等CvukGMRf,所以我沒有考慮
- 有一些可以考慮和遠端倉庫對比,比如調npm info包名命令將結果對比
總結
到此這篇關於小專案中管理npm包版本的思路與方法的文章就介紹到這了,更多相關小專案管理npm包版本內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!