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

时间:2017-11-24 22:15:29

标签: npm

从npm 3到5更新,以使用此功能。

抱歉,我必须遗漏一些非常明显的内容,但是如何在安装时让npm尊重 package-lock.json 文件中的固定版本?

我们说我有package.json有一些过时的套餐。执行npm install会吸引新内容并破坏我的应用。

例如,我想要稳定的主要包是bootstrap - 我想暂时阻止其版本在 bootstrap@4.0.0-alpha.6 ,但是{{1找到 4.0.0-beta.28

如果我npm install任何软件包, package-lock.json 会更新。

我们转到我的开发目录。

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

npm update

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

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

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

但我如何使用 package-lock.json

这就是我的所作所为:

  • 创建了一个全新的目录
  • 复制在 package.json package-lock.json
  • $ 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",

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

npm install
  • 如果我删除 package.json 并且只有 package-lock.json 的目录,则(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", 安装很少并且离开我有一个截断的 package-lock.json

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

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

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

我的环境:

^

3 个答案:

答案 0 :(得分:8)

根据this commentmember of the npm CLI team,你所描述的是一个"高优先级错误"。

  
      
  1. 如果您有一个package.json并运行npm,我们会从中生成一个package-lock.json。

  2.   
  3. 如果您对该package.json和package-lock.json运行npm i,后者将永远不会更新,即使package.json对新版本感到满意。

  4.   
  5. 如果您手动编辑package.json以具有不同的范围并运行npm i并且这些范围与package-lock.json不兼容,那么后者将使用与之兼容的版本进行更新你的package.json。进一步运行npm i将与上面的2相同。

  6.         

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

还有另一个名为cipm的开发工具,它将严格基于package-lock.json进行安装。这可能是你真正追求的。 another npm CLI engineer中的same thread描述了它的推理:

  

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

     

...

     

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

     

...

     

因为"的用例我想确保它被锁定"仍然有效,而不是添加--freeze选项,我们正在努力让cipm出门,因为我们相信这解决了想要确保您的CI或生产构建服从包锁的用例上传.json。

GitHub issue 17979以及此SO帖子中有更多详细信息:Why does "npm install" rewrite package-lock.json?

值得注意的是,有another GitHub issue更新package-lock.json的文档。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这似乎也有效

npm i --save-exact

~https://docs.npmjs.com/cli/v7/commands/npm-install