【问题标题】:Is there a pip freeze equivalent for Node and NPM?Node 和 NPM 是否有等效的 pip freeze ?
【发布时间】:2021-10-05 05:30:52
【问题描述】:

这在 Python 中是惯用的:

pip freeze > requirements.txt
pip install -r requirements.txt

第一个命令将需求列表保存到文件中。然后稍后您可以使用该命令将需求安装到您的环境中。

Node 有 npm install,但我不知道如何将我的依赖项状态转储到 package.json。我用谷歌搜索发现this

npm ls | grep -E "^(├|└)─" | cut -d" " -f2 | awk '{FS = "@"; print "\""$1"\"", ":", "\""$2"\""}'

但正如这条管道的作者所建议的那样,一定有更好的方法吗?我在这里想念什么?

我只想将我当前的部门转储到 package.json 中。正如https://npmjs.org/doc/shrinkwrap.html 所说,

如果要使用“npm install”,仍然需要“package.json”文件。

我浏览了shrinkwrap 上的信息,但我不知道如何使用shrinkwrap 简单地完成这项任务。

【问题讨论】:

  • 对于任何在 2021 年及以后阅读本文的人,npm/yarn 现在都有可以完成此操作的锁定文件。

标签: node.js npm


【解决方案1】:

这是我得到的最接近的

npm freezelol

npm ls | grep -E "^(├|└)─" | cut -d" " -f2 | awk -v quote='"' 'BEGIN { FS = "@" } ; { print quote $1 quote,":",quote $2 quote"," }' | sed -e 's/ :/:/g'

输出是这样的

  "bower": "1.3.12",
  "chai": "2.1.2",
  "cucumber": "0.4.8",

仍然需要修剪最后的尾随逗号,但已经非常接近了!

【讨论】:

  • @JohanLAJILIlajili.com 是的!
  • 上述命令的增强版分别生成依赖项和devDependencies部分:npm-freeze
  • @kn_pavan 如何运行这个npm-freeze?
  • 将函数添加到 shell 脚本并从终端获取它。并在项目根目录调用 npm-freeze
【解决方案2】:

您可以使用npm init 从当前安装的包中创建一个 package.json。然后您可以轻松移动 package.json 并简单地执行 npm install 将软件包安装到您想要的任何位置。

【讨论】:

  • 如果安装的软件包没有--save--save-dev 开关,如何更新package.json?
  • 您可以手动添加它们或使用保存选项运行npm update / install。请注意您提供的版本(如果您不提供版本,则为最新版本)作为依赖项进入 json。
  • 我的意思是,如何自动更新它:P — 我知道我可以编辑文件;)
  • @JanuszSkonieczny 你有什么办法吗?
【解决方案3】:

这可能对你有用。 npm shrinkwrap

npm shrinkwrap

【讨论】:

  • 对于偶然的上下文,递归锁定依赖关系有点过于激进(npm init 不会这样做),但谢谢这很有用。
  • 是的,我一般都会去把依赖的依赖去掉,真的应该是命令上的一个flag。
  • npm init 为我工作,并获取了现有的依赖项(来自node_modules 文件夹)
  • 这个答案似乎不完整。最初的问题表明他“浏览了有关收缩包装的信息”。问题不仅仅是冻结依赖项的问题,而是 npm 实际上需要 package.json 和 shrinkwrap。这个答案应该在某个地方包含npm init 作为答案的 package.json 部分。
【解决方案4】:

这是解析npm ls的替代命令的较短版本:

npm ls | grep -o "\S\+@\S\+$" | tr @ ' ' | awk -v q='"' '{print q$1q": "q"^"$2q","}'

这是一个值得添加到你的 shell rc 文件中的别名:

alias npm-freeze='npm ls | grep -o "\S\+@\S\+$" | tr @ " " | awk -v q='\''"'\'' '\''{print q$1q": "q"^"$2q","}'\'''

然后运行它:

npm-freeze

输出如下:

"backbone": "^1.3.2",
"underscore": "^1.8.3",
"bootstrap": "^3.3.6",
"bootstrap-sass": "^3.3.6",
"grunt": "^0.4.5",

要过滤,只需将其输入grep,例如

$ npm-freeze | grep grunt
"grunt": "^0.4.5",
"grunt-cli": "^0.1.13",
"grunt-contrib-watch": "^0.6.1",
"grunt-sass": "^1.1.0",
"load-grunt-tasks": "^3.4.1",

以下是将输出保存到package.json 并运行npm install 的示例:

printf "{\n"\""name"\"": "\""npm-freeze"\"",\n"\""dependencies"\"": {\n$(npm-freeze | grep grunt | head -c -2)\n}\n}" | tee package.json && npm install

【讨论】:

    【解决方案5】:

    它似乎通过package-lock.json 内置到 NPM 版本 6+ 中 https://docs.npmjs.com/cli/v7/configuring-npm/package-lock-json

    【讨论】:

    • 是的。这应该是这些天公认的答案。同样适用于纱线用户的 yarn.lock。
    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2021-02-26
    • 2023-01-16
    • 1970-01-01
    • 2015-01-21
    • 2017-05-06
    • 2020-11-30
    相关资源
    最近更新 更多