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

问题描述 投票:1767回答:32

我从另一个项目中复制了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"
  }
}

更新5/1/19:六年后,我仍然保持npm-check-updates作为这个问题的综合解决方案。请享用!

javascript node.js npm
32个回答
2114
投票

看起来像npm-check-updates是现在实现这一目标的唯一方法。

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

在npm <3.11:

只需将每个依赖项的版本更改为*,然后运行npm update --save。 (注:broken in recent (3.11) versions of 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"
  }

当然,这是更新依赖关系的直言不讳。如果 - 正如你所说的那样 - 项目是空的,没有任何东西可以打破,这很好。

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

要查看哪些模块已过时,只需运行npm outdated。它将列出任何已安装的具有较新版本的依赖项。


32
投票

我真的很喜欢npm-upgrade的工作原理。它是一个简单的命令行实用程序,它遍历所有依赖项,并允许您查看当前版本与最新版本的比较,并根据需要进行更新。

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

npm upgrade example

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

编辑:要清楚这是一个需要在命令工作之前安装的第三方软件包。 npm本身没有:

npm install -g npm-upgrade

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

npm-upgrade

21
投票

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

Semantic Version Regex

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

How to use

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

screenshot:select the text you want to replace

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

screenshot:input the semver regex above

用星号替换所有匹配项。

screenshot:replace package versions with an asterisk

运行npm update --save


14
投票

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

更新package.json

  1. 删除/node_modulespackage-lock.json (if you have any)
  2. 运行npm update。这将基于semver将依赖包package.json更新为最新版本。

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


13
投票

我最近不得不更新几个使用npm和package.json作为gruntfile.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命令行解析器/查询工具) (注意--depth使用npm outdated论证) jq将仅将输出剥离到顶级包名称。 最后,xargs将每个LIBRARYNAME一次放入npm install LIBRARYNAME --save-dev命令

以上是在机器运行中对我有用的东西:node = v0.11.10 osx = 10.9.2 npm = 1.3.24

这要求: xargs http://en.wikipedia.org/wiki/Xargs(我相信我的机器原生) 和 jq http://stedolan.github.io/jq/(我用brew install jq安装了它)

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

之后,我检查一切都很简单

npm outdated --depth=0

此外,您可以使用以下方法检查当前的顶级已安装库版本

npm list --depth=0

12
投票

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

它不是锤子,而是为您提供更多依赖性更新的相关知识和控制权。

为了让您体验一下这里的等待截图(从npm-check的git页面中删除):

enter image description here


10
投票

Updtr!

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

https://github.com/peerigon/updtr


9
投票

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

npm i -g npm npm-check
npm-check -ug #to update globals
npm-check -u #to update locals

enter image description here

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

npm cache clean
rm -rf node_modules/
npm i -g npm npm-check-updates
ncu -g #update globals
ncu -ua #update locals
npm i

8
投票

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

npm install -g npm-check-updates
ncu -a
npm install

背景:

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

声明的版本范围满足以下依赖关系,但安装的版本落后。您可以使用npm update在不修改软件包文件的情况下安装最新版本。如果您想要更新包文件中的依赖项,请运行ncu -a。

阅读npm-check-updates的文档,您可以看到区别:

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

-u, - upgrade:覆盖包文件

-a, - upgradeAll:包括那些最新版本满足声明的semver依赖项的依赖项

ncu是npm-check-updates的别名,如输入npm-check-updates -u时在消息中看到的:

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

8
投票

从npm版本5.2.0开始,有一种方法可以在一行中运行它,而无需在全局npm注册表中安装任何其他软件包,也无需在本地安装任何软件包。这可以通过利用与npm捆绑在一起的新npx实用程序来完成。 (Click here to learn more.

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

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

7
投票

如果你正在使用yarnyarn upgrade-interactive是一个非常时尚的工具,可以让你查看过时的依赖项,然后选择你想要更新的。

npm上使用纱线的更多理由。嘿。


948
投票

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 

6
投票

如果使用yarn,则以下命令将所有包更新为其最新版本:

yarn upgrade --latest

从他们的docs

upgrade --latest命令升级软件包与升级命令相同,但忽略package.json中指定的版本范围。相反,将使用最新标记指定的版本(可能会在主要版本之间升级包)。


5
投票

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

  • 使用npm shrinkwrap命令将实际当前节点模块版本设置为package.json。
  • 将每个依赖项更新到最新版本如果它不使用https://github.com/bahmutov/next-update命令行工具打破您的测试
npm install -g next-update
// from your package
next-update

3
投票

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

npm update --save


2
投票

替代方案是

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

每次使用npm update时,它都会自动更新到最新版本。有关更多版本的语法,您可以在此处查看:qazxsw poi


2
投票

解决方案无需额外包

将每个依赖项的版本更改为https://www.npmjs.org/doc/misc/semver.html

*

然后运行"dependencies": { "react": "*", "react-google-maps": "*" }

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

npm update --save

这是棘手的部分,这意味着你的本地版本“反应”低于最新版本。在这种情况下,npm下载并更新了“react”包。但是,您当地版本的“react-google-maps”与最新版本相同。

如果您仍想“更新”未更改的"dependencies": { "react": "^15.0.1", "react-google-maps": "*" } ,则必须从*文件夹中删除这些模块。

EG分享越狱。

终于再次运行node_modules

node_modules/react-google-maps

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


2
投票

下面的代码(已被接受)给我写了一些类似“它需要太长时间的等等”并且什么也没做。可能使用全球旗帜是问题,idk。

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

我决定使用我的文本编辑器,而是采用半手动方法。

我从npm update --save-dev的dev依赖项到notepad ++文本编辑器复制了一个这样的列表(只是更长):

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

我将搜索模式设置为正则表达式,使用package.json模式获取包名称并将其替换为"browserify": "10.2.6", "expect.js": "^0.3.1", "karma": "^0.13.22", "karma-browserify": "^5.2.0", 。点击“全部替换”。输出是这样的:

^\s*"([^"]+)".*$

