jenkins部署过程中依赖版本不对齐导致问题的原因及解决方法

674 阅读3分钟

问题描述: WEB优化版本开发测试中发现的 jenkins部署构建 过程中依赖版本不对齐导致的ie模式下打开项目白页

根本原因:

根本原因是有同一个名称的包 作为了项目的依赖 以及项目的依赖下的依赖 且里外的同名的包版本不对齐

image.png

上图中可以看到, 外层是moment@2.24.0 antd下是moment@2.29.1

antd下的依赖 rc-calendar 及 rc-time-picker 下是 moment@2.29.1

moment版本不对齐导致了ie白页的问题

html2canvas里外的版本分别是 1.0.0-rc.7 和 1.0.0-alpha.12

html2canvas版本不对齐导致了前端实现的pdf下载功能失效的问题

产生原因:

package.json中 dependencies 下的 moment 和 html2canvas 锁了版本 dependencies要求 "moment": "2.24.0" 而antd下的 rc-calendar 和 rc-time-picker 中 要求 moment: '2.x' 本次开发中为了区分qa上的灰度环境 做了v2 v3的区分 其中v3项目是新jenkins项目, 新建了文件夹并在该文件夹中build代码 这个过程中就拉取了 2.24.0 和 2.29.1 两个版本 所以导致了问题 而v2老项目中 是一个存在很久的jenkins项目, 其的node_modules已经存在了一些时间 第一次build时的版本antd下的moment是2.22.0, 也与build线上代码的环境一致

image.png image.png 在node_modules里 antd 已有 moment 的情况下 符合 "2.x" 的要求,于是不会拉到更新的版本 html2canvas的问题同理 这也是 v2项目 tag_**(build master代码)的项目 以及本地开发环境 无问题的原因 在依赖版本不对其的情况下, 如果本地开发环境删除node_modules重新yarn安装依赖也可以复现问题

解决办法:

package.json中可以定义 resolutions 来定义依赖下的依赖版本 写法demo:

{
  "name": "project",
  "version": "1.0.0",
  "dependencies": {
    "left-pad": "1.0.0",
    "c": "file:../c-1",
    "d2": "file:../d2-1"
  },
  "resolutions": {
    "d2/left-pad": "1.1.1",
    "c/**/left-pad": "^1.1.2"
  }
}

参考 resolutions写法Domo 这里有两个注意点:

  1. resolutions里的层级由dependencies中的依赖包名称开始, 到其下的某个层级结束
  2. 如果层级太长, 可以用**来代表中间的层级, 但如果有个多个依赖下有同名的包,可能会一起影响

为了本次修复不会引入新的问题, 所以将版本对齐至线上部署的代码 上方有版本说明 在我们的package.json中加入如下代码

    "resolutions": {
        "antd/moment": "2.24.0",
        "antd/rc-calendar/moment": "2.22.2",
        "antd/rc-time-picker/moment": "2.22.2",
        "jspdf/html2canvas": "1.0.0-alpha.12"
    },

确认当前package.json中有resolution锁了moment和html2canvas的版本后, 删除node_modules -> 清除yarn的缓存 -> 清除npm的缓存 并重新安装 步骤如下:

  1. 删除node_modules
# windwos
del .\\node_modules\\
# linux
rm -rf node_modules/
  1. yarn可以单独清除这两个模块的 也可以全删除缓存
# 删除yarn两个包的缓存(推荐)
yarn cache clean moment
yarn cache clean html2canvas
# 删除yarn全部缓存
yarn cache clean
# 删除npm缓存
npm cache clean --force
  1. 重新 yarn 安装 yarn 或 yarn install

在本地只需要重新yarn就可以了 在jenkins构建会自动yarn和build

可用npm或yarn方法:

  1. npm ls <modules_name> // npm查看项目下模块结构
  2. yarn list <moduels_name> // yarn查看项目下模块结构
  3. yarn cache list --pattern <moduels_name> // yarn查看本地指定包缓存
  4. npm list -json > npmlist.json // 输出global完整模块结构到json文件
  5. npm list -json -g > npmlist.json // 输出当前项目完整模块结构到json文件