You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,可以通过以下两种方式实现:

  1. 暂时移除根目录package.json中的workspaces配置,在子工作区执行npm i后再恢复配置;
  2. 使用npm install --no-workspaces命令,强制npm忽略工作区配置,在当前目录单独安装依赖。

内容的提问来源于stack exchange,提问作者khteh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:45:11