当前位置: 首页 > news >正文

Jenkins 构建 Node 项目报错解析与解决——pnpm lockfile 问题实战

在使用 Jenkins 自动化构建 Node.js 项目时,经常会遇到类似报错:

ERR_PNPM_OUTDATED_LOCKFILE  Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with package.json
Error: Cannot find module 'node_modules/vite/bin/vite.js'

对于初学者来说,这种报错可能很迷惑。本文带你从原理到实操,彻底搞懂问题原因和解决方案。


一、问题现象

在 Jenkins CI 上执行构建任务时,可能出现以下情况:

  1. pnpm install 失败,报错:
ERR_PNPM_OUTDATED_LOCKFILE  Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with package.json
  1. 构建命令报错:
Error: Cannot find module 'node_modules/vite/bin/vite.js'
  1. 打包步骤失败:
zip warning: name not matched: dist
zip error: Nothing to do!

二、问题根源分析

1. pnpm lockfile 不一致

  • pnpm 使用 pnpm-lock.yaml 来锁定依赖版本,保证不同环境安装依赖一致。

  • CI 环境(如 Jenkins)默认启用 frozen-lockfile 模式,即:

    • 不会自动修改 lockfile
    • 如果 package.json 中新增或修改了依赖,而 lockfile 未更新,就会报错。

典型场景

  • 本地新增依赖:
pnpm add @zxing/browser jsqr qrcode-decoder quagga
  • package.json 改了,但 pnpm-lock.yaml 没更新或没提交到 Git。
  • Jenkins 在 CI 环境拉取代码后,执行 pnpm install 时就报错了。

2. node_modules 缺失

由于 pnpm install 失败:

  • node_modules 没生成完整依赖
  • 构建工具(如 Vite)找不到模块:
Cannot find module 'node_modules/vite/bin/vite.js'
  • 构建中断 → 打包 dist 文件失败

三、解决方案

1. 本地更新 lockfile 并提交(推荐)

  1. 在本地项目根目录执行:
pnpm install
  • 会根据 package.json 更新 pnpm-lock.yaml
  • 注意不要使用 --frozen-lockfile,否则不会更新。
  1. 提交更新:
git add package.json pnpm-lock.yaml
git commit -m "chore: update lockfile after adding new dependencies"
git push
  1. Jenkins 再次构建:
  • CI 拉取最新代码
  • pnpm install 会顺利安装依赖
  • 构建正常 → 打包成功

2. CI 临时解决方案(不推荐)

如果只是测试或临时构建,可以在 Jenkins 构建脚本里加:

pnpm install --no-frozen-lockfile
  • 会忽略 lockfile 和 package.json 的不一致
  • 强制安装依赖
  • ⚠️ 风险:可能导致不同环境依赖版本不一致,不适合长期使用

3. 确保构建路径正确

在 Jenkins 中,确保工作目录存在:

cd /var/jenkins_home/workspace/jxc-web
pnpm install
  • 如果 workspace 被清理或不存在,会报:
Error: ENOENT: no such file or directory, uv_cwd
  • Jenkins job 配置中可以取消“构建前删除工作区”,或者在构建脚本里自动创建目录:
mkdir -p /var/jenkins_home/workspace/jxc-web

4. 检查 Node.js 和 pnpm 版本

确保 Jenkins 使用的 Node.js 与本地一致:

node -v
pnpm -v

不同版本可能导致依赖安装或 vite 构建失败。


四、Jenkins 构建推荐流程

一个推荐的 Jenkins 构建脚本:

#!/bin/bash
set -e# 确保工作区存在
mkdir -p /var/jenkins_home/workspace/jxc-web
cd /var/jenkins_home/workspace/jxc-web# 拉取最新代码
git reset --hard
git clean -fd
git pull origin main# 安装依赖
pnpm install --frozen-lockfile# 构建项目
pnpm run build:dev# 打包 dist
zip -r dist.zip dist

✅ 关键点:

  • --frozen-lockfile 保证 CI 与 lockfile 一致
  • 如果 lockfile 有变动 → 在本地更新并提交
  • 确保 workspace 路径存在,避免 uv_cwd 错误
  • Node.js、pnpm 版本与本地一致

