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

How do I update each dependency in package.json to the latest version?

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

最简单的方法是什么?

我现在知道的最好方法是运行npm info express version,然后手动为每个包更新package.json。一定有更好的办法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
 "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:6年后,我仍然保持NPM检查更新作为这个问题的全面解决方案。享受!


看起来NPM检查更新是实现这一点的唯一方法。

1
2
3
npm i -g npm-check-updates
ncu -u
npm install

NPM<3.11时:

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

之前:

1
2
3
4
5
6
7
8
 "dependencies": {
   "express":"*",
   "mongodb":"*",
   "underscore":"*",
   "rjs":"*",
   "jade":"*",
   "async":"*"
  }

后:

1
2
3
4
5
6
7
8
 "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。它将列出所有可用更新版本的已安装依赖项。


npm-check-updates是一个实用程序,它可以用所有依赖项的最新版本

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

1
2
3
$ npm install -g npm-check-updates
$ ncu -u
$ npm install

[编辑]如果您有一个现代化版本的npm,那么这样做的侵入性稍小(避免全局安装)的方法是:

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


TLDR;(更新为新的NPM版本)

自从这些答案最初被写出来之后,情况有了一些变化。

NPM 2+:npm outdated+npm update+npm shrinkwrap。旧NPM:npm-check-updates包+npm shrinkwrap

一定要收缩你的部门,否则你可能会以一个死项目结束。前几天我拿出了一个项目,但没有运行,因为我的部门都过时了/更新了/一团糟。如果我收缩包装,新产品经理将完全安装我需要的。

细节

对于那些到此为止的好奇者,以下是我的建议:

使用npm-check-updatesnpm outdated推荐最新版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
# `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,我收到一些依赖警告)

1
2
$ rm -rf node_modules
$ npm install

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

1
2
$ rm npm-shrinkwrap.json
$ npm shrinkwrap

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

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

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

  • NPM过时

  • NPM检查更新

  • NPM包覆膜

P.S.Sharn正在将你的包裹列表发送到Facebook。


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

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

1
npm install express@* --save

供参考,NPM安装

正如用户vespakoen在拒绝的编辑中所指出的,也可以通过这种方式一次更新多个包:

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

他还为基于npm outdated的壳体安装了一个内衬。有关代码和说明,请参见编辑。

附言:我也不喜欢为那样的事情手动编辑package.json;)


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

版本Lense

enter image description here


自NPM 1.3.15起生效。

