npm无法安装依赖包及项目自身的devDependencies问题咨询
npm安装时忽略依赖包的devDependencies是预期行为吗?
我在NodeJS项目中运行以下命令:
npm install
或者
npm install --include=dev
结果发现,不仅项目自身的devDependencies没被安装,连依赖包的devDependencies也完全没装。虽然从逻辑上看这好像合理,但其中一个依赖包(可能自身配置有误)在缺少它的devDependency时直接运行失败了。
我想确认:这是npm的预期行为吗?npm确实会安装子依赖的dependencies,但似乎完全忽略了devDependencies。
以下是出问题的那个依赖包的package.json示例:
{ "name": "test-helper-chai", "version": "1.0.11", "description": "chai extended with specific assertions", "license": "MIT", "main": "dist/index.js", "devMain": "src/index.js", "engines": { "node": ">=14" }, "devDependencies": { "chai": "^4.3.4", "eslint": "^8.24.0", "prettier": "^2.7.1", "sinon": "^9.2.4" }, "dependencies": { "check-error": "^1.0.2", "lodash": "^4.17.21" }, "scripts": { "build": "yarn build:src", "build:src": "build -dest \"./dist\" -src \"./src\" -js -ts -maps", "test": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser", "test:browser": "test --integration --unit --runner karma", "test:integration": "test --integration --runner mocha", "test:style": "eslint ./src/**/*.*", "test:unit": "test --unit --runner jest" } }
在这个例子里,chai(属于该依赖包的devDependencies)没有被安装,但check-error(属于dependencies)正常安装了。
答案
这确实是npm的预期行为,核心逻辑如下:
devDependencies的定位是仅用于包的开发、构建、测试阶段,而非包运行时所需的依赖。所以当你安装第三方包时,npm只会安装该包dependencies里的内容,完全不会处理它的devDependencies——因为这些依赖对使用这个包的项目来说是冗余的。- 至于你运行
npm install --include=dev时项目自身的devDependencies没安装,大概率是因为当前环境处于生产模式(比如环境变量NODE_ENV=production),此时即使加了--include=dev,npm也会忽略自身的devDependencies。你可以检查下当前环境变量,或者显式用npm install --save-dev来安装项目自身的开发依赖。
回到你遇到的问题:那个依赖包把运行时必须的chai放在了devDependencies里,这明显是配置错误。chai是该包运行时不可或缺的依赖,应该被移到dependencies中。你可以联系该包的开发者修复这个问题,或者临时在自己的项目里手动安装chai作为依赖来规避报错。
内容的提问来源于stack exchange,提问作者Shane Gannon
相关产品推荐
相关产品推荐

