npm - 如何实际使用package-lock.json进行基于锁定版本的安装?

JL *_*ret 27 npm

刚刚从3点到5点更新,以使用此功能.

对不起,我一定错过了一些非常明显的东西,但是如何在安装时让npm尊重package-lock.json文件中的固定版本?

假设我有package.json一些过时的套餐.做一个npm install会吸引新的东西,打破我的应用程序.

例如,我想要稳定的主要包是bootstrap- 我想暂时bootstrap@4.0.0-alpha.6上阻止它的版本,但是npm install找到4.0.0-beta.28.

如果我有npm update任何包,package-lock.json会更新.

我们去我的开发目录.

这是我的boot.rap的package.json条目:

"bootstrap": "^4.0.0-alpha.6"

这就是我对已安装的软件包和元数据的看法:

$ npm list 2>/dev/null | grep bootstrap
??? bootstrap@4.0.0-alpha.6
??? bootstrap-vue@0.16.1
? ??? bootstrap@4.0.0-alpha.6 deduped


(env) jluc@py$ grep bootstrap package.json package-lock.json
package.json:    "bootstrap": "^4.0.0-alpha.6",
package.json:    "bootstrap-vue": "^0.16.1",
package-lock.json:    "bootstrap": {
package-lock.json:      "version": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz",
package-lock.json:    "bootstrap-vue": {
package-lock.json:      "version": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-0.16.1.tgz",
package-lock.json:        "bootstrap": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz",
Run Code Online (Sandbox Code Playgroud)

看起来不错.Lock是bootstrap-4.0.0-alpha.6.

但我如何使用实际使用package-lock.json

这是我做的:

  • 创建了一个全新的目录
  • 复制在package.jsonpackage-lock.json中
  • 跑了npm install.

不好.npm再次发现bootstrap beta和package-lock.json没有任何效果,实际上它是从什么npm install做的改写的.这与你在开发中想要的行为一致,但是没有告诉我如何使用lockfile来稳定我的包.

(env) jluc@trynpmlock$ npm list 2>/dev/null | grep bootstrap
??? bootstrap@4.0.0-beta.2
??? bootstrap-vue@0.16.1
? ??? bootstrap@4.0.0-beta.2 deduped

(env) jluc@trynpmlock$ grep bootstrap package.json package-lock.json
package.json:    "bootstrap": "^4.0.0-alpha.6",
package.json:    "bootstrap-vue": "^0.16.1",
package-lock.json:    "bootstrap": {
package-lock.json:      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.2.tgz",
package-lock.json:    "bootstrap-vue": {
package-lock.json:      "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-0.16.1.tgz",
package-lock.json:        "bootstrap": "4.0.0-beta.2",
Run Code Online (Sandbox Code Playgroud)
  • 如果我删除了package.json并且只有一个带有package-lock.json的目录,那么npm install安装很少并留下一个截断的package-lock.json

  • npm install有一个--no-package-lock选项,但是这会阻止更新package-lock.json.

基本上我怎么告诉npm 从package.json安装所有东西,但尊重package-lock.json中的锁?我使用的命令不同npm install吗?是因为npm install的doc引用了软件包安装上下文中的锁,但是当你完整地安装package.json时,锁不适用?

是的,我知道我可以指定"bootstrap": "4.0.0-alpha.6",减去^,手动固定版本.

我的环境:

(env) jluc@py$ npm -v
5.5.1
Run Code Online (Sandbox Code Playgroud)

Dav*_*tts 17

您需要使用npm ci命令从安装package-lock.json

参见:https : //blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

  • 如果我没有 package.json 文件,则会失败...`ENOENT:没有这样的文件或目录,打开 '/home/chris/fuck3/package.json'` (4认同)
  • 我已经将其转为接受,因为它似乎几乎满足了我的要求,即使 @Volti 的答案当时是正确的 - 这个命令是在之后出现的。 (2认同)

小智 12

根据此评论故宫CLI团队的一员,你所描述的是一个"高优先级的错误".

  1. 如果你有一个package.json并运行npm我从中生成一个package-lock.json.

  2. 如果你对那个package.json和package-lock.json运行npm i,后者将永远不会更新,即使package.json对新版本感到满意也是如此.

  3. 如果手动编辑package.json以具有不同的范围并运行npm i并且这些范围与package-lock.json不兼容,则后者将使用与package.json兼容的版本进行更新.进一步运行npm i将与上面的2一样.

如果您遇到npm@^5.4.2变异的package-lock.json并且与配对的package.json兼容的情况,请打开一个新问题.这种事情将构成一个高优先级的错误.

还有一个名为cipm的开发工具将严格基于package-lock.json进行安装.这可能是你真正想要的.另一个npm CLI工程师同一个线程中描述了它的原因.

package.json是一个权威的清单文件,package-lock.json在某个时间点被认为是特定package.json的表现形式.

...

没有选项/标志来冻结安装以强制它们忽略package.json.也无意将此实现到npm中.

...

因为"我想确保它被锁定"的用例仍然有效,而不是添加--freeze选项,我们正在努力将cipm推出门,因为我们相信这解决了想要的用例确保您的CI或生产版本遵守package-lock.json.

GitHub问题17979以及这个SO线程中有更多细节:为什么"npm install"重写package-lock.json?

还值得注意的是,更新围绕package-lock.json的文档还有另一个GitHub问题.

  • 那么,如果我理解你的话,你的立场就是**package-lock.json**实际上不提供预期的服务,并做广告吗?也就是说,不能依赖它根据上次更新时保存的确切版本进行安装(如果是这种情况,除了促进虚假期望之外,该功能还提供了什么?).我混淆的一个原因是所有这些问题似乎都被归结为*为什么package.json会被重写?*.这不是真正的问题 - 真正的问题是*为什么不使用***. (5认同)