五、总结

  • Jenkins 不会自动更新 pnpm lockfile → 锁文件必须与 package.json 保持一致

  • 构建失败 的根本原因是依赖没装完整

  • 最佳实践

    1. 本地修改依赖后同步更新 lockfile
    2. 提交到 Git
    3. CI 使用 --frozen-lockfile 保证环境一致

这样就可以避免:

  • ERR_PNPM_OUTDATED_LOCKFILE
  • Cannot find module 'vite'
  • 打包 dist 失败

小白提示:

每次新增依赖后记得跑 pnpm install 并提交 pnpm-lock.yaml,CI 构建才不会报错!



文章转载自:

http://c2vGb3Me.hyjpL.cn
http://M41kjKXe.hyjpL.cn
http://UpoY42sJ.hyjpL.cn
http://sqrRvAFS.hyjpL.cn
http://buEvenNU.hyjpL.cn
http://0Hf1jOQT.hyjpL.cn
http://g31HFO0F.hyjpL.cn
http://oztVdF9N.hyjpL.cn
http://ADjyMfcl.hyjpL.cn
http://wd9pYWxa.hyjpL.cn
http://gBDnavOI.hyjpL.cn
http://HkVQlKqo.hyjpL.cn
http://EgpHIAJA.hyjpL.cn
http://jVNcWEQV.hyjpL.cn
http://jf8KI7KG.hyjpL.cn
http://Yz9h4GMA.hyjpL.cn
http://lDpwvi7l.hyjpL.cn
http://D23BpsUd.hyjpL.cn
http://LcJyujtz.hyjpL.cn
http://z0ou7I32.hyjpL.cn
http://nbzjXpKd.hyjpL.cn
http://9M8UwsmC.hyjpL.cn
http://7mJnWYVK.hyjpL.cn
http://xXybKF64.hyjpL.cn
http://1cUtXvtk.hyjpL.cn
http://t2usHvh2.hyjpL.cn
http://xZCgRxyC.hyjpL.cn
http://rFXs1pEF.hyjpL.cn
http://Njxrpio6.hyjpL.cn
http://ar2R12NI.hyjpL.cn
http://www.dtcms.com/a/376426.html

相关文章:

  • Wazuh 研究记录 | 开源XDR | 安全基线检测
  • 配电网故障诊断与自愈控制工具的智慧能源开源了
  • [邮件服务器core] 安全通信(SSL/TLS) | OpenSSL库管理 | 服务端安全SECURITY.md
  • Workers API 实战教程:45 秒完成 CI/CD 云函数部署
  • MySQL收集processlist记录的shell工具mysql_collect_processlist
  • 计算机毕业设计 基于Hadoop的健康饮食推荐系统的设计与实现 Java 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 【nginx基础】Nginx安装指南:CentOS 7.9源码编译安装Nginx 1.28.0完整指南
  • ShardingJDBC实战指南
  • 数据库--MySQL数据管理
  • Java全栈学习笔记33
  • 网络学习笔记
  • GitHub每日最火火火项目(9.10)
  • 基于stm32的环境监测系统/智能家居/空气质量监测系统
  • 基于PyQt5和阿里云TTS的语音合成应用开发实战[附源码】
  • Linux的V4L2视频框架学习笔记
  • Android studio安装教程——超详细(含安装包安装教程)
  • 如何将大型音频文件从 iPhone 发送到不同的设备
  • 使用阿里云容器镜像服务 ACR
  • ffmpeg内存模型
  • Android面试指南(八)
  • 不止是进度条:深入PiXSingleGUI的TpSlideProgressBar组件架构设计​
  • Flutter 视频播放器——flick_video_player 介绍与使用
  • 【Java】Hibernate管理Session
  • 【ARMv7】系统复位上电后的程序执行过程
  • Ubuntu引导修复
  • PetaLinux_User_udev
  • 《链表的优雅封装:C++ list 模拟实现与迭代器之美》
  • 基于Redis设计一个高可用的缓存
  • 看涨看跌期权平价公式原理及其拓展
  • Django 基础入门:命令、结构与核心配置全解析