有没有一种方法可以强制npm生成package-lock.json文件?

396

我不小心删除了package.json文件,并在此之后做了很多更改。现在无论是运行npm install还是npm update,都不会再生成package-lock.json文件。我尝试清除了我的npm缓存和nvm缓存,但是似乎并没有起作用。我也试过在几个Node.js版本上(我希望能在6.10.3 Node.js - 3.10.10 npm上工作),但是都不能成功。

有办法强制npm生成package-lock.json文件吗?


3
我认为package-lock.json是特定于npm 5的。 - Brett Merrifield
8
从npm的v5版本开始,package-lock.json会自动生成,默认情况下会生成该文件。在之前的版本中,锁定文件名为npm-shrinkwrap.json,需要手动使用npm shrinkwrap命令来生成。请注意保持原文意思不变,使翻译更加通俗易懂。 - alexmac
1
@BrettMerrifield 谢谢!那就是我的问题。我升级到了 node 8.6.0npm 5.3.0,然后它就可以工作了。 - Big Money
1
检查你的.gitignore文件。我不小心把package-lock.json加入了.gitignore,因此package-lock.json没有出现在git status中,这让我感到困惑。 - Joshua Pinter
我们如何使用YARN实现这个目标? - Kartiikeya
yarn install --mode update-lockfile 对于 yarn, pnpm i --lockfile-only 对于 pnpm。通过 https://dev59.com/ylcP5IYBdhLWcg3wa5TQ - cachius
7个回答

578

在 npm 6.x 和 7.x 中,你可以使用

npm i --package-lock-only
根据 npm v6npm v7最新版本文档: --package-lock-only参数仅会更新package-lock.json,而不会检查node_modules和下载依赖包。

39
现在这是正确的答案,其他的已经过时并且不可行。 - Vaibhav Singh
有什么办法可以生成不包含devDependencies的package-lock.json吗?我需要这个来进行干净的生产安装。npm i --package-lock-only --only=production好像不能实现这个功能。 - Robert
我认为不可能仅为生产依赖项生成package-lock.json。但是,如果您运行npm i --only=production,它应该只安装生产依赖项。因此,您的构建过程可能如下所示:安装所有依赖项,构建应用程序,删除node_modules并仅安装生产依赖项。 - Janusz Przybylski
如果你想将一个旧项目从 yarn.lock 中移出来,这非常有帮助。谢谢。 - Clayton Bell
5
请确保您运行答案中列出的命令,而不是没有两个破折号的 npm i package-lock-only,否则您将安装一个名为“package-lock-only”的软件包。你能猜到我是怎么发现的吗? - Shawn

243

默认情况下,每次运行 npm install 时都会更新 package-lock.json。但是,可以通过在 ~/.npmrc 中设置 package-lock=false 来全局禁用此功能。

当启用全局 package-lock=false 设置时,仍然可以通过运行以下命令来强制更新项目的 package-lock.json 文件:

npm install --package-lock

这个命令是强制更新 package-lock.json 文件的唯一可靠方式。


@RonNewcomb 你能分享更多信息吗?你所说的“它不起作用”是什么意思?你使用的是哪个npm版本? - Mathias Bynens
npm 版本 3.10.10,Node 版本 6.10.3。你列出的命令似乎是一个无操作命令?没有任何反应,没有错误,没有文件更改,什么都没有发生。 - Ron Newcomb
2
如果您的项目使用npm v3,那么您将不会有package-lock.json文件。package-lock.json仅受npm v5+支持。 - Mathias Bynens
12
npm 版本号为 6.4.1,并且该版本不会生成 package-lock.json 文件。 - mjuopperi
1
对我来说它有效,在6.4.1版本中。将其设置为false也可以防止它创建一个。 - Kevin B
显示剩余2条评论

18

这个问题已在评论中得到回答;package-lock.jsonnpm v5及以上版本的一个特性。在所有版本的 npm 中,你可以使用 npm shrinkwrap 命令来创建锁定文件。


1
请注意,package-lock.json文件并不完全等同于收缩包文件。 - strugee
8
在npm 5及以上版本中,实际上它们完全相同,包括每一个细节,除了一点:npm-shrinkwrap.json将被发布到注册表中,而package-lock.json则不会。 - LJHarb
7
没错,这是一个非常重要的区别,这就是为什么我留下了我的评论。 - strugee
2
npm shrinkwrap 会生成 npm-shrinkwrap.json 文件,但是如何生成 package-lock.json 文件呢? - Vic
6
在npm 5及以上版本中,它是自动完成的,或者您可以使用--package-lock选项强制实现它。 - LJHarb
@Vic 只需将 npm-shrinkwrap.json 重命名为 package-lock.json。它们具有相同的格式。 - BoomShadow

3
如果您和我一样,尝试了这里的所有答案,却发现在Git的“更改文件”中没有出现package-lock.json,那么请检查以确保过去没有人将package-lock.json添加到.gitignore中!这并不是直接的答案,但也许能帮助其他花费太长时间的人。

2
几个答案已经解释了,你应该运行:
npm i
但是,如果这不能解决问题...
检查你的 npm 可执行文件的版本。 (对我来说,它是 3.x.x,并不使用 package-lock.json (完全不使用))
npm -v
它应该至少是 5.x.x (引入了 package-lock.json 文件)
要在 Linux 上更新 npm,请按照这些说明操作。
有关软件包文件的更多详细信息,请阅读此 medium 的故事。

0

在处理本地包时,我发现可靠地重新生成 package-lock.json 文件的唯一方法是删除它,以及链接模块中的所有对应 node_modules 文件夹,并让其使用 npm i 重新生成。


-1
如果你的 npm 版本低于 5,那么请安装更高版本以获得自动生成 package-lock.json 的功能。 示例:将当前的 npm 升级到版本 6.14.0(例如 - 您可以选择任何其他最新版本)。
npm i -g npm@6.14.0

您可以通过以下方式查看最新的npm版本列表:

npm view npm versions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接