npm工作空间子模块执行npm i未生成package-lock.json和node_modules
问题描述
项目目录结构
/project/ |- package.json |- package-lock.json |- tsconfig.json |- node_modules |- src/ |- moduleA |- package.json |- tsconfig.json |- index.ts |- classA.ts |- moduleB |- package.json |- tsconfig.json |- classB.ts
moduleA的package.json配置
{ "name": "core", "version": "1.0.0", "description": "Web API Core module", "license": "ISC", "scripts": { "build": "tsc --project tsconfig.build.json && npm run rollup", "build:watch": "nodemon -e ts --exec \"npm run build\" --ignore build/** --ignore tests/**", "rollup": "rollup -c" }, "dependencies": { "async": "^3.2.4", "express": "^4.18.1" }, "devDependencies": { "@rollup/plugin-typescript": "^8.3.4", "@types/express": "^4.17.13", "@types/node": "^18.6.4", "nodemon": "^2.0.19", "rollup": "^2.77.2", "rollup-plugin-dts": "^4.2.2", "tslib": "^2.4.0", "typescript": "^4.7.4" }, "keywords": [], "main": "index.js", "types": "build/src/index.d.ts", "engines": { "node": ">=18.4.0" } }
根目录package.json配置
{ "name": "project", "version": "1.0.0", "private": true, "exports": "./bin/www.js", "type": "module", "scripts": { }, "workspaces": [ "src/moduleA", "src/moduleB" ] }
问题详情
在moduleA和moduleB目录下执行npm i,原本期望在子模块目录生成package-lock.json和node_modules,但实际并未生成。删除根目录的package-lock.json和node_modules后,在子模块执行npm i,相关文件反而生成在根目录。请问这是npm的预期行为吗?
环境与配置信息
- npm版本:8.15.0
- Node.js版本:18.4.0
- npm package-lock相关配置:
$ npm config ls -l|grep package-lock npm WARN config This command does not support workspaces. format-package-lock = true package-lock = true package-lock-only = false
尝试过执行rm -rf node_modules && npm i和npm install --package-lock,均无法解决问题。
解答
这是npm Workspaces的预期行为。
当项目根目录配置了workspaces字段后,npm会将所有子工作区的依赖统一管理在根目录的node_modules中,同时只在根目录生成一份package-lock.json,不会在子工作区目录单独生成这些文件。
npm Workspaces的设计初衷就是实现**单仓库多包(monorepo)**的依赖共享与统一管理,避免多个子包重复安装相同依赖,提升安装效率并保持依赖版本一致。
如果确实需要在子工作区单独生成package-lock.json和node_modules,可以通过以下两种方式实现:
- 暂时移除根目录
package.json中的workspaces配置,在子工作区执行npm i后再恢复配置; - 使用
npm install --no-workspaces命令,强制npm忽略工作区配置,在当前目录单独安装依赖。
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

