如何将package.json中的每个依赖项更新到最新版本?

我从另一个项目中复制了package.json,现在想将所有依赖项都添加到最新版本,因为这是一个新项目,如果它坏了,我不介意修复一些东西。

最简单的方法是什么?

我知道的最好的方法是运行npm info express version,然后手动更新package.json中的每个依赖项。一定有更好的方法。

{"name": "myproject","description": "my node project","version": "1.0.0","engines": {"node": "0.8.4","npm": "1.1.65"},"private": true,"dependencies": {"express": "~3.0.3", // how do I get these bumped to latest?"mongodb": "~1.2.5","underscore": "~1.4.2","rjs": "~2.9.0","jade": "~0.27.2","async": "~0.1.22"}}

对于纱线特定解决方案,请参阅这个堆栈溢出线程。

1304080 次浏览

看起来npm-check更新项目名称是现在实现这一目标的唯一方法。

npm i -g npm-check-updatesncu -unpm install

在npm<3.11时:

只需将每个依赖项的版本更改为*,然后运行npm update --save.(备注:在最近(3.11)版本的npm中被破坏)。

之前:

  "dependencies": {"express": "*","mongodb": "*","underscore": "*","rjs": "*","jade": "*","async": "*"}

之后:

  "dependencies": {"express": "~3.2.0","mongodb": "~1.2.14","underscore": "~1.4.4","rjs": "~2.10.0","jade": "~0.29.0","async": "~0.2.7"}

当然,这是更新依赖关系的钝器。如果-正如你所说-项目是空的,没有任何东西可以破坏,那也没关系。

另一方面,如果您在一个更成熟的项目中工作,您可能希望在升级之前验证您的依赖项中没有重大更改。

要查看哪些模块已过时,只需运行#0。它将列出具有较新版本可用的所有已安装依赖项。

对于纱线特定解决方案,请参阅这个StackOverflow答案

这是从npm 1.3.15开始的。

"dependencies": {"foo": "latest"}

npm-check-updates是一个自动调整package.json的实用程序所有依赖项的最新版本

https://www.npmjs.org/package/npm-check-updates

$ npm install -g npm-check-updates$ ncu -u$ npm install

[编辑]如果你有npm的现代版本,一个稍微不那么侵入性(避免全局安装)的方法是:

$ npx npm-check-updates -u$ npm install

替代方案是

"dependencies":{"foo" : ">=1.4.5"}

每次使用npm更新时,它会自动更新到最新版本。有关更多版本语法,您可以在此处查看:https://www.npmjs.org/doc/misc/semver.html

我最近不得不更新几个使用npm和package.jsongruntfile.js的项目。以下bash命令(多行命令)对我很有效:

npm outdated --json --depth=0 | \jq --ascii-output --monochrome-output '. | keys | .[]' | \xargs npm install $1 --save-dev

这里的想法:将npm outdated输出作为json管道传输到jq
(jq是一个json命令行解析器/查询工具)
(注意npm outdated使用--depth参数)
jq将把输出减少到只有顶级包名称。
最后,xargs将每个LIBRARYNAME一次一个放入npm install LIBRARYNAME --save-dev命令

以上是我在机器运行时的工作:node=v0.11.10 osx=10.9.2 npm=1.3.24

这需要:
xargshttp://en.wikipedia.org/wiki/Xargs(我相信我的机器原生)

jqhttp://stedolan.github.io/jq/(我用brew install jq安装了它)

注意:我只使用--save-dev将更新的库保存到json键devDependancies中的package.json,这是我的项目的要求,很可能不是你的。

之后我检查一切都是肉汁用一个简单的

npm outdated --depth=0

此外,您可以检查当前安装的顶级库版本

npm list --depth=0

要将一个依赖项更新到其最新版本,而无需手动打开package.json并更改它,您可以运行

npm install {package-name}@* {save flags?}

npm install express@* --save

此流程与工作区兼容,即。

npm --workspace some/package install express@*

作为参考,是否安装npm-install


说明:某些npm版本可能需要最新标志,即npm install express@latest


正如用户韦斯帕克孔在被拒绝的编辑中指出的那样,也可以通过这种方式一次更新多个包:

npm install --save package-nave@* other-package@* whatever-thing@*

他还为基于npm outdated的shell配置了一个单行程序。有关代码和解释,请参阅的编辑


PS:我也讨厌手动编辑package.json这样的事情;)

上述命令是不安全的,因为您可能会在切换版本时破坏模块。我推荐以下内容

  • 使用npm shrinkwrap命令将实际当前节点模块版本设置为package.json。
  • 使用https://github.com/bahmutov/next-update命令行工具将每个依赖项更新到最新版本,如果它没有破坏您的测试
npm install -g next-update// from your packagenext-update
  1. 使用*作为最新版本的版本,包括不稳定的版本
  2. 使用latest作为最新稳定版本的版本定义
  3. 使用#0完全使用最新的稳定版本号修改package.json

下面是一个例子:

"dependencies": {"express": "latest"  // using the latest STABLE version,   "node-gyp": "latest",   "jade": "latest",   "mongoose": "*" // using the newest version, may involve the unstable releases,   "cookie-parser": "latest",   "express-session": "latest",   "body-parser": "latest",   "nodemailer":"latest",   "validator": "latest",   "bcrypt": "latest",   "formidable": "latest",   "path": "latest",   "fs-extra": "latest",   "moment": "latest",   "express-device": "latest"},

我在上面找到的最佳答案的唯一警告是它将模块更新到最新版本。这意味着它可能会更新到不稳定的alpha版本。

我将使用npm-check-更新实用程序。我的小组使用这个工具,它通过安装稳定的更新有效地工作。

正如Etienne上面所说:安装并运行:

$ npm install -g npm-check-updates$ npm-check-updates -u$ npm install

更新为npm v2+

npm 2+(节点0.12+):

npm outdatednpm updategit commit package-lock.json

古代npm(大约2014年):

npm install -g npm-check-updatesnpm-check-updatesnpm shrinkwrapgit commit package-lock.json

一定要收缩包装你的deps,否则你最终可能会得到一个死项目。前几天我拉出了一个项目,它不会运行,因为我的deps都过时了/更新了/一团糟。如果我收缩包装,npm会安装我需要的东西。


详情

对于好奇的人来说,这是我的建议:

使用npm-check-updatesnpm outdated建议最新版本。

# `outdated` is part of newer npm versions (2+)$ npm outdated# If you agree, update.$ npm update
#       OR
# Install and use the `npm-check-updates` package.$ npm install -g npm-check-updates# Then check your project$ npm-check-updates# If you agree, update package.json.$ npm-check-updates -u

###然后做一个干净的安装(没有rm,我有一些依赖警告)

$ rm -rf node_modules$ npm install

最后,使用npm shrinkwrap将精确版本保存到npm-shrinkwrap.json

$ rm npm-shrinkwrap.json$ npm shrinkwrap

现在,npm install现在将使用npm-shrinkwrap.json中的确切版本

如果您将npm-shrinkwrap.json签入git,所有安装都将使用完全相同的版本。

这是一种从开发(所有更新,所有时间)过渡到生产(没有人接触任何东西)的方法。

p. s.Yarn正在将您的包裹列表发送到Facebook.

这是一个匹配语义版本号的基本正则表达式,因此您可以快速将它们全部替换为星号。

语义版本正则表达式

([>|<|=|~|^|\s])*?(\d+\.)?(\d+\.)?(\*|\d+)

如何使用

在JSON文件中选择要替换的包版本。

截图:选择要替换的文本

输入上面的正则表达式并验证它是否匹配正确的文本。

截图:输入上面的semver正则表达式

用星号替换所有匹配项。

截图:用星号替换包版本

运行npm update --save

无需额外软件包的解决方案

将每个依赖项的版本更改为*

"dependencies": {"react": "*","react-google-maps": "*"}

然后运行npm update --save

您的一些软件包已更新,但有些没有?

"dependencies": {"react": "^15.0.1","react-google-maps": "*"}

这是棘手的部分,这意味着您的本地版本的“反应”低于最新版本。在这种情况下,npm下载并更新了“反应”包。然而,您的本地版本的“反应-谷歌地图”与最新版本相同。

如果您仍然希望“更新”不变*,则必须从node_modules文件夹中删除这些模块。

例如删除node_modules/react-google-maps

最后再次运行npm update --save

"dependencies": {"react": "^15.0.1","react-google-maps": "^4.10.1"}

如果要更新开发依赖项,请不要忘记运行npm update --save-dev

更新!

基于npm过时,updtr安装最新版本并为每个依赖项运行npm测试。如果测试成功,updtr将新版本号保存到您的package.json.如果测试失败,但是,updtr回滚其更改。

https://github.com/peerigon/updtr

如果您使用的是Github.https://greenkeeper.io/

这是一个Github集成,设置起来非常容易。安装后,它会自动在你指定的存储库中创建拉取请求(或者如果需要的话),并保持你的代码始终是最新的,而不会强迫你手动做任何事情。然后,PR应该触发CI服务上的构建,根据成功或失败的检查,你可以继续找出触发问题的原因,或者当CI通过时,只需合并PR。

绿色守护者PR 1绿色守护者PR 2

在底部,您可以看到第一次构建失败,并且在提交(“升级到节点v6.9”)之后测试通过,因此我最终可以合并PR。也带有很多表情符号。

另一种选择是https://dependencyci.com/,但是我没有深入测试它。在第一次看之后,GreenKeeper在一般IMO中看起来更好,并且具有更好的集成。

  • npm已过期
  • npm更新

应该为您提供与您的应用程序兼容的最新所需版本。但不是最新版本。

如果您碰巧使用Visual Studio代码作为您的IDE,这是一个有趣的小扩展,使更新package.json成为一键式过程。

note:更新package.json文件中的包后,运行npm update安装新版本。

版本镜头

在此处输入图片描述

GitLab仓库

我使用npm-check来实现这一点。

npm i -g npm npm-checknpm-check -ug #to update globalsnpm-check -u #to update locals

输入图片描述

另一个有用的命令列表,它将在package.json中保留确切的版本号

npm cache cleanrm -rf node_modules/npm i -g npm npm-check-updatesncu -g #update globalsncu -u #update localsnpm I

更新时间:如果您使用yarn,则可以使用yarn upgrade-interactive --latest

此功能已在npm v5中引入。使用npm install -g npm@latestnpm install -g npm@latest更新到npm

更新package.json

  1. 删除/node_modulespackage-lock.json (if you have any)

  2. 运行npm update.这将更新依赖package.json到最新的,基于semver

更新到最新版本。你可以用npm-check-updates

如果您使用的是yarn#1是一个非常时尚的工具,可以让您查看过时的依赖项,然后选择要更新的依赖项。

更多使用Yarn超过npm的理由。呵呵。

如果您使用npm 5和node 8,请尝试以下命令

npm更新保存

我真的很喜欢更新项目的工作方式。它是一个简单的命令行实用程序,可以遍历您的所有依赖项,让您查看当前版本与最新版本的比较,并根据需要进行更新。

以下是在项目根目录(package.json文件旁边)运行npm-upgrade后发生的事情的屏幕截图:

npm升级示例

对于每个依赖项,您可以选择升级、忽略、查看更改日志或完成流程。到目前为止,它对我来说非常有效。

需要明确的是,这是一个第三方包,需要在命令生效之前安装。它本身没有附带npm:

npm install -g npm-upgrade

然后从具有package.json文件的项目的根:

npm-upgrade

我必须用来为NPM 3.10.10更新package.json的命令:

npm install -g npm-check-updatesncu -anpm install

背景:

我使用了来自@josh3736的最新命令,但我的package.json没有更新。然后我在运行npm-check-updates -u时注意到描述文本:

以下依赖项由其声明的版本范围满足,但已安装的版本落后。您可以安装最新的版本,而不使用npm更新修改包文件。如果你想更新包文件中的依赖项,运行ncu-a.

阅读npm-check更新的留档,你可以看到区别:

https://www.npmjs.com/package/npm-check-updates

-u,--升级:覆盖包文件

-a,--升级所有:甚至包括那些最新版本满足声明的semver依赖项的依赖项

ncu是npm-check-updates的别名,如键入npm-check-updates -u时的消息所示:

[INFO]: You can also use ncu as an alias

要查看哪些包具有可用的较新版本,请使用以下命令:

npm outdated

要仅更新一个依赖项,只需使用以下命令:

npm install yourPackage@latest

例如:

我的package.json文件有依赖项:

"@progress/kendo-angular-dateinputs": "^1.3.1",

那么我应该写:

npm install @progress/kendo-angular-dateinputs@latest

--save-dev是什么意思

npm install @progress/kendo-angular-dateinputs@latest --save-dev

正如npm install docs所说:

-D,--save-dev:包将出现在您的devDepend的。

下面的代码(被接受)给我写了一些类似“它需要太长的时间”之类的东西,但什么也没做。可能使用全局标志是问题所在,idk。

npm i -g npm-check-updatesncu -unpm install

我决定使用我的文本编辑器并遵循半手动方法。

我从我的package.json的开发依赖项复制了一个这样的列表(只是长了很多)到记事本++文本编辑器:

"browserify": "10.2.6","expect.js": "^0.3.1","karma": "^0.13.22","karma-browserify": "^5.2.0",

我将搜索模式设置为正则表达式,使用^\s*"([^"]+)".*$模式获取包名并将其替换为npm uninstall \1 --save-dev \nnpm install \1 --save-dev。单击“全部替换”。otput是这样的:

