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

时间:2013-04-18 02:39:05

标签: javascript node.js npm

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

最简单的方法是什么?

我现在知道的最好方法是运行npm info express version,然后手动更新每个包。必须有更好的方法。

{
  "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作为此问题的全面解决方案。享受!

34 个答案:

答案 0 :(得分:2086)

看起来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。它将列出任何已安装的具有较新版本的依赖项。

答案 1 :(得分:942)

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 

答案 2 :(得分:336)

TLDR; (针对较新的NPM版本更新)

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

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

较旧的npm:npm-check-updates包+ npm shrinkwrap

一定要收缩你的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 -rf node_modules
$ npm install 

最后,使用npm-shrinkwrap.json

将精确版本保存到npm shrinkwrap
$ rm npm-shrinkwrap.json
$ npm shrinkwrap

现在,npm install现在将使用npm-shrinkwrap.json

中的确切版本

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

这是一种从开发过渡(所有更新,始终)到生产(无人接触)的方法。

答案 3 :(得分:175)

要将一个依赖关系更新为最新版本而无需手动打开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为shell添加了一行内容。有关代码和说明,请参阅the edit


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

答案 4 :(得分:76)

如果您正在使用Visual Studio Code作为您的IDE,这是一个有趣的小扩展,可让您更新package.json一次点击过程。

Version Lense

enter image description here

答案 5 :(得分:56)

这适用于npm 1.3.15。

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

答案 6 :(得分:46)

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

答案 7 :(得分:37)

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

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

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

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

答案 8 :(得分:35)

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

npm outdated

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

npm install yourPackage@latest --save

例如:

我的package.json文件具有依赖性:

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

然后我应该写:

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

答案 9 :(得分:32)

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

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

npm upgrade example

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

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

npm install -g npm-upgrade

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

npm-upgrade

答案 10 :(得分:21)

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

语义版本正则表达式

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

如何使用

在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

答案 11 :(得分: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更新为最新版本。

  3. 更新到最新版本。您可以使用npm-check-updates

答案 12 :(得分: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

答案 13 :(得分:12)

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

这不是锤子,它为您提供了更多有关依存关系更新的知识并对其进行控制。

下面是一个屏幕截图(从git页面中删除以进行npm-check),以让您了解正在等待的内容:

enter image description here

答案 14 :(得分:10)

Updtr!

  

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

https://github.com/peerigon/updtr

答案 15 :(得分: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

答案 16 :(得分:8)

我必须使用的命令来更新package.json的{​​{1}}:

NPM 3.10.10

背景:

我使用的是来自@ josh3736的最新命令,但我的npm install -g npm-check-updates ncu -a npm install 未更新。然后我在运行package.json时注意到了说明文字:

  

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

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

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

  

-u, - upgrade:覆盖包文件

     

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

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

npm-check-updates -u

答案 17 :(得分:8)

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

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

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

答案 18 :(得分:7)

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

使用Yarn而不是npm的更多理由。嘿。

答案 19 :(得分:6)

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

yarn upgrade --latest

来自docs

  

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

答案 20 :(得分:5)

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

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

答案 21 :(得分:3)

如果您使用npm 5和节点8

,请尝试以下命令

npm update --save

答案 22 :(得分:2)

无附加包的解决方案

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

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

然后运行npm update --save

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

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

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

如果您仍想“更新”未更改*,则必须从node_modules文件夹中删除这些模块。

e.g。删除node_modules/react-google-maps

最后再次运行npm update --save

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

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

答案 23 :(得分:2)

如果您正在寻找一种不涉及安装npm软件包的简单解决方案,我将结帐updatepackagejson.com

updatepackagejson.com

答案 24 :(得分:2)

替代方案是

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

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

答案 25 :(得分:2)

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

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

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

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

"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。点击“全部替换”。输出是这样的:

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

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

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

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

答案 26 :(得分:2)

我通过查看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

答案 27 :(得分:1)

Greenkeeper如果你正在使用Github。 https://greenkeeper.io/

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

greenkeeper PR 1 greenkeeper PR 2

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

另一个替代方案是https://dependencyci.com/,但我没有对其进行密集测试。在第一次看之后,Greenkeeper在一般的IMO中看起来更好,并且具有更好的集成。

答案 28 :(得分:1)

如果您不想安装全局npm-check-updates,只需运行以下命令即可:

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()))"

答案 29 :(得分:1)

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

我做了什么:

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

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

答案 30 :(得分:1)

  • npm已过时
  • npm update

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

答案 31 :(得分:0)

到目前为止,最简单的方法是使用pnpm而不是npm,只需键入:

pnpm update --latest

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

答案 32 :(得分:0)

使用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 -i lru-cache",
        "npm-check-u-g": "npm-check \"C:\\Program Files\\nodejs\\node_modules\\npm\" -y -g -i lru-cache",
        "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/462347

答案 33 :(得分:0)

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

  2. 使用npm update执行安全的依赖项升级。

  3. 使用npm install @latest升级到软件包的最新主版本。

  4. 使用npx npm-check-updates -u和npm install将所有依赖项升级到其最新的主要版本。