如果需要,npm检查和更新包

我们需要将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是安全的?

我不想总是检查和安装最新的可用版本,因为其他配置值可能变得不兼容

723582 次浏览

安装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定义要使用的业力版本,而不必在CI框中全局保留该配置。

要检查项目中的任何模块是否为“旧”:

npm outdated

过时将检查package.json中定义的每个模块,并查看NPM注册表中是否有更新的版本。

例如,假设xml2js 0.2.6(位于当前项目中的node_modules中)已经过时,因为存在更新的版本(0.2.7)。你会看到:

xml2js@0.2.7 node_modules/xml2js current=0.2.6

对于更新所有依赖项,如果您确信这是可取的:

npm update

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

npm update xml2js

要更新package.json版本号,请附加--save标志:

npm update --save

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-check更新项目名称
  • 运行npm-check-updates列出哪些包已过期(基本上与运行npm outdated相同)
  • 运行npm-check-updates -u更新package.json中的所有版本(这是魔法酱)
  • 像往常一样运行npm update以根据更新的package.json安装软件包的新版本

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

npm检查

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

npm-check截图

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

  • 要更新单个本地包:

    1. 首先找出你的过时包:

      npm outdated

    2. 然后手动更新您想要的一个或多个包:

      npm update --save package_name

这样就不必更新您的本地package.json 文件。

请注意,这会将您的包更新到最新版本。

  • 如果您在package.json文件中编写一些版本并执行:

    npm update package_name

    在这种情况下,您将获得有关您在package.json文件中编写的版本的下一个稳定版本(想要的)。

使用npm list (package_name),您可以找到本地软件包的当前版本。

一个简单的步骤:

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

package.json中的所有包版本都将是最新的主要版本。

编辑:

这里发生了什么事?

  1. 安装一个包来检查更新。

  2. 使用此包更新package.json中的所有包版本(-u是--updateAll的缩写)。

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

您可以尝试以下任一选项:

  1. 检查过时的包

    npm outdated
    

    npm

  2. 检查并选择要更新的包

    npx npm-check -u
    

    npx npm-check-u

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

  • 使用以下命令检查节点模块中的过时或漏洞。

    npm audit

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

    npm audit fix

  • 如果它不适合你,那就试试看

    npm audit fix -f,此命令几乎会修复所有漏洞。一些依赖项或devDepend的锁在package-lock.json文件中,所以我们使用-f标志强制更新它们。

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

npm update && npm upgrade

要真正只更新一个包,请安装NCU,然后仅为该包运行它。这将碰撞到真正的最新版本。

npm install -g npm-check-updates


ncu -f your-intended-package-name -u

没有额外的包,只是检查过时并更新那些,这个命令将执行:

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

npm@5.0.0+开始,您可以简单地执行:

npm update <package name>

这将自动更新package.json文件。我们不必手动更新最新版本然后使用npm update <package name>

您仍然可以使用旧的行为

npm update --no-save

参考

另一种方法是首先使用升级package.json文件,

ncu -u

使用上述命令的终端快照 然后简单地运行,

npm install

将所有包更新到最新版本。 ps:它会将所有软件包更新到最新版本,但是如果软件包已经是最新的,则该软件包根本不会受到影响。

还有一个关于bash的:

npm outdated -parseable|cut -d: -f5|xargs -L1 npm i

3个简单的步骤,你可以用来更新所有过时的包

首先,检查哪些包是过时的

sudo npm i -g npm-check-updates

第二,把它们全部准备好

ncu -u

终端的结果将是这样的:

输入图片描述

第三,将它们全部更新。

npm install

就这样了。

只需这样做即可将所有内容更新到最新版本- npx npm-check-updates -u

说明-系统将提示您安装npm-check-updates。按y并输入。

现在运行npm i。你可以走了。

我只是对使用我的package.json中的语义版本控制规则更新过时的包感兴趣。

这里有一句话可以解决这个问题

npm update `npm outdated | awk '{print $1}' | tr '\n' ' '`

它做什么:

  1. npm outdated获取输出并
  2. 管道进入awk,我们只获取包的名称(在第1列)
  3. 然后我们使用tr将换行符转换为空格
  4. 最后——使用反引号——我们使用前面步骤的输出作为npm update的参数,这样我们就可以一次性获得所有需要的更新。

有人会认为有一种方法可以单独使用npm来做到这一点,但当我看的时候它不在这里,所以我只是把它放在这里,以防它对任何人都有帮助😀。

**我相信MikeMajara在这里提供了一个类似的答案,但它将@latest附加到更新的包名称中,作为我定期更新的一部分,我并不真正感兴趣。

如果您想将包升级到最新版本(主要版本、次要版本和补丁版本),请将@latest关键字附加到包名称的末尾,例如:

npm i express-mongo-sanitize@latest

这将更新高速mongo,例如从版本1.2.1版本2.2.0

如果您想知道哪些包已经过时,哪些可以更新,请使用npm outdated命令

例如:

$ npm outdated
Package             Current   Wanted  Latest  Location                         Depended by
express-rate-limit    3.5.3    3.5.3   6.4.0  node_modules/express-rate-limit  apiv2
helmet               3.23.3   3.23.3   5.1.0  node_modules/helmet              apiv2
request-ip            2.2.0    2.2.0   3.3.0  node_modules/request-ip          apiv2
validator           10.11.0  10.11.0  13.7.0  node_modules/validator           apiv2


你可以在2022年完全自动地做到这一点

  1. 安装npm-check更新项目名称

  2. 运行命令

    ncu--医生-u

  3. 它会先尝试每个依赖并运行测试,如果测试失败,它会逐个更新每个依赖并在每次更新后运行测试

如果您有多个具有相同节点模块内容的项目,建议使用pnpm。这将阻止在每个项目中下载模块。安装后,您问题的答案是:

pnpm up