`npm update` 和 `remove package-lock.json` 加上 `npm install` 之间的区别?
Difference between `npm update` and `remove package-lock.json` plus `npm install`?
这些命令之间的本质区别是什么,除了 npm update modify package.json?
rm package-lock.json
npm install
npm update --dev
在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.json
和 npm 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.json
和 npm install
的情况下,所有间接依赖都可以改变。
这些命令之间的本质区别是什么,除了 npm update modify package.json?
rm package-lock.json
npm install
npm update --dev
在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.json
和 npm 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.json
和 npm install
的情况下,所有间接依赖都可以改变。