从命令行更新具有固定依赖关系的npm包

时间:2015-10-26 10:33:00

标签: npm

我有一个带有更新的固定版本的npm包 示例package.json extract:

devDependencies: {
   "someFixedVersionPackage": "1.0.0", //1.1.0 is latest
   "anotherFixedVersionPackage": "2.3.2", //2.3.4 is latest
}

是否存在安装该软件包的最新版本并更新package.json的npm命令,最好是一次更新所有软件包?

为了清楚起见,除了要更新的包本身之外,我希望将上面的package.json片段更新为此内容:

devDependencies: {
   "someFixedVersionPackage": "1.1.0", //latest
   "anotherFixedVersionPackage": "2.3.4", //latest
}

谢谢。

3 个答案:

答案 0 :(得分:18)

为什么npm update不在这里工作?

根据npm update上的文档:

  

此命令将更新所有列出的最新版本的软件包(由标记配置指定),尊重semver。

     

它还将安装缺少的包。与安装软件包的所有命令一样, - dev标志也会导致devDependencies被处理。

由于您的软件包是使用固定版本定义的,因此update子命令不会更新那些尊重semantic versioning的软件包。因此,如果为每个包指定了更大的版本范围,它将仅自动更新您的包。请注意,在npm项目中通常指定一个松散范围版本;一个旨在避免破坏变化,但仍留有改进和修复的空间。

仍然,为什么我不应该在package.json中修复依赖版本?

  

但它们是固定的,因为我想要它们。在测试较新版本之后,我想通过命令行更新它们。

拥有固定版本的依赖项列表并不意味着安装的依赖项将始终相同,因为依赖项的依赖项很可能也会使用版本范围进行定义。为了跟踪经过测试的版本标记的依赖项列表,npm提供了另一种机制:package locks

在npm的第5版之前,你可以创建一个" npm-shrinkwrap.json"使用shrinkwrap命令的文件:

  

npm shrinkwrap

     

此命令会锁定程序包依赖项的版本,以便您可以准确控制安装程序包时将使用的每个依赖项的版本。

从下午5点开始," package-lock.json"当npm操作修改" node_modules"时自动生成树或" package.json"。

这些软件包锁中的任何一个都不会修改package.json,而是覆盖npm install的默认行为,安装与锁定指定版本的依赖关系,在创建或手动更新时。通过这种方式,现在可以扩展您的依赖项,而不会有依赖项安装未经测试的软件包版本的风险。