npm uninstall browserify --save-devnpm install browserify --save-devnpm uninstall expect.js --save-devnpm install expect.js --save-devnpm uninstall karma --save-devnpm install karma --save-devnpm uninstall karma-browserify --save-devnpm install karma-browserify --save-dev

我把它复制回bash并按回车键。一切都升级了,工作正常。仅此而已。

"browserify": "^16.1.0","expect.js": "^0.3.1","karma": "^2.0.0","karma-browserify": "^5.2.0",

我认为这没什么大不了的,因为你必须时不时地这样做,但是你可以很容易地编写一个脚本,它解析package.json并升级你的包。我认为这样更好,因为如果你需要一些特别的东西,你可以编辑你的列表,例如保留当前版本的lib。

如果您使用的是YARN,则以下命令会将所有软件包更新为其最新版本:

yarn upgrade --latest

从他们的文档

upgrade --latest命令升级包与升级命令相同,但忽略package.json.中指定的版本范围,而是使用最新标记指定的版本(可能跨主要版本升级包)。

我通过查看https://github.com/tjunnone/npm-check-updates的说明解决了这个问题

$ npm install -g npm-check-updates$ ncu$ ncu -u # to update all the dependencies to latest$ ncu -u "specific module name"  #in case you want to update specific dependencies to latest

