npm检查并在需要时更新软件包

847
我们需要将Karma测试运行程序集成到TeamCity中,为此,我想编写一个小脚本(PowerShell或其他语言),该脚本可以:
  1. 从某个配置文件中获取所需的版本号(我认为可以将其作为注释放在karma.conf.js中)

  2. 检查npm全局存储库中是否安装了定义的Karma运行程序版本

  3. 如果未安装或安装的版本较旧,则选择并安装正确的版本

  4. 运行它:karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run

因此,我的真正问题是:“如何在脚本中检查是否安装了所需的软件包版本?”。您应该进行检查,还是每次调用npm -g install都是安全的? 我不希望始终检查和安装最新可用版本,因为其他配置值可能会变得不兼容

有一个在线更新/分析工具 https://pkgui.com/npm 请参考此答案 https://dev59.com/gmQo5IYBdhLWcg3wbexJ#76342980 - ztom
npm upgrade... 我不知道什么是 "Team City",但对于其他只使用 Node.js 的人来说,你可以运行 npm upgrade - undefined
21个回答

1208

检查项目中是否有任何旧模块:

npm outdated
'outdated' 命令会检查 package.json 中定义的每个模块,看是否在 NPM 注册表中存在更新版本。例如,假设当前项目中位于 node_modules 中的 xml2js 0.2.6 版本已过期,因为存在更新版本(0.2.7),则您将看到:
xml2js@0.2.7 node_modules/xml2js current=0.2.6

如果您确定这是需要的,可以使用update命令更新所有依赖项:

npm update

或者,要更新单个依赖项,例如 xml2js

npm update xml2js

要更新 package.json 的版本号,请添加 --save 标记:

npm update --save

12
小心使用 npm update,特别是使用 npm update -g ... 它并不像大多数人期望的那样做!请参见:https://github.com/npm/npm/issues/6247 和 https://gist.github.com/othiym23/4ac31155da23962afd0e - jbandi
12
npm@2.6.1版本开始,npm -g update命令又可以安全地使用了。详情请参见:https://github.com/npm/npm/issues/6247#issuecomment-92182814 - Chuck Le Butt
23
请注意,正如@Erik Olson所述的答案,npm update不会更新您的package.json文件。 - Ehtesham Hasan
29
npm@5.0.0 开始,'npm update' 命令会将 package.json 文件中的新版本保存为最低要求的依赖。 - Sidney
6
我刚刚在我的npm 5.6.0上运行了npm update命令,结果导致所有代码都出问题了;幸运的是,在这之前我已经备份了我的文件。 - Armand

540

npm outdated会识别需要更新的包,npm update <package name>可以用来更新每个包。但是在npm@5.0.0之前,npm update <package name>不会更新package.json中的版本,这是一个问题。

最佳的工作流程是:

  1. 使用npm outdated识别过时的包
  2. 更新package.json中的版本
  3. 运行npm update安装每个包的最新版本

查看npm-check-updates以帮助完成这个工作流程。

  • 使用npm i npm-check-updates -g安装npm-check-updates
  • 运行npm-check-updates列出过期的软件包(与运行npm outdated基本相同)
  • 运行npm-check-updates -u更新package.json中的所有版本(这是魔法酱)
  • 像往常一样运行npm update,根据更新后的package.json安装新版本的软件包

或者更简单地使用npx,这样您就不必全局安装任何东西:

npx npm-check-updates -u
npm install

7
npm outdated 会显示所有的包,包括其他包里面的包,但是这些包不会通过这个命令更新,所以它们将一直显示为过期状态。因此,最好使用 npm-check-updates(正如你之前建议的那样),它只会显示 package.json 中的主要包,这更加相关。 - davidhq
3
使用yarn工具升级软件包非常简单,只需输入“yarn upgrade”即可。 - Christopher Grigg
160
为什么我必须安装一个更新管理器来管理我的软件包管理器?我们不认为这很荒谬吗?应该像“npm install --all-outdated”一样简单,但实际上并不是这样... - ADJenks
9
您可以始终运行npm update --save package_name将最新的更改保存到package.json文件中。 - trungk18
3
@ADJenks 因为 npm-check-updates 根据 semver 进行主要更新,这可能会导致破坏性更改,而 npm update 仅进行安全的次要和补丁更新。请参阅:https://dev59.com/5lUM5IYBdhLWcg3wY_e2#48917961 - João Pimentel Ferreira
显示剩余9条评论

219

还有一个名为npm-check的“新鲜”模块:

npm-check

检查过时、不正确和未使用的依赖项。

npm-check屏幕截图

它还提供了一种方便的交互式方式来使用npm-check -u更新依赖项。


151

只需要一步:

$ npm i -g npm-check-updates && ncu -u && npm i

就这样。package.json中的所有包版本将是最新的major versions。

编辑:

这里发生了什么?

  1. 安装一个能为你检查更新的包。

  2. 使用该包升级package.json中的所有包版本(-u代表--updateAll)。

  3. 安装所有新版本的包。


