在使用 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://www.pswp.cn/pingmian/96157.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96157.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/96157.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka在多环境中安全管理敏感

1. 配置提供者是什么? 配置提供者(ConfigProvider)是一类按需“拉取配置”的组件:应用读取配置时,按约定的占位符语法去外部来源(目录、环境变量、单一 properties 文件、你自定义的来源……)取…

编程工具的演进逻辑:从Python IDLE到Arduino IDE的深度剖析

引言:工具进化的本质 在编程学习与开发的道路上,我们总会与各种各样的工具相遇。一个有趣的现象是,无论是初学者的第一款工具Python IDLE,还是硬件爱好者常用的Thonny和Arduino IDE,它们都自称“集成开发环境”(IDE)。这背后隐藏着怎样的逻辑? 本文将带你深入分析这三…

p10k configure执行报错: ~/powerlevel10k/config/p10k-lean.zsh is not readable

[ERROR] p10k configure: ~/powerlevel10k/config/p10k-lean.zsh is not readable 背景 我移动了Powerlevel10k文件夹的位置,导致p10k configure命令找不到powerlevel10k文件夹的位置。 原来Powerlevel10k的位置:~/powerlevel10k 移动后Powerlevel10k的位…

Java 学习笔记(进阶篇3)

1. 美化界面关键逻辑 1:// 相对路径:直接从项目的 src 目录开始写,不包含 D:\ 和个人名字 ImageIcon bg new ImageIcon("src/image/background.png"); JLabel background new JLabel(bg);这两行代码是 Swing 中加载并显示图片的经…

BFD 概述

BFD简介1.BFD:Bidirectional Forwarding Detection,双向转发检查概述:毫秒级链路故障检查,通常结合三层协议(如静态路由、vrrp、 ospf、 BGP等)实现链路故障快速切换。作用:① 检测二层非直连故障② 加快三层协议收敛底…

【嵌入式DIY实例-ESP32篇】-Flappy Bird游戏

Flappy Bird游戏 文章目录 Flappy Bird游戏 1、游戏介绍 2、硬件准备与接线 3、代码实现 《Flappy Bird》游戏以其引人入胜的玩法和简约的设计风靡全球。本文将探讨如何使用 OLED SSD1306 显示屏和 ESP32 微控制器重现这款经典游戏。这个 DIY 项目不仅充满乐趣,也是学习编程和…

[数据结构——lesson2.顺序表]

目录 学习目标 引言 1.什么是线性表? 2.什么是顺序表? 2.1概念及结构 2.2 接口实现 2.2.1顺序表的功能 1.顺序表的初始化 2.打印数据 3.尾插数据 (1)检查空间 (2)插入数据 4.尾删数据 5.头插数据 6.头删数据 7.数据查找 8.指定位置数据…

ChatGPT大模型训练指南:如何借助动态代理IP提高训练效率

随着人工智能技术的飞速发展,ChatGPT等大型语言模型(LLM)已成为科技界和产业界关注的焦点。模型的训练过程耗时、耗资源且对网络环境要求极高。尤其是在需要模拟真实用户行为、进行大规模数据爬取或分布式训练的场景下,单一IP地址…

Docker 学习笔记(六):多容器管理与集群部署实践

Docker Docker-compose 单个 Dockerfile 可定义单容器应用,但日常工作中,Web 项目等常需 Web 服务、数据库、负载均衡等多容器配合,手动按序启停容器会导致维护量大、效率低。 Docker Compose 是高效的多容器管理工具,通过单个 do…

C++类和对象初识

面向过程 1.1 面向过程特点 1.2 通俗解释:煮方便面 1.3 面向过程实现代码 1.4 特点总结面向对象 2.1 面向对象特点 2.2 通俗解释:对象协作思维 2.3 面向对象实现代码 2.4 特点总结面向对象和面向过程总结C 面向对象介绍 4.1 面向对象三大基本特征封装&am…

C++ Int128 —— 128位有符号整数类实现剖析

🧠 C Int128 —— 128位有符号整数类实现剖析 引用:openppp2/ppp/Int128.h 🏗️ 1. 存储结构设计 #mermaid-svg-2JDFsdz6MTbX253D {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-sv…

【C 语言生成指定范围随机数(整数 + 小数):原理、实现与避坑指南】

概述 在 C 语言开发中,生成指定范围的随机数是高频需求(如游戏随机道具、数据模拟、测试用例生成等)。但很多新手会卡在 “范围控制”“随机数重复”“小数生成” 等问题上。本文结合实战场景,从原理到代码详细讲解如何生成 1100、…

一个简单的langgraph agent系统

本文基于langgraph的预制件 Agent Chat UI和《搭建一个本地langgraph服务》中的本地服务构建一个简单的agent系统。 说明:Agent Chat UI需要nodejs版本18及以上,而nodejs18需要的glibc版本为2.28,本人使用操作系统为ubuntu18.04,g…

通过SSH来推送本地文件夹到Github

配置SSH git使用SSH配置, 初始需要以下三个步骤 使用秘钥生成工具生成rsa秘钥和公钥 将rsa公钥添加到代码托管平台 将rsa秘钥添加到ssh-agent中,为ssh client指定使用的秘钥文件 具体操作如下: 第一步:检查本地主机是否已经存在…

视频转webp批量处理工具哪个好?这里有答案

你是不是也遇到过这样的困扰:手机里存满了精彩的短视频,想做成动图分享到社交媒体,却发现转换后的GIF文件巨大无比,画质还惨不忍睹?要怎么把手机视频转webp,才能既保持高清画质,又能大幅减小文件…

【Fastjson】Fastjson2 在不同 Modules 模块包下,@JSONField name映射无法反序列化的 BUG 及解决

问题:在使用 alibaba fastjson2 做 JSONField 字段名映射时,在同模块包下 Flink Jar 任务正常映射,本地测试正常映射,但是将两个模块包上传至 Flink Cluster 之后,出现反序列化异常,子模块无法反序列化父模…

Go语言基础---数据类型间的故事

Go语言基础—数据类型间的故事 目录 前言基本数据类型 整形字节特殊整形unsafe.Sizeof数字字面量语法浮点型布尔值字符串byte和rune类型 运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符 前言 Go语言是Google开发的一种静态强类型、编译型语言。Go语言语法与C相近…

dedecms软件等级★号改成图片图标显示的办法

我们在用到dedecms织梦的软件模型&#xff0c;在调用软件星级的时候&#xff0c;要把默认的星号改为图片&#xff0c;这个要怎么操作呢&#xff1f;1、软件模型管理里面-字段管理-字段配置softrankislink一行改为&#xff1a;<field:softrank itemname软件等级 typeint isnu…

windows下安装claude code+国产大模型glm4.5接入(无需科学上网)

下载安装node.js https://nodejs.org/en/download 安装版.msi 直接下载安装即可 免安装版.zip 1.解压下载的压缩包 2.创建数据缓存存储目录cache和全局安装工具目录global 3.配置环境变量 【我的电脑】右键选中【属性】-> 找到【高级系统设置】-> 右下角【环境变量…

嵌入式 - ARM4

裸机实现LED闪烁一、启动代码1. 异常向量表配置1. .global汇编器指令&#xff0c;全局定义标签_start&#xff0c;作为汇编程序的默认起点2. 配置标签配置标签时可以前置加_ &#xff0c;以便和普通标签或系统标签做区分3. 异常向量表ARM架构规定异常向量表位置固定&#xff0c…