Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Vendored npm refusal of a lockfileVersion 4 lock says to remove `patchedDependencies` and re-run `npm install`, but npm 12 keeps the lock at v4, so the advice loops and vendoring stays refused

未关闭
#1,576 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
半天
新手友好度
62/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
json, rust

调研方向

Start in crates/socket-patch-core/src/vendor/npm_lock.rs: the lock_version_gate check on lockfileVersion 4 (around line 442) and the user-facing v4 refusal text (around lines 443-457). Reproduce with the steps in the issue, where npm 12 keeps a lock at v4 after npm patch rm. Done when either the remedy text names a working downgrade such as npm install --lockfile-version 3, or the gate accepts a v4 lock that has no patchedDependencies and no patched records, and vendoring then succeeds.

由索引模型根据 Issue 内容生成。

描述

agent:triaged bug bughunt pm:npm priority:p1

[agent] Found by the scheduled npm bug-hunt routine (ledger #302).

Summary

Vendored mode refuses an npm 12 lockfileVersion: 4 lock with vendor_lockfile_version_unsupported (the #711 fix). The refusal tells the user to "remove the patchedDependencies entries and regenerate the lock with npm install". That doesn't work. Once npm 12.1+ has written a v4 lock, npm patch rm, a plain npm install and an rm -rf node_modules && npm install all leave it at lockfileVersion: 4, even though package.json has no patchedDependencies and no entry carries a patched record. The next vendor / scan --mode vendored refuses again with the same text, so following the advice loops.

The gate's own comment (npm_lock.rs:443-446) already says "re-running npm install keeps it at 4", but the user-facing text recommends doing exactly that.

What does work is npm install --lockfile-version 3 (or deleting package-lock.json and reinstalling). With that, vendoring succeeds and a fresh npm ci installs the patched bytes.

Impact

A user who has ever used npm patch (npm >= 12.1) can't move to vendored mode by following the CLI's instructions. Each attempt exits 1 with the same refusal. This is the same "advice loops" class as #1072. The refusal also fires on a v4 lock that no longer has any native patch, and its text there ("would drop or break that patch") points at a patch that doesn't exist.

Repro (npm 12.2.0 or 12.1.0, Linux, main e76cb9b)

mkdir p && cd p
echo '{"name":"p","version":"0.0.0","private":true}' > package.json
npm install [email protected] [email protected]
npm patch ms --edit-dir ../edit && sed -i '1i /* NATIVE */' ../edit/index.js && npm patch commit ../edit
# package-lock.json: lockfileVersion 4
# stage a [email protected] patch in .socket/manifest.json (or use get/scan --mode vendored)
socket-patch vendor --json            # vendor_lockfile_version_unsupported (expected: a native patch is present)

# Follow the advice:
npm patch rm ms                        # package.json no longer has patchedDependencies
npm install                            # lockfileVersion is still 4
rm -rf node_modules && npm install     # still 4
socket-patch vendor --json            # vendor_lockfile_version_unsupported again, same text

# What actually works:
npm install --lockfile-version 3       # lockfileVersion 3
socket-patch vendor --json            # applied
rm -rf node_modules && npm ci          # left-pad installs the patched bytes

I drove vendor with the repo's prebuilt patch-service fixture (tests/prebuilt_common) over the real installed bytes. Every npm step is a real npm install.

Expected vs actual

  • Expected: a refusal's remedy, followed literally, clears the refusal. docs/testing/npm-compatibility.md ("npm 12 notes") documents the refusal as "naming npm patch". The remedy should name a step that downgrades the lock, such as npm install --lockfile-version 3 once patchedDependencies is gone. Alternatively, the gate could accept a v4 lock that has no patchedDependencies and no patched records, since that lock has the v3 shape.
  • Actual: the remedy ("remove the patchedDependencies entries and regenerate the lock with npm install") leaves the lock at v4, and vendoring refuses forever with the same text.

Matrix (Linux, Node 22.22, main e76cb9b)

npm lfv after npm patch after npm patch rm + npm install after rm -rf node_modules + npm install vendor after the advice after npm install --lockfile-version 3
12.2.0 4 4 4 refused (repro ×2) 3, vendor applied, npm ci patched
12.1.0 4 4 4 refused 3, vendor applied

npm <= 12.0 never writes v4, so it isn't affected. macOS and Windows weren't probed (the routine's probe branches are blocked); the behaviour is npm's lock writer plus a platform-independent text.

Suspect code

  • crates/socket-patch-core/src/vendor/npm_lock.rs:449-457 (lock_version_gate, the v4 detail text)
  • The gate keys only on lockfileVersion == 4 (npm_lock.rs:442), not on whether patchedDependencies / patched records still exist.

No probe runs: Linux only.

主要语言
Rust
星标
8
派生
1
平均合并
16 小时 18 分钟
30 天内合并 PR
587

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

SocketDev/socket-patch 的其他 Issue

查看 SocketDev/socket-patch 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。