除了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
中修改的第三方相关的第三方。这意味着直接依赖项和间接依赖项都在包lock.json
中更新。但仅限于那些在package.json
中修改的。package.json
中保持不变的第三方在package lock.json
中不会被触及。(它们的直接依赖关系和间接依赖关系保持不变。)
当调用rmpackage-lock.json
和npm安装
时,随着package-lock.json
的删除,有关间接依赖关系的信息将丢失。当调用npm安装
时,将生成一个新的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
是所有角度模块的依赖项,直接在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
中没有涉及角度依赖关系。因此,tslib
也保留在package lock.json
中的版本1.9.0
。
但是,如果我们删除package-lock.json
,删除node_modules
,在package.json
中手动执行上述更新,并调用npm安装
,我们可以在新生成的package-lock.json
,该tslb
也更新为1.12.0
。(如果我们不删除node_modules
相同的版本可以放回package-lock.json
如前所述。)
结论
所以区别在于,在npm update--dev
的情况下,只更新那些直接和间接依赖项,它们与package.json
中更改的依赖项相关。但是在rm package lock.json
和npm install
的情况下,所有间接依赖项都可以更改。
我错过了什么?如何让npm真正尊重我的锁文件?
我正试图为新开发人员在本地开发环境中安装我们的代码库整理文档。我想命令他们: 基于package-lock.json中的版本安装devDependness和依赖项 不更新package-lock.json “npmci”几乎完全符合我的要求,但似乎没有安装devdependency。“npm安装”确实安装devdependency,但有时会修改包锁。json。 我可以想象像“npm安装”这样简单的
有没有办法检查一个文件是否与兼容,而不运行?兼容意味着指定的版本可以通过来实现。 当前方法 我目前正在通过运行并检查是否更改为: 用例 我想在持续集成中添加一个测试,以确保如果开发人员修改了,他们也会相应地更新。这一点很重要的原因是我们的持续集成使用了,而不是仅引用,因此如果开发人员不更新锁文件,持续集成设置将与他们期望的不匹配。
我已经在谷歌上搜索过了,但还是不清楚。请分享你的想法。
问题内容: 我刚刚开始学习React,facebook通过提供以下现成的项目来帮助简化初始设置。链接到Github上的Facebook帐户 : 如果必须安装框架项目,则必须在命令行中键入。我想知道为什么Github中的facebook帐户没有? 问题答案: npx简介:npm包运行器 - 管理 软件包, 但 执行 任何任务都不容易。- 执行 Node包的工具。 随附版本 本身并不能简单地运行任何软
我正在使用持续集成,并发现了npm ci命令。 我不知道对我的工作流使用此命令有什么好处。 更快吗?这会让考试变得更难吗,好吗,然后呢?