#15030·pnpm

`pnpm install --force` 不会重新导入完整性发生变化的包

作者: TrevorBurnham创建于 2026年9月17日更新于 2026年9月17日
标签type: bugarea: lockfileregressionarea: resolution

□ 最后的 pnpm 版本有效

12.4.0 (单位:千美元)

□ pnpm 版本

12.4.1(也是12.4.2和 " 主要 " )

□ 复制问题的代码

pnpmfile “resolvers” 钩子的自定义解析器将`[email protected]' 解析为焦油球,从磁盘上的字节计算出完整性。 在两个装置之间,用不同的字节来取而代之的是“名称@version”,即“应重新确定”处理。

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? mkdir -p/tmp/pnpm-force-repro * 克德/tmp/pnpm-force-repro

构建 (){ rm - rf 阶段 \ mkdir - p 阶段/包装 回放"{"名":"dep-a""版本":"1.0.0""主":"index.js"}"". 舞台/包装/包装。 回声"module.exports = '1'" > 舞台/包装/index.js (cd阶段 COPYFILE DISABLE=1 tar-czf "./$2"包件). {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 建立旧. tgz 新建新. tgz

回放"{"名称":"反正","版本":"1.0.0","依赖":"{"dep-a":"1.0.0""}}". 软件包.json

猫 >.pnpmfile.cjs QQ'EOF' const 加密 = 需要 ('crypto') cons fs = 需要 ('fs') Const 路径 = 需要 ('路径') const served = path.join ( dirname, “ service. tgz' ”) (中文(简体) ).

模块。导出={ 解析器 : [{ {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}能解决: 解析度: async () QQ ({ 编号:"[email protected]", 分辨率 :{ 柏球:"文件:服务.tgz", 完整性 : “ sha512 ” + crypto. createHash( “ sha512 ” ) .update(fs.readFileSync( service)). digest('base64'), {\fn华文楷体\fs16\1cHE0E0E0} 显示:{名称:'dep-a',版本:'1.0.0'}, 解决Via: '海关', ~ , , ( ) , 应重新确定决议:() 事实, [ {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 欧法尔

cp old.tgz 服务于.tgz pnpm 安装 cat node modules/dep-a/index.js #module.exports="OLD" (中文(简体) ).

cp new.tgz served.tgz # 用同名重排不同的字节@ version pnpm 安装 -- force 猫节点/dep-a/index.js grep -o'sha512-.'' pnpm-lock.yaml (英语).


□ 预期行为

在第二次安装后,`node modules/dep-a/index.js'包含`NEW',将所安装的完整与`pnpm-lock.yaml'相匹配。 这是12.4.0做的。

□ 实际行为

在12.4.1和后来的档案中仍然有`OLD',而`pnpm-lock.yaml'记录了新的完整性。 安装出口为0并报告`包:+1',没有警告,因此下一个安装时没有看到漂移,树会僵化。

取来无事. 商店在每次运行时都由新包的文件来增长,因此新内容被下载并被摄取. 只跳过虚拟商店的导入 。

相同的固定,相同的商店增长, 一个变量:

" 安装-部队 " 之后的 " node-modules "
| -- -- -- -- -- -- --
| 12.2.1 |
| 12.3.2 | " NEW "
                                                                                              
                                                 
                                            

" 武力 " 是触发因素。 在12.4.2中,没有`-force'就到达解决器的第二个装置将`NEW'写入锁文件与`node modules'。 因此"-力",被记载为"已实现的更早安装的再链接包",是唯一能阻止再链接的东西.

以 " 文件: " 复制了柏油球并用一个在HTTP上,因此运输不是一个因素。

{\fn华文仿宋\fs16\1cHD1D1D1}
. . . . . . .