为什么不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 用于发布包。收缩包装:
- Run
npm install
在包根目录中安装所有依赖项的当前版本。
- 验证该包在这些版本中是否按预期工作。
- 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
将执行上面提到的操作:更新依赖项,同时尊重语义版本控制。要添加或升级包中的依赖项:
- Run
npm install
在包根目录中安装所有依赖项的当前版本。
- 添加或更新依赖项。
npm install --save
每个新的或更新的包单独更新 package.json 以及现有的包锁(“package-lock.json”和“npm-shrinkwrap.json”)。请注意,必须明确命名它们才能安装:运行npm install
不带参数只会重现锁定的依赖关系。
- 验证该包是否可以使用新的依赖项按预期工作。
- 提交新的包锁。
此外,这里有一些从具有固定依赖项的项目平稳过渡的技巧:
如果您还没有这样做,请通过添加波形符来扩展版本范围 (~ 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-dev
flags 还将使用已安装的版本更新“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