5
ncu 表示 Node Check Updates,而 -a 是“升级所有 (upgradeAll)”选项。您可以在此处找到所有选项:https://www.npmjs.com/package/npm-check-updates - Arian Acosta
2
如果我想在一行代码中完成,而不使用像ncu这样的其他包,该怎么办? - ADJenks
13
若不进行全局安装,则可使用命令 npx -p npm-check-updates ncu -u 进行更新。 - entozoon
2
npm-check-updates 根据 semver 进行主要更新,这可能会导致破坏性变化。请谨慎使用:https://dev59.com/5lUM5IYBdhLWcg3wY_e2#48917961 - João Pimentel Ferreira

83
  • 更新单个本地包的方法如下:

    1. 首先通过以下命令找出您过时的包:

      npm outdated

    2. 然后手动更新要更新的包或者单个包,命令如下:

      npm update --save <package_name>

这样,就不需要手动更新 package.json 文件。

请注意,上述命令将把您的包更新到最新版本。

  • 如果您在 package.json 文件中指定了版本号,并执行以下命令:

    npm update <package_name>

    在这种情况下,您将获得与您在 package.json 文件中指定的版本相对应的下一个稳定版本(期望版本)。

使用 npm list <package_name> 命令可以查找您本地包的当前版本。


48
你可以尝试以下两种选项之一:
  1. 检查过时的软件包

  2. npm outdated
    

    npm过时的

  3. 检查并选择要更新的软件包

    npx npm-check -u
    

    npx npm-check -u


31

不需要安装其他软件,只需运行以下命令即可检查过时的npm包并更新:

npm install $(npm outdated | cut -d' ' -f 1 | sed '1d' | xargs -I '$' echo '$@latest' | xargs echo)


10
这是一个很好的答案,因为可以将其放入任何shell脚本中来自动化此步骤,而无需依赖于安装任何其他软件包。 - Jankapunkt
1
@Jankapunkt 是的,对于那些遇到这个问题的人,我使用了所有上面赞数更高的答案,但对我来说都没有解决这个 bug。在这种情况下,这个答案真的很好地解决了它!所以只需使用这个就是一个非常好的答案(在 Bash 终端上测试过)。 - Laaouatni Anas

25

NPM命令以更新或者修复某些依赖清单文件中的漏洞

  • 使用以下命令检查您的节点模块是否过时或存在漏洞。

    npm audit

  • 如果发现任何漏洞,请使用以下命令修复所有问题。

    npm audit fix

  • 如果它对您不起作用,请尝试

    npm audit fix -f,此命令将几乎解决所有漏洞。由于一些依赖项或devDependencies已锁定在 package-lock.json 文件中,因此我们使用 -f 标志来强制更新它们。

  • 如果您不想使用强制审核修复,则可以通过在 package-lock.json package.json 文件中更改它们来手动修复依赖版本。然后运行

npm update && npm upgrade


我运行了 npm audit fix --force。现在比之前有更多的漏洞。我可以再次运行它,但是它不会改变。现在怎么办? - Thomas Weller

8
安装npm包(无论是全局还是本地),您可以使用@version语法来定义要安装的特定版本。
换句话说,执行以下操作: npm install -g karma@0.9.2 将确保只安装0.9.2版,如果已经存在,则不会重新安装。
作为建议,我建议尽可能避免全局npm安装。许多人没有意识到,如果依赖项定义了bin文件,则会安装到./node_modules/.bin/。通常,很容易使用在package.json中定义的已安装模块的本地版本。实际上,npm脚本会将./node_modules/.bin添加到您的路径中。
例如,这是一个package.json,当我运行npm install && npm test时,将安装在我的package.json中定义的karma版本,并在运行test脚本时使用该karma版本(安装在node_modules/.bin/karma)。
{
 "name": "myApp",
 "main": "app.js",
 "scripts": {
   "test": "karma test/*",
 },
 "dependencies": {...},
 "devDependencies": {
   "karma": "0.9.2"
 }
}

这样做的好处是,您可以通过package.json定义要使用的karma版本,而无需将该配置全局保存在CI服务器上。

2
test脚本里面有什么内容?你能否给我一些提示,如何使用脚本进行安装? - iLemming
3
看一下 package.json 文件,在 "scripts" 属性下,你可以定义另一个属性 "test",其值是你想在输入 npm test 命令时运行的命令。npm 文档在这里非常好:https://npmjs.org/doc/scripts.html。 - addisonj

7
从npm@5.0.0+版本开始,您可以简单地执行以下操作:
npm update <package name>

这将自动更新package.json文件,我们不需要手动更新最新版本,然后使用npm update <package name>。您仍然可以使用旧的行为。
npm update --no-save

(参考资料)


5
我使用的是 npm@7.21.1,但它没有自动更新我的 package.json。运行 npm update <package name> --save 也没有帮助! - Farzan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接