Shrinkwraps用于发布包。收缩包装:

  1. 在程序包根目录中运行npm install以安装所有依赖项的当前版本。
  2. 验证包是否按预期使用这些版本。
  3. 运行npm shrinkwrap,将npm-shrinkwrap.json添加到git,然后发布您的包。
  4. 此时,可以在package.json中放松依赖版本(这有望在每次主要依赖项更新时完成),以便稍后可以使用npm update随意更新:

    "devDependencies": {
       "someFixedVersionPackage": "^1.0.0",
       "anotherFixedVersionPackage": "^2.3.2",
    }
    

    可以使用package-lock.json文件代替shrinkwrap,更适合再现开发环境。它也应该提交到存储库。

    那么如何更新我的依赖项?

    调用npm update将执行上述操作:在尊重语义版本控制的同时更新依赖关系。要在包中添加或升级依赖项:

    1. 在程序包根目录中运行npm install以安装所有依赖项的当前版本。
    2. 添加或更新依赖项。 npm install --save每个新的或更新的包单独更新package.json,以及现有的包锁(" package-lock.json"和" npm-shrinkwrap.json&#34 )。请注意,必须明确命名它们才能安装:不带参数的npm install只会重现锁定的依赖项。
    3. 使用新的依赖项验证包是否按预期工作。
    4. 提交新的包锁。
    5. 此外,以下是从具有固定依赖项的项目平滑过渡的一些提示:

      • 如果您还没有这样做,请通过在版本说明符或插入符号~之前添加波浪号(^)来扩展版本范围。然后,npm update将尝试分别安装所有修补程序修订版和次要修订版(主要版本0是一个角落案例,请参阅文档)。例如," ^ 1.0.0"现在可以更新为" ^ 1.1.0"和" ~2.3.2"可以更新为" ~2.3.4"。添加--save--save-dev标志也会更新" package.json"使用已安装的版本(同时保留以前的范围说明符)。

      • 运行npm outdated以检查哪些软件包已过时。红色条目将使用npm update自动更新。其他参赛作品需要人工干预。

      • 对于具有主要版本颠簸的软件包,请安装具有版本规范的软件包(例如npm install browserify@11.2.0 --save-dev)。更新可能出现的其他问题必须手动处理。通常有助于阅读该软件包上的新闻源或发布历史记录,以进一步了解以前版本中的更改。

      这还不够简单,还有另外一种方法吗?

      在继续之前,总是值得一提的是,由于某种原因,软件包具有符合SemVer的版本定义。应该避免盲目地安装每个包的最新版本。虽然可以使用这样的完整更新can be done和工具,但建议谨慎一些。例如,如果剩余的React组件和库与react@15.x.x不兼容,则不希望安装React 15。另见npm的博文:Why use SemVer?

      我会抓住机会。还有哪些其他工具?

      仅举几例:

      • npm-check-updates将执行问题中最初提出的问题:安装并更新所有依赖项的版本,而不管给定的范围约束。但是,这将是这项工作中推荐最少的工具。
      • 如果项目的测试失败,
      • updtr将逐个更新依赖关系并回滚到之前的版本,这可以节省测试覆盖率良好的项目的时间。
      • npm-check提供了一个交互式命令行界面,可让您轻松选择要更新的包。

      这与npm 5有什么不同?

      从主要版本5开始,npm将自动创建"package-lock.json",这将填充在收缩包装不存在时指定依赖关系树的角色。可以在package-locks documentation中找到更详细的描述。通常,npm-shrinkwrap.json用于发布时,而package-lock.json用于开发。这就是你应该提交" package-lock.json"到存储库。

      纱线怎么样?

      Yarn是一个兼容npm的依赖管理器,在使用时会自动创建一个锁文件,其行为与npm shrinkwrap类似。无论package.json或锁定文件中记录的版本范围如何,调用yarn upgrade «package»都会将一个依赖项更新为latest标记中的版本。使用yarn upgrade-interactive还允许您有选择地将软件包升级到最新版本,与npm-check不同。

      $ yarn outdated
      yarn outdated v0.16.1
      Package      Current Wanted Latest
      babel-eslint 7.0.0   7.0.0  7.1.0 
      chai         3.0.0   3.0.0  3.5.0 
      Done in 0.84s.
      $ yarn upgrade babel-eslint chai
      yarn upgrade v0.16.1
      [1/4] Resolving packages...
      [2/4] Fetching packages...
      [3/4] Linking dependencies...
      [4/4] Building fresh packages...
      success Saved lockfile.
      success Saved 2 new dependencies.
      ├─ babel-eslint@7.1.0
      └─ chai@3.5.0
      

答案 1 :(得分:2)

我一直在寻找一种简单的方法来更新npm依赖项很长一段时间。然后我找到了这个工具:https://github.com/dylang/npm-check

它会向您显示哪个依赖项已在过时的ui中过时,并允许您更新它们。它甚至会告诉您哪些可能会因重大更改而中断,并警告您未使用的依赖项。

答案 2 :(得分:0)

运行以下命令将执行您想要的操作:

npm install someFixedVersionPackage@latest anotherFixedVersionPackage@latest --save-dev --save-exact

<强>故障:

  • npm install someFixedVersionPackage@latest将安装最新版本的软件包
  • --save-dev标记会使其更新package.json devDependencies
  • 中的版本
  • --save-exact标志将导致它保存固定版本而不是semver范围运算符

链接到npm install docs