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

2024-05-02

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

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

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

需要明确的是,除了更新包本身之外,我还希望将上面的 package.json 片段更新为此:

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

谢谢。


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

根据文档npm update https://docs.npmjs.com/cli/update:

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

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

由于您的软件包是使用固定版本定义的,因此 update 子命令不会更新那些要遵守的软件包语义版本控制 http://semver.org。因此,只有当您为每个包指定更大的版本范围时,它才会自动更新您的包。请注意,在 npm 项目中,指定松散范围的版本实际上是很常见的;其目的是避免重大更改,但仍留有改进和修复的空间。

不过,为什么我不应该修复 package.json 中的依赖版本?

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

拥有固定版本的依赖项列表并不意味着安装的依赖项将始终相同,因为你的依赖项的依赖项很可能也用版本范围来定义。为了跟踪经过测试的版本标记依赖项列表,npm 提供了另一种机制:包裹锁 https://docs.npmjs.com/files/package-locks.

在 npm 版本 5 之前,您可以使用以下命令创建“npm-shrinkwrap.json”文件shrinkwrap命令:

npm 收缩包装

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

从 npm 5 开始,当 npm 操作修改“node_modules”树或“package.json”时,会自动生成“package-lock.json”。

这些包锁之一将覆盖默认行为,而不是修改 package.jsonnpm install,在创建或手动更新依赖项时安装由锁指定的版本的依赖项。完成此操作后,您的依赖项现在可以扩展,而无需依赖项安装未经测试的软件包版本的风险。

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

  1. Run npm install在包根目录中安装所有依赖项的当前版本。
  2. 验证该包在这些版本中是否按预期工作。
  3. Run npm shrinkwrap,将 npm-shrinkwrap.json 添加到 git,然后发布您的包。

此时,可以在 package.json 中放宽依赖项版本(希望每次主要依赖项更新时只执行一次),以便稍后可以随意更新它们npm update:

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

package-lock.json 文件可以用来代替收缩包装,并且更适合重现开发环境。它还应该提交到存储库。

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

Calling npm update将执行上面提到的操作:更新依赖项,同时尊重语义版本控制。要添加或升级包中的依赖项:

  1. Run npm install在包根目录中安装所有依赖项的当前版本。
  2. 添加或更新依赖项。npm install --save每个新的或更新的包单独更新 package.json 以及现有的包锁(“package-lock.json”和“npm-shrinkwrap.json”)。请注意,必须明确命名它们才能安装:运行npm install不带参数只会重现锁定的依赖关系。
  3. 验证该包是否可以使用新的依赖项按预期工作。
  4. 提交新的包锁。