我把它复制回bash并点击回车。一切都升级,工作正常。就这样。

npm uninstall \1 --save-dev \nnpm install \1 --save-dev

我不认为这是一个大问题,因为你必须时不时地做,但你可以轻松编写一个脚本,解析npm uninstall browserify --save-dev npm install browserify --save-dev npm uninstall expect.js --save-dev npm install expect.js --save-dev npm uninstall karma --save-dev npm install karma --save-dev npm uninstall karma-browserify --save-dev npm install karma-browserify --save-dev 并升级你的包。我认为这种方式更好,因为如果需要特殊的东西,可以编辑列表,例如保留当前版本的lib。


2
投票

我通过查看"browserify": "^16.1.0", "expect.js": "^0.3.1", "karma": "^2.0.0", "karma-browserify": "^5.2.0", 的说明解决了这个问题

package.json

2
投票

我找到了最新版NPM的另一种解决方案。我想要做的是用显式最新版本号替换所有“*”依赖项。所讨论的方法都没有对我有用。

我做了什么:

  1. 将所有“*”替换为“^ 0.0.0”
  2. 运行https://github.com/tjunnone/npm-check-updates

package.json中的所有内容现在都更新到最后一个版本。


1
投票

Greenkeeper如果你正在使用Github。 $ 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

这是一个Github集成,非常容易设置。安装后,它会自动在您指定的存储库中创建拉取请求(或者如果需要,则自动创建拉取请求),并使代码始终保持最新,而不必强制您手动执行任何操作。然后PR应该触发CI服务的构建,并且根据成功或失败的检查,您可以继续确定触发问题的原因或CI通过时简单地合并PR。

npm-check-updates -u https://greenkeeper.io/

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

另一种选择是greenkeeper PR 1,但是我并没有对它进行密集测试。在第一次看之后,Greenkeeper在一般IMO中看起来更好,并且具有更好的集成。


1
投票
  • npm过时了
  • npm更新

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


338
投票

TLDR; (updated for newer NPM versions)

由于这些答案最初是写的,所以情况有所改变。

npm 2+: npm outdated+npm update+npm shrinkwrap

Older npm: npm-check-updates package + npm shrinkwrap

一定要收缩你的deps,否则你可能会结束一个死的项目。前几天我拿出了一个项目,它不会运行,因为我的deps已经过时/更新/乱七八糟。如果我收缩包裹,npm就会安装我需要的东西。


Details

对于那些做到这一点的好奇者来说,这就是我的建议:

Use npm-check-updates or npm outdated to suggest the latest versions.

# `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

Then do a clean install (w/o the rm I got some dependency warnings)

$ rm -rf node_modules
$ npm install 

Lastly, save exact versions to npm-shrinkwrap.json with npm shrinkwrap

$ rm npm-shrinkwrap.json
$ npm shrinkwrap

Now, npm install will now use exact versions in npm-shrinkwrap.json

如果你检查npm-shrinkwrap.json到git,所有安装将使用完全相同的版本。

这是一种从开发(所有更新,一直)转变为生产(没有人接触任何东西)的方法。

附: Yarn is sending your package list to Facebook


0
投票

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

greenkeeper PR 2

有关详细信息和分步说明:https://dependencyci.com/


177
投票

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

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

npm install express@* --save

供参考,npm-install


正如用户Vespakoen在拒绝编辑时指出的那样,也可以这样一次更新多个包:

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

他还根据npm outdated为贝壳配置单线程。有关代码和说明,请参阅the edit


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


77
投票

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

Version Lense

enter image description here


56
投票

这适用于npm 1.3.15。

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

46
投票
  1. 使用*作为最新版本的版本,包括unstable
  2. 使用latest作为最新稳定版本的版本定义
  3. 使用LatestStablePackages修改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"
},

37
投票

我发现上面最好的答案唯一的警告是它将模块更新到最新版本。这意味着它可以更新为不稳定的alpha版本。

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

正如Etienne所述:安装并运行:

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

36
投票

要查看哪些软件包具有更新版本,请使用以下命令:

npm outdated

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

npm install yourPackage@latest --save

例如:

我的package.json文件有依赖:

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

那我应该写:

npm install @progress/kendo-angular-dateinputs@latest --save
© www.soinside.com 2019 - 2024. All rights reserved.