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

Fra*_*isc 6 npm

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

devDependencies: {
   "someFixedVersionPackage": "1.0.0", //1.1.0 is latest
   "anotherFixedVersionPackage": "2.3.2", //2.3.4 is latest
}
Run Code Online (Sandbox Code Playgroud)

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

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

devDependencies: {
   "someFixedVersionPackage": "1.1.0", //latest
   "anotherFixedVersionPackage": "2.3.4", //latest
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

E_n*_*ate 18

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

根据以下文件npm update:

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

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

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

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

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

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

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

npm shrinkwrap

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

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

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

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

  1. npm install在程序包root中运行以安装所有依赖项的当前版本.
  2. 验证包是否按预期使用这些版本.
  3. 运行npm shrinkwrap,将npm-shrinkwrap.json添加到git,然后发布您的包.

此时,可以在package.json中放松依赖版本(这有望在每次主要依赖项更新时完成),以便稍后可以随意更新它们npm update:

"devDependencies": {
   "someFixedVersionPackage": "^1.0.0",
   "anotherFixedVersionPackage": "^2.3.2",
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

此外,以下是从具有固定依赖项的项目平滑过渡的一些提示:

  • 如果尚未这样做,请通过~在版本说明符或插入符号()之前添加波浪号()来扩展版本范围^.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的版本定义.应该避免盲目地安装每个包的最新版本.虽然可以完成这样的完整更新并且可以使用工具,但建议谨慎一些.例如,如果剩余的React组件和库不兼容,则不希望安装React 15 react@15.x.x.另见npm的博文:为什么要使用SemVer?

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

仅举几例:

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

这与npm 5有什么不同吗?

从主要版本5开始,npm将自动创建一个"package-lock.json",当填充包裹不存在时,它将填充指定依赖关系树的角色.可以在package-locks文档中找到更详细的描述.通常,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
Run Code Online (Sandbox Code Playgroud)