我可以从 package-lock.json 重新创建 node_modules 吗?

Posted

技术标签:

【中文标题】我可以从 package-lock.json 重新创建 node_modules 吗?【英文标题】:Can I re-create node_modules from package-lock.json? 【发布时间】:2019-03-11 13:44:56 【问题描述】:

我从 github 克隆了一个包含 package-lock.json(但没有 package.json)的存储库。然后在 git bash 终端中,我转到目录并运行 npm install 但我只收到一条消息说没有 package.json 然后 package-lock.json 中的所有内容都被删除,所以它基本上是空的,除了项目名称和版本。

我认为在目录中运行带有 package-lock.json 的 npm install 足以重新创建 node_modules,但我是否严重误解了它的工作原理?顺便说一句,我有节点 8.12.0 和 npm 6.4.1,并且在 Windows 10 上运行。另外,我认为 package-lock.json 是在 unix 系统上创建的,所以在使用 package-lock.json 时可能会出现问题不同的操作系统?

我已经尝试运行 npm init 只是为了获取 package.json 文件,然后运行 ​​npm install 但这仍然没有让我得到 node_modules 文件夹。

【问题讨论】:

你可以试试这个包:npmjs.com/package/auto-install - 它不完全是它的用途,但如果你生成一个空的 package.json 文件然后运行它,它会将依赖项添加到它,所以你可以运行 npm install。 感谢确实有效。 auto-install 确实将依赖项添加到一个空的 package.json 中,甚至无需运行 npm install 就可以下载这些包。这似乎是一种奇怪的解决方法。我仍然不明白为什么npm install 不能查看 package-lock.json 并从中下载依赖项。 哦,太好了。您介意我将其添加为答案然后让您接受吗? 好的,继续。从技术上讲,您的解决方案并没有真正回答原始问题,因为它看起来像 auto-install 甚至不需要 package-lock.json,但它确实解决了我最初的问题,即如何在 node_modules 中获取正确的包,所以我可以接受它. 【参考方案1】:

package-lock.json记录了需要安装的包的确切版本和url,因此您可以使用npm进行相应的安装:

npm 可以从指向 tarball 的 url 安装 --no-package-lock 选项告诉 npm 不要触摸 package-lock.json 文件

例如要安装package-lock.json中的所有包:

cat package-lock.json | jq '.dependencies[].resolved' | xargs npm i --no-package-lock

jq是解析jq的命令行工具,你可以写一个简单的javascript shell来解析它(如果你不想安装jq或者学习jq的查询语法)。

【讨论】:

【参考方案2】:

从 2018 年 3 月 5 日起,您可以运行 npm ci 来安装 package-lock.json 中的软件包。

npm ci 绕过包的 package.json 从 包的锁文件。

https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

【讨论】:

在 6.9.0 中尝试不会这样做。 @RuiDC npm ci 从 v5.7.0 开始就存在 blog.npmjs.org/post/171139955345/v570 npm ci 将比较package.jsonpackage-lock.json,因此如果package.json 不存在,它将拒绝运行。【参考方案3】:

AFAIK,package-lock.json 文件依赖于package.json 文件的存在,因此您将无法单独从package-lock.json 文件重新创建node_modules 文件夹(很高兴在这里被证明是错误的) .

因此,最好的办法是(错误地)使用像 auto-install 这样的模块,该模块能够根据项目的依赖关系生成 package.json 文件,因为它们出现在文件中。

全局安装它(npm install -g auto-install),然后您需要生成一个空的package.json 文件才能运行(在项目根目录中使用npm init -y)。使用命令auto-install 开始,它应该将依赖项添加到package.json 文件中。

HTH

【讨论】:

以上是关于我可以从 package-lock.json 重新创建 node_modules 吗?的主要内容,如果未能解决你的问题,请参考以下文章

删除 `package-lock.json` 以快速解决冲突

如何从 package-lock.json 文件制作 package.json [重复]

切换到 pnpm 时可以删除 package-lock.json 吗?

npm install没有创建一个新的package-lock.json

package.json 与 package-lock.json 的区别

如果 `redux` 不在 package.json 或 package-lock.json 或 node_modules 中,为啥从 'redux' 导入任何东西仍然有效?