首页 文章

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

提问于
浏览
14

刚刚从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",

看起来不错 . 锁是 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",
  • 如果我删除 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 不同的命令?这是因为当你完整地安装package.json时,npm install 's doc refers to locks in the context of a package installation, but locks don' t是否适用?

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

My environment:

(env) jluc@py$ npm -v
5.5.1

1 回答

  • 7

    根据this comment member of the npm CLI team,你所描述的是"high priority bug" .

    如果你有一个package.json并运行npm我从中生成一个package-lock.json . 如果你对那个package.json和package-lock.json运行npm i,后者将永远不会更新,即使package.json对新版本感到满意也是如此 . 如果手动编辑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进行安装 . 这可能是你真正想要的 . 它的推理由another npm CLI engineersame thread中描述 . :

    package.json是一个权威的清单文件,package-lock.json在某个时间点被认为是特定package.json的表现形式 . ...没有选项/标志来冻结安装以强制它们忽略package.json . 也无意将此实现到npm中 . ...因为“我想确保它被锁定”的用例仍然有效,而不是添加--freeze选项,我们正在努力让cipm出门,因为我们相信这解决了用例想要确保您的CI或 生产环境 版本遵守package-lock.json .

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

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

相关问题