【踩坑】Pnpm 默认不执行 Pre/Post-Scripts

关键词

pnpm electron assar jenkins npmrc

问题背景

electron 桌面应用开发中,发现jenkins 打包的体积,总是比本地的体积要大。

通过比对文件大小,发现问题出现在app.asar。

问题排查

Step1: 解压jenkins 打包的asar

结果:发现assar中还有N个版本前的静态资源

Step2: 怀疑旧产物没有清除,排查jenkins 打包日志

日志中无执行rimraf的记录,也没有相关的报错,查看依赖nhode_modules中有正确rimraf。

执行完"husky" 直接跳过"prebuild",执行"build"

结果:排查此问题与jenkins docker无关,需进一步排查。

Step3: 对比本地打包步骤与jenkins 的差异

仔细对比发现差异:

本地:yarn run build

jenkins: pnpm run build

本地执行pnpm run build,问题复现。

结果:此问题与pnpm run 命令有关

问题根因

查阅官网相关资料,找到原因

pnpm.io/zh/cli/run#...

默认情况下, pnpm 不会任意执行用户定义的 hook,pre post (例如 prestart)。

这种从npm继承过来的习惯,会导致脚本执行是隐式的,而不是显式的,从而混淆了执行流程。 它还会导致意外执行 pnpm servepnpm preserve

解决方案

.npmrc 给项目全局开启 enable-pre-post-scripts

问题拓展

  1. pnpm 作为新一代的前端依赖管理器,在安全性&性能等方面做了很多改进。(例如禁止隐式依赖、禁止pre/post hook隐式调用...)

    在项目使用 pnpm 前,应该阅读pnpm 的官网,熟悉其特性。

  2. 本地开发执行命令,应该使用与项目相同的包管理器。(此案例,本地使用yarn,但项目使用pnpm。这个做法是不正确的)

    这边推荐咱们国人开发的开源依赖"@antfu/ni" 来执行本地命令;

    支持并通过.lock文件自动识别多种包管理器,并抹平不同管理器的语法。
    github.com/antfu/ni

相关推荐
anOnion1 小时前
构建无障碍组件之Alert Dialog Pattern
前端·html·交互设计
choke2331 小时前
[特殊字符] Python 文件与路径操作
java·前端·javascript
云飞云共享云桌面1 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
Deng9452013141 小时前
Vue + Flask 前后端分离项目实战:从零搭建一个完整博客系统
前端·vue.js·flask
威迪斯特1 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
wuhen_n2 小时前
JavaScript内置数据结构
开发语言·前端·javascript·数据结构
大鱼前端2 小时前
为什么我说CSS-in-JS是前端“最佳”的糟粕设计?
前端
不爱吃糖的程序媛2 小时前
Capacitor:跨平台Web原生应用开发利器,现已全面适配鸿蒙
前端·华为·harmonyos
AC赳赳老秦2 小时前
2026国产算力新周期:DeepSeek实战适配英伟达H200,引领大模型训练效率跃升
大数据·前端·人工智能·算法·tidb·memcache·deepseek
CHU7290352 小时前
淘宝扭蛋机抽盒小程序前端功能解析:解锁趣味抽盒新体验
前端·小程序