【问题标题】:Difference between `npm update` and `remove package-lock.json` plus `npm install`?`npm update`和`remove package-lock.json`加上`npm install`之间的区别?
【发布时间】:2020-08-11 12:43:10
【问题描述】:

这些命令有什么本质区别,除了 npm update modify package.json?

rm package-lock.json
npm install
npm update --dev

【问题讨论】:

标签: npm npm-install package.json package-lock.json npm-update


【解决方案1】:

package-lock.json 中,间接依赖基本上是锁定的。间接依赖是指那些没有在你的项目的package.json中指定的依赖,但是它们是你的依赖的依赖。

当调用npm update --dev 时,package.json 中的一些依赖项会更新。更新条目后调用安装,此安装将在package-lock.json 中更新与package.json 中已修改的第三方相关的那些第三方。这意味着在package-lock.json 中更新了直接和间接依赖项。但仅适用于在package.json 中修改的那些。 在package.json 中保持不变的第三方将不会在package-lock.json 中被触及。 (它们的直接和间接依赖关系保持不变。)

当调用rm package-lock.jsonnpm install 时,有关间接依赖关系的信息会随着package-lock.json 的删除而丢失。在调用npm install 时,会生成一个新的package-lock.json,并且可以更改所有依赖项的间接依赖项。

让我们看一个例子。

package-lock.json 中,我们间接依赖tslib: 1.9.0

"tslib": {
  "version": "1.9.0",
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
  "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
},

tslib 是所有 Angular 模块的依赖项,直接在package.json 中指定:

"dependencies": {
  "@angular/animations": "8.2.12",
  "@angular/cdk": "~8.2.3",
  "@angular/common": "8.2.12",
  "@angular/compiler": "8.2.12",
  "@angular/core": "8.2.12",
  "@angular/flex-layout": "^8.0.0-beta.27",
  "@angular/forms": "8.2.12",
  "@angular/material": "^8.2.3",
  "@angular/platform-browser": "8.2.12",
  "@angular/platform-browser-dynamic": "8.2.12",
  "@angular/platform-server": "8.2.12",
  "@angular/router": "8.2.12",
  "@nguniversal/module-map-ngfactory-loader": "8.1.1",
  "aspnet-prerendering": "^3.0.1",
  "bootstrap": "^4.3.1",
  "core-js": "^2.6.5",
  "hammerjs": "^2.0.8",
  "jquery": "3.4.1",
  "oidc-client": "^1.9.0",
  "popper.js": "^1.14.3",
  "rxjs": "^6.4.0",
  "zone.js": "~0.9.1"
},
"devDependencies": {
  "@angular-devkit/build-angular": "^0.800.6",
  "@angular/cli": "8.3.18",
  "@angular/compiler-cli": "8.2.12",
  "@angular/language-service": "8.2.12",
  "@types/jasmine": "~3.3.9",
  "@types/jasminewd2": "~2.0.6",
  "@types/node": "~11.10.5",
  "codelyzer": "^5.0.1",
  "jasmine-core": "~3.3.0",
  "jasmine-spec-reporter": "~4.2.1",
  "karma": "^4.0.0",
  "karma-chrome-launcher": "~2.2.0",
  "karma-coverage-istanbul-reporter": "~2.0.5",
  "karma-jasmine": "~2.0.1",
  "karma-jasmine-html-reporter": "^1.4.0",
  "typescript": "3.4.5"
},
"optionalDependencies": {
  "node-sass": "^4.9.3",
  "protractor": "~5.4.0",
  "ts-node": "~5.0.1",
  "tslint": "~5.9.1"
}

如果我们调用npm update --dev,则会进行以下更改:

+ bootstrap@4.5.0
+ core-js@2.6.11
+ popper.js@1.16.1
+ karma-jasmine-html-reporter@1.5.4
+ karma-coverage-istanbul-reporter@2.0.6
+ codelyzer@5.2.2
+ karma@4.4.1
+ @types/jasmine@3.3.16
+ @types/jasminewd2@2.0.8
+ oidc-client@1.10.1
+ rxjs@6.5.5

我们可以看到,在package.json 中,没有触及 Angular 依赖项。因此tslib 也保留在package-lock.json 中的版本1.9.0 上。

但是,如果我们删除package-lock.json,删除node_modules,手动在package.json 中进行上述更新并调用npm install,我们可以在新生成的package-lock.json 中看到tslib 也是更新为1.12.0。 (如果我们不删除node_modules,则可以像以前一样将相同的版本放回package-lock.json。)

结论

所以不同之处在于,在npm update --dev 的情况下,只有那些直接和间接依赖关系被更新,它们与package.json 中的更改相关。但在rm package-lock.jsonnpm install 的情况下,所有间接依赖关系都可能发生变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 2022-01-02
    • 2021-05-03
    • 2016-01-08
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多