Monorepo – Yarn 工作区 Typescript Node.JS 项目 – 运行 nodemon 时找不到模块

tub*_*tub 5 node.js typescript monorepo yarn-workspaces

我已经使用 YARN 工作区为 TypeScript Node.JS 项目设置了一个 monorepo。构建项目工作正常,但是,我在本地开发过程中遇到了问题。

我需要yarn build在运行之前手动运行yarn dev。否则我会收到以下错误:

错误:找不到模块“/Users/benedikt/code/monorepo-build/node_modules/@bhirmer/utils/dist/index.js”。请验证 package.json 是否具有有效的“main”条目

这是重现该问题的示例存储库。

或者,重要文件。

项目结构

packages/
  utils
services/
  api
Run Code Online (Sandbox Code Playgroud)

根包.json

packages/
  utils
services/
  api
Run Code Online (Sandbox Code Playgroud)

根 tsconfig.json

{
  "name": "@bhirmer/monorepo",
  "description": "Workspace",
  "private": true,
  "workspaces": [
    "packages/*",
    "services/*"
  ],
  "scripts": {},
  "devDependencies": {
    "eslint": "~7.14.0",
    "typescript": "^4.0.5"
  }
}
Run Code Online (Sandbox Code Playgroud)

实用程序 package.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "ES2015",
    "lib": ["ES2019", "dom"],
    "types": ["node"],
    "esModuleInterop": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "noEmitOnError": true,
    "allowUmdGlobalAccess": true,
    "allowJs": false,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": false,
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true,
    "noImplicitAny": true,
    "noUnusedLocals": true,
    "noImplicitThis": true,
    "strictNullChecks": true,
    "noImplicitReturns": true,
    "preserveConstEnums": true,
    "suppressImplicitAnyIndexErrors": true,
    "composite": true,
    "baseUrl": "../..",
    "paths": {
      "@bhirmer/*": ["packages/*/src"]
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

Run Code Online (Sandbox Code Playgroud)

实用程序 tsconfig.json

{
  "name": "@bhirmer/utils",
  "version": "1.0.0",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
    "files": [
        "dist"
    ],
  "scripts": {
    "build": "yarn run clean && yarn run compile",
    "clean": "rimraf ./dist && rimraf ./tsconfig.buildinfo",
    "compile": "tsc --build",
    "test": "yarn run build"
  },
  "dependencies": {
    "@types/node": "^14.14.12"
  },
  "devDependencies": {},
  "sideEffects": false
}
Run Code Online (Sandbox Code Playgroud)

API包.json

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "baseUrl": "../../",
    "rootDir": "./src",
    "outDir": "./dist",
    "composite": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}
Run Code Online (Sandbox Code Playgroud)

API tsconfig.json

{
  "name": "@bhirmer/api",
  "description": "api",
  "author": "Benedikt Hirmer <benedikt@hirmer.me",
  "license": "UNLICENSED",
  "private": true,
  "version": "1.0.0",
  "main": "server/index",
  "scripts": {
    "dev": "PROJECT_ID=test-dev PORT=3010 nodemon src/server/index.ts",
    "clean": "rimraf ./dist",
    "compile": "NODE_ENV=production tsc --build",
    "build": "yarn run compile",
    "start": "PROJECT_ID=test-prod NODE_ENV=production node dist/server/index.js",
  },
  "dependencies": {
    "@bhirmer/utils": "^1.0.0",
    "@types/compression": "^1.7.0",
    "@types/express": "^4.17.11",
    "@types/node": "^14.14.12",
    "compression": "^1.7.4",
    "express": "^4.17.1",
    "typescript": "^4.2.4"
  },
  "devDependencies": {
    "nodemon": "^2.0.7",
    "ts-node": "^9.1.1"
  }
}
Run Code Online (Sandbox Code Playgroud)

services/api 中的 packages/utils 的示例用法

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "outDir": "dist",
    "baseUrl": "../../",
    // "rootDir": "src", // Getting `TypeError: src/server/index.ts: Emit skipped` if not commented out
    "composite": true
  },
  "include": ["src/**/*"],
  "types": ["typePatches"],
  "references": [{ "path": "../../packages/utils" }]
}
Run Code Online (Sandbox Code Playgroud)

另一点需要注意的是,一旦我设置"rootDir": "src"services/api/tsconfig.json,就会遇到以下错误:

TypeError: src/server/index.ts: Emit skipped如果没有注释掉

Grz*_*das 1

NPM 工作区仍然需​​要您在根目录(包含工作区定义/位置的 package.json 所在的位置)内运行npm install,以便与本地包建立相关的符号链接。

当你这样做时,你应该得到:

node_modules/
    @bhirmer/
        utils/ <-- symlink to /packages/utils/
        api/ <-- symlink to /services/api/
packages/
    utils/
        ...
services/
    api/
        ...
package.json <-- root package.json with "workspaces"
Run Code Online (Sandbox Code Playgroud)

每次创建一个新的本地包文件夹(其中包含 package.json)并希望从其他地方访问该文件夹时,都必须重新运行它。

  • 我正在使用 Yarn 工作区。符号链接设置正确。 (6认同)