关键词
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 不会任意执行用户定义的 hook,
pre
和post
(例如prestart
)。这种从npm继承过来的习惯,会导致脚本执行是隐式的,而不是显式的,从而混淆了执行流程。 它还会导致意外执行
pnpm serve
和pnpm preserve
。
解决方案
.npmrc 给项目全局开启 enable-pre-post-scripts
问题拓展
-
pnpm 作为新一代的前端依赖管理器,在安全性&性能等方面做了很多改进。(例如禁止隐式依赖、禁止pre/post hook隐式调用...)
在项目使用 pnpm 前,应该阅读pnpm 的官网,熟悉其特性。
-
本地开发执行命令,应该使用与项目相同的包管理器。(此案例,本地使用yarn,但项目使用pnpm。这个做法是不正确的)
这边推荐咱们国人开发的开源依赖"@antfu/ni" 来执行本地命令;
支持并通过.lock文件自动识别多种包管理器,并抹平不同管理器的语法。
github.com/antfu/ni