1
2
3
"dependencies": {
 "foo":"latest"
}


  • 使用*作为最新版本的版本,包括不稳定
  • 使用latest作为最新稳定版本的版本定义
  • 使用LatestStablePackages使用最新的稳定版本号修改package.json。
  • 下面是一个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    "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检查更新实用程序。我的小组使用了这个工具,它通过安装稳定的更新有效地工作。

    如上所述:安装并运行:

    1
    2
    3
    $ npm install -g npm-check-updates
    $ npm-check-updates -u
    $ npm install


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

    1
    npm outdated

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

    1
    npm install yourPackage@latest --save

    例如:

    我的package.json文件具有相关性:

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

    那么我应该写:

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


    我真的很喜欢NPM升级的工作方式。它是一个简单的命令行实用程序,可以遍历所有依赖项,并允许您查看与最新版本相比的当前版本,如果需要,还可以进行更新。

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

    npm upgrade example

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

    编辑:要清除这是一个第三方软件包,在命令生效之前需要安装它。它本身不附带NPM:

    1
    npm install -g npm-upgrade

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

    1
    npm-upgrade


    这里有一个基本的regex来匹配语义版本号,这样您就可以用星号快速替换它们。

    语义版本regex

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

    。如何使用

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

    screenshot:select the text you want to replace

    输入上面的regex并验证它是否匹配正确的文本。

    氧化镁

    用星号替换所有匹配项。

    氧化镁

    运行npm update --save


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

    更新EDOCX1[2]

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

  • 运行npm update。这将基于semver将dependencies package.json更新为最新版本。

  • 更新到最新版本。你可以和npm-check-updates一起去


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

    1
    2
    3
    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将每个库名一次一个放入一个npm install LIBRARYNAME --save-dev命令中

    以上就是我在机器上运行的原因:节点=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安装的)

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

    然后我用一个简单的

    1
    npm outdated --depth=0

    此外,还可以使用

    1
    npm list --depth=0


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

    它不是一个锤子,它给你更多的相关知识和控制,你的依赖更新。

    为了让您体验一下这里等待的是什么,这里有一个屏幕截图(从git页面上刮下来进行NPM检查):

    氧化镁


    UPDTR!

    Based on npm outdated, updtr installs the latest version and runs npm test for each dependency. If the test succeeds, updtr saves the new version number to your package.json. If the test fails, however, updtr rolls back its changes.

    https://github.com/peerigon/updtr


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

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

    enter image description here

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

    1
    2
    3
    4
    5
    6
    npm cache clean
    rm -rf node_modules/
    npm i -g npm npm-check-updates
    ncu -g #update globals
    ncu -ua #update locals
    npm i


    从NPM 5.2.0版开始,有一种方法可以在一行中运行它,而无需向全局NPM注册表或本地安装任何附加包。这可以通过利用与NPM捆绑在一起的新npx实用程序来实现。(单击此处了解更多信息。)

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

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


    用于更新NPM 3.10.10package.json的命令:

    1
    2
    3
    npm install -g npm-check-updates
    ncu -a
    npm install

    背景:

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

    The following dependency is satisfied by its declared version range,
    but the installed version is behind. You can install the latest
    version without modifying your package file by using npm update. If
    you want to update the dependency in your package file anyway, run ncu
    -a.

    阅读NPM检查更新的文档,您可以看到不同之处:

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

    -u, --upgrade: overwrite package file

    -a, --upgradeAll: include even those dependencies whose latest version satisfies the declared semver dependency

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

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


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

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


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

    埃多克斯1〔23〕

    从他们的文档中:

    The upgrade --latest command upgrades packages the same as the upgrade command, but ignores the version range specified in package.json. Instead, the version specified by the latest tag will be used (potentially upgrading the packages across major versions).


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

    • 使用npm shrinkwrap命令将实际的当前节点模块版本设置为package.json。
    • 如果每个依赖项未使用https://github.com/bahmutov/next-update命令行工具中断测试,请将其更新为最新版本
    1
    2
    3
    npm install -g next-update
    // from your package
    next-update


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

    NPM更新—保存


    无附加包的解决方案

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

    1
    2
    3
    4
    "dependencies": {
       "react":"*",
       "react-google-maps":"*"
      }

    然后运行npm update --save

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

    1
    2
    3
    4
    "dependencies": {
       "react":"^15.0.1",
       "react-google-maps":"*"
      }

    这是一个棘手的部分,这意味着你的本地版本的"反应"比最新版本低。在这种情况下,NPM下载并更新了"react"包。但是,您的本地版本的"反应谷歌地图"与最新版本相同。

    如果仍要"更新"未更改的*,则必须从node_modules文件夹中删除这些模块。

    例如删除node_modules/react-google-maps

    最后再次运行npm update --save

    1
    2
    3
    4
    "dependencies": {
       "react":"^15.0.1",
       "react-google-maps":"^4.10.1"
      }

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


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

    1
    2
    3
    4
    $ 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


    备选方案是

    1
    2
    3
    "dependencies":{
       "foo" :">=1.4.5"
    }

    每次使用NPM更新时,它都会自动更新到最新版本。有关更多版本语法,请访问:https://www.npmjs.org/doc/misc/semver.html


    下面的代码(已被接受)给我写了一些类似"太长的废话",什么也没做。可能使用全局标志是问题所在,IDK。

    1
    2
    3
    npm i -g npm-check-updates
    ncu -u
    npm install

    我决定使用我的文本编辑器,改为使用半手动方法。

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

    1
    2
    3
    4
    "browserify":"10.2.6",
    "expect.js":"^0.3.1",
    "karma":"^0.13.22",
    "karma-browserify":"^5.2.0",

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

    1
    2
    3
    4
    5
    6
    7
    8
    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并点击enter。一切都升级了,运转良好。这就是全部。

    1
    2
    3
    4
    "browserify":"^16.1.0",
    "expect.js":"^0.3.1",
    "karma":"^2.0.0",
    "karma-browserify":"^5.2.0",

    我不认为这有什么大不了的,因为你只需要偶尔做一次,但是你可以很容易地编写一个脚本,解析package.json并升级你的包。我认为这样做更好,因为如果您需要一些特殊的东西,例如保持当前版本的lib,您可以编辑您的列表。


    如果你用的是Github的话。https://greenkeeper.io网站/

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

    氧化镁氧化镁

    在底部,您可以看到第一个构建最初失败了,在提交("升级到节点v6.9")之后,测试通过了,所以我最终可以合并pr。也有很多emoji。

    另一种选择是https://dependencyci.com/,但我没有进行深入测试。乍一看,在国际海事组织看来,绿色保持者总体上看起来更好,而且更具融合性。


    • NPM过时
    • NPM更新

    应该为你的应用程序提供最新的兼容版本。但不是最新版本。


    我找到了新版本的NPM的另一个解决方案。我要做的是用显式的最新版本号替换所有"*"依赖项。讨论的方法对我来说都不管用。

    我所做的:

  • 将所有"*"替换为"^0.0.0"
  • 运行npm-check-updates -u
  • package.json中的所有内容现在都更新到最新版本。


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

    埃多克斯1〔2〕

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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    {
       "_cmd-update-modules":"npm run devops-update-modules",
       "scripts": {
           "create-global-node-modules-folder":"if not exist "%appdata%\
    pm\
    ode_modules" mkdir %appdata%\
    pm\
    ode_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\
    odejs\
    ode_modules\
    pm" -y -i lru-cache",
           "npm-check-u-g":"npm-check "C:\\Program Files\
    odejs\
    ode_modules\
    pm" -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