我有一个带有更新的固定版本的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
}
谢谢。
答案 0 :(得分:18)
npm update
不在这里工作?根据npm update
上的文档:
此命令将更新所有列出的最新版本的软件包(由标记配置指定),尊重semver。
它还将安装缺少的包。与安装软件包的所有命令一样, - dev标志也会导致devDependencies被处理。
由于您的软件包是使用固定版本定义的,因此update子命令不会更新那些尊重semantic versioning的软件包。因此,如果为每个包指定了更大的版本范围,它将仅自动更新您的包。请注意,在npm项目中通常指定一个松散范围版本;一个旨在避免破坏变化,但仍留有改进和修复的空间。
但它们是固定的,因为我想要它们。在测试较新版本之后,我想通过命令行更新它们。
拥有固定版本的依赖项列表并不意味着安装的依赖项将始终相同,因为依赖项的依赖项很可能也会使用版本范围进行定义。为了跟踪经过测试的版本标记的依赖项列表,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用于发布包。收缩包装:
npm install
以安装所有依赖项的当前版本。npm shrinkwrap
,将npm-shrinkwrap.json添加到git,然后发布您的包。此时,可以在package.json中放松依赖版本(这有望在每次主要依赖项更新时完成),以便稍后可以使用npm update
随意更新:
"devDependencies": {
"someFixedVersionPackage": "^1.0.0",
"anotherFixedVersionPackage": "^2.3.2",
}
可以使用package-lock.json文件代替shrinkwrap,更适合再现开发环境。它也应该提交到存储库。
调用npm update
将执行上述操作:在尊重语义版本控制的同时更新依赖关系。要在包中添加或升级依赖项:
npm install
以安装所有依赖项的当前版本。npm install --save
每个新的或更新的包单独更新package.json,以及现有的包锁(" package-lock.json"和" npm-shrinkwrap.json&#34 )。请注意,必须明确命名它们才能安装:不带参数的npm install
只会重现锁定的依赖项。此外,以下是从具有固定依赖项的项目平滑过渡的一些提示:
如果您还没有这样做,请通过在版本说明符或插入符号~
之前添加波浪号(^
)来扩展版本范围。然后,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
提供了一个交互式命令行界面,可让您轻松选择要更新的包。从主要版本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范围运算符