【踩坑】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

相关推荐
Dragon Wu7 分钟前
TailWindCss cva+cn管理样式
前端·css
烤麻辣烫12 分钟前
Web开发概述
前端·javascript·css·vue.js·html
Front思22 分钟前
Vue3仿美团实现骑手路线规划
开发语言·前端·javascript
徐同保25 分钟前
Nano Banana AI 绘画创作前端代码(使用claude code编写)
前端
Ulyanov25 分钟前
PyVista与Tkinter桌面级3D可视化应用实战
开发语言·前端·python·3d·信息可视化·tkinter·gui开发
计算机程序设计小李同学25 分钟前
基于Web和Android的漫画阅读平台
java·前端·vue.js·spring boot·后端·uniapp
lkbhua莱克瓦2428 分钟前
HTML与CSS核心概念详解
前端·笔记·html·javaweb
沛沛老爹29 分钟前
从Web到AI:Agent Skills CI/CD流水线集成实战指南
java·前端·人工智能·ci/cd·架构·llama·rag
GISer_Jing37 分钟前
1.17-1.23日博客之星投票,每日可投
前端·人工智能·arcgis
代码游侠42 分钟前
学习笔记——ARM Cortex-A 裸机开发实战指南
linux·运维·开发语言·前端·arm开发·笔记