如果你想通过一个漂亮的(终端)交互式报告界面使用温和的方法,我建议使用npm检查

它不是锤子,而是给你更多关于依赖项更新的相应知识和控制。

为了让您了解等待的内容,这里有一个屏幕截图(从npm-check的git页面抓取):

在此处输入图片描述

从npm版本5.2.0开始,有一种方法可以在单行中运行它,而无需将任何额外的包安装到您的全局npm注册表或本地应用程序。这可以通过利用与npm捆绑的新npx实用程序来完成。(点击这里了解更多。

在项目的根目录中运行以下命令:

npx npm-check-updates -u && npm i

使用NPM脚本可以自动更新:

{"_cmd-update-modules": "npm run devops-update-modules","scripts": {"create-global-node-modules-folder": "if not exist \"%appdata%\\npm\\node_modules\" mkdir %appdata%\\npm\\node_modules","npm-i-g": "npm i npm@latest -g","npm-check-i-g": "npm i npm-check@latest -g","eslint-i-g": "npm i eslint@latest -g","npm-check-u-l": "npm-check \"C:\\Program Files\\nodejs\\node_modules\\npm\" -y","npm-check-u-g": "npm-check \"C:\\Program Files\\nodejs\\node_modules\\npm\" -y -g","npm-deep-update-l": "npm update --depth 9999 --dev","npm-deep-update-g": "npm update --depth 9999 --dev -g","npm-cache-clear": "npm cache clear --force","devops-update-modules": "npm run create-global-node-modules-folder && npm run npm-i-g && npm run npm-check-i-g && npm run eslint-i-g && npm run npm-check-u-l && npm run npm-check-u-g && npm run npm-deep-update-l && npm run npm-deep-update-g && npm run npm-cache-clear"}}

有关更多详细信息和分步手册:https://stackoverflow.com/a/34295664

我为最近版本的NPM找到了另一种解决方案。我想做的是用明确的最新版本号替换所有“*”依赖项。讨论的方法都不适合我。

我做了什么:

  1. 将所有“*”替换为“^0.0.0”
  2. 运行npm-check-updates -u

现在package.json所有内容都更新到最新版本。

从今天开始,最简单的方法是使用pnpm而不是npm,只需输入:

pnpm update --latest

https://github.com/pnpm/pnpm/releases/tag/v3.2.0

如果你不想安装全局npm-check更新项目名称,你可以简单地运行它:

node -e "const pk = JSON.parse(require('fs').readFileSync('package.json', 'utf-8'));require('child_process').spawn('npm', ['install', ...Object.keys(Object.assign({},pk.dependencies, pk.devDependencies)).map(a=>a+'@latest')]).stdout.on('data', d=>console.log(d.toString()))"

如果你正在寻找一个不涉及安装npm包的更简单的解决方案,我会检查updatepackagejson.com

updatepackagejson.com

安全更新

  1. 使用'npm out'来发现过时的依赖项。

  2. 使用'npm更新'执行安全的依赖升级。

  3. 使用'npm install@最新'升级到包的最新主要版本。

突发更新

  1. 使用'npx npm-check-更新-u'。

  2. 'npm install'将所有依赖项升级到其最新的主要版本。

我很疯狂,90%的答案是“usenpm-check-updates”的某种变体。这是我所做的(相关代码):

{"devDependencies": {"updates": "^13.0.5" // the version here could be "latest" or "*" tbh...},"scripts": {"test:dependencies": "updates --update ./",}}

运行npm run test:dependencies(或依赖更新脚本的任何名称)将检查package.json中列出的每个包的最新版本,它会让您知道最新版本何时发布。之后运行npm i,您将获得最新信息!

此外,与#0不同,#1没有依赖关系(在这篇文章的时候,ncu有29个)。

这可以帮助npm outdated | awk '{ if (NR>1) {print $1"@"$4} }' | xargs npm i

扩展@kozlovd回答我构建了一个bash脚本来更新任何npm脚本,只需两步:

  1. 如果您收到错误,这会为您提供npm包的数量。
    npm list | wc -l

  2. 这里将NUM_PKGS替换为包的数量,如果您在前面的命令中出现“UNMET DEPENDENCY”错误,则将2美元替换为4美元。

NUM_PKGS=9999; npm list --no-unicode | awk -v NUM_PKGS=$NUM_PKGS '{\if (NR>1 && NR <NUM_PKGS) {\pver=A[split($2,A,"@")];\print substr($2,0,length($2)-length(pver))"latest";\}\}' | xargs -r npm i

解释:
命令N2首先获取包名称,并且仅在出现“UNMET DEPENDENCY”错误时对它们进行操作,然后awk遍历每个包名称,它获取版本值并将其替换为“最新”,最后所有替换版本的包都由xargs收集,他们在“npm i”之后将它们连接起来,最终使用最新版本安装所有这些包。
此步骤可以使用没有设置版本或现有项目的包更新新项目

由于距离最初的问题已经快10年了,许多答案要么已经过时,要么不推荐。

我会使用与包管理器无关的东西,即可以与npm、pnpm、YARN或其他东西一起工作。

最近我一直在使用taze

您可以将其添加到您的开发依赖项并从那里运行,也可以使用npx tazepnpx taze等在不安装的情况下运行。