此外,这里有一些从具有固定依赖项的项目平稳过渡的技巧:

  • 如果您还没有这样做,请通过添加波形符来扩展版本范围 (~ https://docs.npmjs.com/misc/semver#tilde-ranges-1-2-3-1-2-1) 在版本说明符之前,或插入符号 (^ https://docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4). npm update然后将尝试分别安装所有补丁修订版和次要修订版(主要版本0是一个极端情况,请参阅文档)。例如,“^1.0.0”现在可以更新为“^1.1.0”,“~2.3.2”可以更新为“~2.3.4”。添加--save or --save-devflags 还将使用已安装的版本更新“package.json”(同时保留之前的范围说明符)。

  • Run npm outdated检查哪些软件包已过时。红色条目将自动更新为npm update。其他条目将需要手动干预。

  • 对于具有主要版本更新的软件包,请使用版本规范安装该软件包(例如npm install [email protected] /cdn-cgi/l/email-protection --save-dev)。更新可能出现的其他问题必须手动处理。阅读该软件包的新闻源或发布历史记录通常有助于进一步了解与以前版本相比发生了什么变化。

这还不够简单,还有其他方法吗?

在继续之前,始终值得一提的是,软件包具有符合 SemVer 的版本定义是有原因的。人们应该避免盲目安装每个软件包的最新版本。虽然如此全面的更新可以做到 https://stackoverflow.com/a/16074029/1233251并且有可用的工具,但建议谨慎行事。例如,如果剩余的 React 组件和库与以下版本不兼容,您就不想安装 React 15[email protected] /cdn-cgi/l/email-protection。另请参阅 npm 的博客文章:为什么使用 SemVer? http://blog.npmjs.org/post/162134793605/why-use-semver

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

仅举几例:

  • npm-check-updates https://www.npmjs.com/package/npm-check-updates将执行问题中最初要求的操作:安装和更新所有依赖项的版本,无论给定的范围约束如何。然而,这将是最不推荐的工具。
  • updtr https://www.npmjs.com/package/updtr如果项目的测试失败,将一一更新依赖项并回滚到以前的版本,这可能会节省测试覆盖率良好的项目的时间。
  • npm-check https://www.npmjs.com/package/npm-check提供交互式命令行界面,使您可以轻松选择要更新的软件包。

这与 npm 5 有什么不同吗?

从主要版本 5 开始,npm 会自动创建一个“包锁.json” https://docs.npmjs.com/files/package-lock.json,当收缩包装不存在时,它将起到指定依赖树的作用。更详细的描述可以在包锁文档 https://docs.npmjs.com/files/package-locks。一般来说,npm-shrinkwrap.json 用于发布时,而 package-lock.json 用于开发。这就是为什么您还应该将“package-lock.json”提交到存储库。

纱线呢?

Yarn https://yarnpkg.com/是一个与 npm 兼容的依赖管理器,在使用时自动创建一个锁定文件,其行为与 npm ShrinkWrap 类似。呼唤yarn upgrade «package» https://yarnpkg.com/en/docs/cli/upgrade将更新一个依赖项到中的版本latest标签,无论 package.json 或锁定文件中记录的版本范围如何。使用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.
├─ [email protected] /cdn-cgi/l/email-protection
└─ [email protected] /cdn-cgi/l/email-protection
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从命令行更新具有固定依赖项的 npm 包 的相关文章

随机推荐

  • 未找到“google\appengine\CreateUploadURLRequest”类

    我正在使用谷歌云CORE PHP使用简单的 HTML 表单上传文件但我被困在CloudStorageTools班级 它会抛出连续的跟随错误 致命错误 类 找不到 google appengine api cloud storage Clou
  • Mac OS 上的 pybluez 安装错误

    我尝试安装pybluez使用以下命令 pip install pybluez sudo easy install pybluez 但对于这两个命令我最终都会出错 环境 Mac OSX 10 9 1 Python 2 7 点日志 cc fno
  • 如何指定登录表单链接的返回 URL?

    看起来很简单 但事实并非如此 主要是因为视图不可能知道通过模型和控制器到达那里的方式 无论如何 这是一个需要解决的问题 我有一个登录链接 它将用户带到一个表单以输入用户名和密码 当用户单击 提交 时 我想重定向到他正在查看的页面 最简单的方
  • 如何实现 IFilter 来索引重量级格式?

    我需要为 Microsoft Search Server 2008 开发一个 IFilter 它执行长时间的计算来提取文本 从一个文件中提取文本可能需要 5 秒到 12 小时 我如何设计这样的 IFilter 以便守护进程不会在超时时重置它
  • 如何在Android模拟器中找到数据库文件的路径?

    我正在 Android 模拟器中执行一些 sqlite 查询 我想知道数据库文件存储在哪个路径 请给我一些如何找到它的想法 如果你能给我一些代码片段 乌尔 s 库马兰 数据库通常存储在 data data your applications
  • Karma 与 Webpack 和 Typescript 不执行任何测试

    我试图弄清楚如何将 Karma 测试运行器与 Webpack 和 Typescript 源文件一起使用 以此源文件作为唯一的测试文件为例 测试规格 var message string yay alert message describe
  • android中textview截断一个字母

    这是我的 Android 设备的屏幕截图 文字是 asd 然而 d 被稍微切断了 这是相关视图
  • 在 Rust 中使用结构体的生命周期的正确方法是什么?

    我想写这样的结构 struct A b B c C struct B c C struct C The B c应该借自A c A gt b B gt c C borrow from c C lt 这是我尝试过的 struct C struc
  • 如何在R中制作渐变颜色填充时间序列图

    How to 填充区域 sp 线下方和上方渐变色 这个例子是在 Inkscape 中绘制的 但我需要垂直渐变 不是水平的 间隔从zero to positive 来自white to red 间隔从zero to negative 来自wh
  • 如何获取 vscode 扩展中的 vscode 主题颜色?

    我想在我的扩展中使用当前 vscode 主题中使用的一些颜色 我如何获得颜色 换句话说 我想在扩展运行时将使用原始颜色的扩展颜色与基本 vscode 窗口相匹配 您可以参考工作台颜色 https code visualstudio com
  • Facebook Stream.publish 带有来自 Base64 的图像附件

    我正在尝试让 facebook 的stream publish 制作一个墙贴 其中包含一些自定义文本和从该网站动态生成的图像 该图像仅以 Base64 形式提供 因为它是由用户在启动发布操作之前绘制的 Facebook 似乎不喜欢 src
  • 如何在半屏上呈现 ViewController

    我有一个UIViewController其中只有一个UIView从底部覆盖了 viewController 的 1 3 像这样 我想在另一个 ViewController 上呈现这个 viewController 它应该从底部动画显示 并且
  • CSS 可见性动画不起作用

    我想在 CSS 可见性属性上制作基于关键帧的动画 我最初在 显示 上尝试过 但发现不支持 显示 上的动画 但支持 可见性 这个想法是让矩形的可见性不断切换 我不想使用 jquery 并且想在 CSS 中实现整个它 以下是我的代码 但它没有给
  • Java Marine API - 寻找 NMEA 数据

    我的最终目标是从 Adafruit Ultimate GPS NMEA 0183 标准 接收纬度和经度 GPS 信息到我的 Java 应用程序 我正在使用 Java Marine API 来执行此操作 然后 当前位置将与时间戳一起写入数据库
  • Ionic 4 键盘覆盖输入字段

    我有一个 Ionic 4 应用程序 其中有一个包含输入的表单 当用户单击输入时 它会打开键盘 但会隐藏内容 而不滚动 有没有办法解决 这是我的代码
  • 如何在iPhone真机上打开数据库sqlite文件?

    我正在通过电缆在我的真实设备中调试应用程序 我有一部 iPhone 6 我想检查我的数据库并使用 sqlite3 操作来查询我的结果 其他问题和教程解释了只能在模拟器中执行此操作 但我使用的是真正的 iPhone 在AppDelegate中
  • MySQL:错误 1215 (HY000):无法添加外键约束

    我读过了数据库系统概念 第六版 西尔伯沙茨 我将在 OS X 上的 MySQL 上实现第 2 章中所示的大学数据库系统 但我在创建表格时遇到了麻烦course 桌子department好像 mysql gt select from depa
  • Swing JTable:当行可见或滚动到底部时发生事件?

    我正在寻找一种方法 以便在 JTable 滚动时收到通知 以便特定行变得可见 或者在表底部滚动到视图中时失败 理想情况下 这应该在不轮询的情况下完成 而是通过一些事件触发来完成 有任何想法吗 Add a ChangeListener到滚动窗
  • Jquery 手风琴默认不折叠

    我正在使用 bootstrap 提供的折叠插件 这是一个 jquery 简单插件 但是它默认折叠 如何修改以使折叠项默认隐藏 只有当我按下标题时 该项目才会折叠并显示 谢谢 插件的文档 只有几行 所以只需要一分钟 http twitter
  • 从命令行更新具有固定依赖项的 npm 包

    我有一个带有更新的固定版本的 npm 包 package json 摘录示例 devDependencies someFixedVersionPackage 1 0 0 1 1 0 is latest anotherFixedVersion