【问题标题】:npm check and update package if needednpm 检查并根据需要更新包
【发布时间】:2013-05-07 16:28:21
【问题描述】:

我们需要将 Karma 测试运行器集成到 TeamCity 中,为此我想给 sys-engineers 小脚本(powershell 或其他什么):

  1. 从某个配置文件中获取所需的版本号(我想我可以将其作为评论放在karma.conf.js 中)

  2. 检查定义版本的 karma runner 是否安装在 npm 的全局 repo 中

  3. 如果不是,或者安装的版本比预期的旧:选择并安装正确的版本

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

所以我真正的问题是:“如果安装了所需的软件包版本,如何签入脚本?”。您应该检查一下,还是每次都拨打npm -g install 就安全了?

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

【问题讨论】:

    标签: node.js teamcity npm karma-runner


    【解决方案1】:

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

    npm outdated
    

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

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

    xml2js@0.2.7 node_modules/xml2js current=0.2.6
    

    update 所有依赖项,如果您确信这是可取的:

    npm update
    

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

    npm update xml2js
    

    【讨论】:

    【解决方案2】:

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

    最好的工作流程是:

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

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

    • 安装npm-check-updates
    • 运行npm-check-updates 列出哪些包已过期(与运行npm outdated 基本相同)
    • 运行npm-check-updates -u 以更新您的package.json 中的所有版本(这是魔法酱)
    • 像往常一样运行 npm update 以根据更新的 package.json 安装新版本的包

    【讨论】:

    • npm outdated 将显示所有包.. 即使在其他包中.. 但这些包不会通过此过程更新,因此它们将始终出现.. 所以只需使用 npm-check-updates (实际上你推荐),它只显示来自package.json 的主要包......这是相关的
    • 使用 yarn 这更容易,只需输入“yarn upgrade”即可。
    • 为什么我必须安装更新管理器来管理我的包管理器?我们不同意这是愚蠢的吗?它应该像npm install --all-outdated 一样简单,但它不是......
    • 您可以随时运行npm update --save package_name 来保存对 package.json 的最新更改。
    • Erik,你能回复this related SO question吗,因为这两个命令之间的区别还是让我有点困惑,即npm update vs npm-check-updates
    【解决方案3】:

    还有一个叫做npm-check的“新鲜”模块:

    npm-检查

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

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

    【讨论】:

      【解决方案4】:

      一个简单的步骤:

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

      就是这样。 package.json 中的所有软件包版本都将是最新的主要版本。

      编辑:

      这里发生了什么?

      1. 安装一个为您检查更新的软件包。

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

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

      【讨论】:

      • @imnickvaughn ncu 代表节点检查更新,-a 是“upgradeAll”选项。在此处查找所有选项:npmjs.com/package/npm-check-updates
      • 如果我想在一行中完成它而不使用像 ncu 这样的另一个包呢?
      • 或者没有全局安装,npx -p npm-check-updates ncu -u
      • npm-check-updates 进行了重大更新,根据semver 的说法,可能会有重大变化。谨慎使用:stackoverflow.com/a/48917961/1243247
      【解决方案5】:
      • 更新单个本地包:

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

          npm outdated

        2. 然后手动更新你想要的包:

          npm update --save package_name

      这样就不需要更新你本地的package.json 文件。

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

      • 如果您在 package.json 文件中编写某个版本并执行以下操作:

        npm update package_name

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

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

      【讨论】:

        【解决方案6】:

        没有额外的包,只检查过时的并更新那些,这个命令就可以了:

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

        【讨论】:

        • 这是一个很好的答案,因为它可以放在任何 shell 脚本中以自动执行此步骤,而无需依赖安装任何其他软件包。
        【解决方案7】:

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

        1. 检查过时的包

          npm outdated
          

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

          npx npm-check -u
          

        【讨论】:

          【解决方案8】:

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

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

            npm audit

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

            npm audit fix

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

            npm audit fix -f,这个命令几乎可以修复所有漏洞。一些依赖或 devDependencies 被锁定在 package-lock.json 文件中,所以我们使用-f 标志来强制更新它们。

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

          npm update && npm upgrade

          【讨论】:

            【解决方案9】:

            在安装 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 版本,并使用该版本的 karma(安装在 node_modules/.bin/karma)运行test 脚本时:

            {
             "name": "myApp",
             "main": "app.js",
             "scripts": {
               "test": "karma test/*",
             },
             "dependencies": {...},
             "devDependencies": {
               "karma": "0.9.2"
             }
            }
            

            这让您的 package.json 受益于定义要使用的 karma 版本,而不必将该配置全局保存在您的 CI 盒中。

            【讨论】:

            • test 脚​​本中有什么内容?你能告诉我你是如何用脚本安装它的吗?
            • 查看 package.json。在“scripts”属性下,您可以定义另一个属性“test”,其值是您希望在键入npm test 时运行的命令。 npm 文档在这里非常好:npmjs.org/doc/scripts.html
            【解决方案10】:

            npm@5.0.0+ 开始,您可以这样做:

            npm update <package name>
            

            这将自动更新package.json文件。我们不用手动更新最新版本再使用npm update &lt;package name&gt;

            您仍然可以使用

            获得旧行为
            npm update --no-save
            

            (Reference)

            【讨论】:

            • 我有npm@7.21.1,它不会自动更新我的package.json。运行npm update &lt;package name&gt; --save 也没有帮助!
            【解决方案11】:

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

            ncu -u
            

            然后简单地运行,

            npm install
            

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

            【讨论】:

              【解决方案12】:

              要真正更新一个包,安装 NCU,然后只为那个包运行它。这将与真正的最新版本相撞。

              npm install -g npm-check-updates
              
              ncu -f your-intended-package-name -u
              

              【讨论】:

              • 低质量的帖子,一些更好的解释会有所帮助。
              【解决方案13】:

              3 个简单的步骤可用于更新所有过时的软件包

              首先,检查过期的包

              sudo npm i -g npm-check-updates

              其次,把它们都准备好

              ncu -u

              终端中的结果会是这样的:

              第三,只需更新所有这些。

              npm install

              就是这样。

              【讨论】:

                【解决方案14】:

                只需执行此操作即可将所有内容更新到最新版本 -

                npx npm-check-updates -u

                注意 - 系统会提示您安装 npm-check-updates。按y 回车。

                现在运行npm i

                你可以走了。

                【讨论】:

                  【解决方案15】:

                  另外一个关于 bash 的:

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

                  【讨论】:

                    【解决方案16】:

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

                    这是一个可以解决这个问题的单线

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

                    它的作用:

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

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

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

                    【讨论】:

                      猜你喜欢
                      • 2018-01-20
                      • 1970-01-01
                      • 2017-12-31
                      • 2019-04-15
                      • 1970-01-01
                      • 2016-03-25
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多