【问题标题】:npm install vs. update - what's the difference?npm install 与 update - 有什么区别?
【发布时间】:2012-09-10 19:34:31
【问题描述】:

npm installnpm update 之间的实际区别是什么?我什么时候应该使用哪个?

【问题讨论】:

    标签: node.js npm


    【解决方案1】:

    npm update: 使用 package.json 中最新的节点模块进行安装和更新

    npm install: 安装 package.json 中定义的节点模块(不更新)

    【讨论】:

    • 使用 npm 版本 6.9.0 我观察到以下行为:npm update 将省略 package-lock.json 中的大量依赖项。为了使所有必需的包都可用并且package-lock.json 正确,我总是必须在npm update 之后立即执行npm install
    【解决方案2】:

    npm install 安装package.json 文件中列出的所有模块及其依赖项。

    npm update 更新node_modules 目录中的所有包及其依赖项。

    npm install express 仅安装 express 模块及其依赖项。

    npm update express 更新 express 模块(从 npm@2.x 开始,它不会更新其依赖项)。

    因此,更新适用于您已经拥有该模块并希​​望获得新版本的情况。

    【讨论】:

    • 如果您没有在 package.json 文件中指定特定版本,npm install 将获取模块的最新版本。所以这是一种更新。
    • 那么我应该使用什么,npm installnpm update?或者,换句话说,我现在正在使用npm install,它似乎也在进行更新,有什么理由我应该使用npm update
    • 所以update 将始终更新到最新版本,而不管package.json,而install 将尊重package.json 中给出的版本?
    • update 安装(或更新到)最新版本的模块。 install 安装最新版本的模块,如果它没有出现,否则保持当前版本。
    • @Borek npm update 将根据您的 package.json 更新到最新版本,而不是不管它。如果您有 "express": "3.x" 并且您使用的是 3.1.0 版本,它将更新为最新的 3.x 标签。如果有4.x版本,不会安装最新的。
    【解决方案3】:

    npm installnpm update处理package.json中指定的包版本的区别:

    {
      "name":          "my-project",
      "version":       "1.0",                             // install   update
      "dependencies":  {                                  // ------------------
        "already-installed-versionless-module":  "*",     // ignores   "1.0" -> "1.1"
        "already-installed-semver-module":       "^1.4.3" // ignores   "1.4.3" -> "1.5.2"
        "already-installed-versioned-module":    "3.4.1"  // ignores   ignores
        "not-yet-installed-versionless-module":  "*",     // installs  installs
        "not-yet-installed-semver-module":       "^4.2.1" // installs  installs
        "not-yet-installed-versioned-module":    "2.7.8"  // installs  installs
      }
    }
    

    总结:唯一的大区别是一个已经安装的带有模糊版本控制的模块 ...

    • npm install 忽略
    • npm update 更新

    另外installupdate 默认处理 devDependencies 的方式不同

    • npm install安装/更新 devDependencies,除非添加--production 标志
    • npm update忽略 devDependencies 除非添加--dev 标志

    为什么要使用npm install

    因为npm install 除了处理package.json 中的依赖项外,还可以做更多事情。 正如您在npm install 中看到的,您可以...

    • 手动安装节点模块
    • 使用npm install -g <name>将它们设置为全局(将它们放入shell的PATH
    • 安装 git 标签描述的某些版本
    • 从 git url 安装
    • 使用--force 强制重新安装

    【讨论】:

    • 那么~1.3 呢?
    • 如果版本像^5.0.9怎么办?是否可以让npm install --save somePackage 将 * 保存到依赖项?
    • 我还要注意像 postinstall 这样的脚本在安装时运行,但在更新时不运行。
    • 如果 installupdatepackage.json 中指定的 git URL、git 标签等上的工作方式不同,那么最好将这些情况添加到示例中。
    • @BoyanKushlev 我认为您的意思是次要和补丁/错误修复,而不是主要和次要。对于所有示例,专业都是 1。
    【解决方案4】:

    已经提到了许多区别。这里还有一个:

    在源目录顶部运行 npm install 将运行各种脚本:prepublishpreinstallinstallpostinstall。根据这些脚本的作用,npm install 可能会比仅仅安装依赖项做更多的工作。

    我刚刚有一个用例,其中prepublish 将调用make,而Makefile 旨在在package.json 得到更新时获取依赖项。从Makefile 中调用npm install 会导致无限递归,而调用npm update 工作得很好,安装所有依赖项以便即使直接调用make 也可以继续构建。

    【讨论】:

    • 一个含义是,如果您更新了redis 模块,而other_module 需要旧版本的redisnpm install other_module 将保证other_module 将使用旧版本。必要时可加other_module/node_modules/redis
    【解决方案5】:

    在大多数情况下,这将安装在 npm 上发布的模块的最新版本。

    npm install express --save
    

    或更好地将模块升级到最新版本使用:

    npm install express@latest --save --force
    

    --save: 包会出现在你的依赖中。

    更多信息:npm-install

    【讨论】:

    • npm install express@latest --save --force 正是我想要的。
    • 在大多数情况下?还有其他情况吗?
    猜你喜欢
    • 2017-08-04
    • 2019-02-07
    • 2019-01-27
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多