纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

小项目管理npm包版本 小项目中管理npm包版本的思路与方法

Vincent就是我65724   2021-06-08 我要评论
想了解小项目中管理npm包版本的思路与方法的相关内容吗,Vincent就是我65724在本文为您仔细讲解小项目管理npm包版本的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:npm包管理工具,npm包管理原理,npm包管理实现,下面大家一起来学习吧。

背景

笔者在最近碰到一个问题:

有一些项目没有类似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文件夹下
    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} 版本过低,请执行 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等,所以我没有考虑
  • 有一些可以考虑和远程仓库对比,比如调npm info包名命令将结果对比

总结


相关文章

猜您喜欢

  • Android多线程操作 Android中实现多线程操作的几种方式

    想了解Android中实现多线程操作的几种方式的相关内容吗,哗啦啦啦啦在本文为您仔细讲解Android多线程操作 的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android多线程操作,Android多线程,下面大家一起来学习吧。..
  • vue引入iconfont vue引入iconfont图标库的优雅实战记录

    想了解vue引入iconfont图标库的优雅实战记录的相关内容吗,Kay_在本文为您仔细讲解vue引入iconfont的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:vue引入iconfont,vue引入iconfont.js,vue引入第三方js文件,下面大家一起来学习吧。..

网友评论

Copyright 2020 www.9aisf.com 【就爱软件站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式