node.js - 构建 TypeScript monorepo 项目时出现问题

标签 node.js typescript monorepo

我有一个相当简单的单声道存储库。它可以在 GitLab 上找到 here 。这使用了 yarn 工作区、TypeScript、Jest、ts-jest 和 ESLint 与 eslint-plugin-import .

我正在尝试使用 TypeScript 正确构建项目包。以前我只是 在同一目录中发布 TypeScript 文件及其 JavaScript 代码。

我尝试构建项目可以在 GitLab 合并请求中找到 here

现在存储库遵循以下布局:

 |- example/
 |   |- index.ts
 |   |- package.json
 |   `- tsconfig.json
 |- packages/
 |   |- koas-core/
 |   |   |- src/
 |   |   |   `- index.ts
 |   |   |- package.json
 |   |   `- tsconfig.json
 |   |- koas-status-code/
 |   |   |- src/
 |   |   |   `- index.ts
 |   |   |- package.json
 |   |   `- tsconfig.json
 |   `- more similar workspaces…
 |- package.json
 |- tsconfig.json
 `- more configuration files…

一些包相互依赖。我已经成功进行了 Jest 测试并 eslint-plugin-import到 使用此设置,但我在构建项目时遇到问题。

tsconfig.json看起来像这样:

{
  "compilerOptions": {
    "baseUrl": ".",
    "composite": true,
    "declaration": true,
    "module": "commonjs",
    "noEmit": true,
    "resolveJsonModule": true,
    "target": "esnext",
    "paths": {
      "koas-*": ["packages/koas-*/src"]
    }
  },
  "exclude": ["**/*.test.ts"]
}

工作区 tsconfig.json文件看起来像这样:

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "rootDir": "src",
    "outDir": "lib"
  }
}

每个工作区都有一个prepack package.json 中定义的脚本看起来像这样:

{
  "scripts": {
    "prepack": "tsc --noEmit false"
  }
}

main字段指lib .

如果我运行yarn workspace koas-status-code prepack ,我收到以下错误:

$ tsc --noEmit false
error TS6059: File 'koas/packages/koas-core/src/SchemaValidationError.ts' is not under 'rootDir' 'koas/packages/koas-status-code'. 'rootDir' is expected to contain all source files.

error TS6059: File 'koas/packages/koas-core/src/SchemaValidationError.ts' is not under 'rootDir' 'koas/packages/koas-status-code/src'. 'rootDir' is expected to contain all source files.

error TS6059: File 'koas/packages/koas-core/src/createDefaultValidator.ts' is not under 'rootDir' 'koas/packages/koas-status-code'. 'rootDir' is expected to contain all source files.

error TS6059: File 'koas/packages/koas-core/src/createDefaultValidator.ts' is not under 'rootDir' 'koas/packages/koas-status-code/src'. 'rootDir' is expected to contain all source files.

error TS6059: File 'koas/packages/koas-core/src/createMatcher.ts' is not under 'rootDir' 'koas/packages/koas-status-code'. 'rootDir' is expected to contain all source files.

error TS6059: File 'koas/packages/koas-core/src/createMatcher.ts' is not under 'rootDir' 'koas/packages/koas-status-code/src'. 'rootDir' is expected to contain all source files.

error TS6059: File 'koas/packages/koas-core/src/index.ts' is not under 'rootDir' 'koas/packages/koas-status-code'. 'rootDir' is expected to contain all source files.

error TS6059: File 'koas/packages/koas-core/src/index.ts' is not under 'rootDir' 'koas/packages/koas-status-code/src'. 'rootDir' is expected to contain all source files.

error TS6307: File 'koas/packages/koas-core/src/SchemaValidationError.ts' is not listed within the file list of project 'koas/packages/koas-status-code/tsconfig.json'. Projects must list all files or use an 'include' pattern.

error TS6307: File 'koas/packages/koas-core/src/createDefaultValidator.ts' is not listed within the file list of project 'koas/packages/koas-status-code/tsconfig.json'. Projects must list all files or use an 'include' pattern.

error TS6307: File 'koas/packages/koas-core/src/createMatcher.ts' is not listed within the file list of project 'koas/packages/koas-status-code/tsconfig.json'. Projects must list all files or use an 'include' pattern.

error TS6307: File 'koas/packages/koas-core/src/index.ts' is not listed within the file list of project 'koas/packages/koas-status-code/tsconfig.json'. Projects must list all files or use an 'include' pattern.


Found 12 errors.

我也尝试过这个tsconfig.json对于 koas-status-code :

{
  "extends": "../../tsconfig.json",
  "include": ["src"],
  "references": [{ "path": "../koas-core" }],
  "compilerOptions": {
    "outDir": "lib"
  }
}

这构建了工作区,但仍然给出以下错误:

$ tsc --noEmit false
src/index.ts:1:23 - error TS6305: Output file '/home/remco/Projects/koas/packages/koas-core/lib/src/index.d.ts' has not been built from source file '/home/remco/Projects/koas/packages/koas-core/src/index.ts'.

1 import * as Koas from 'koas-core';
                        ~~~~~~~~~~~


Found 1 error.

如何解决这个问题?

最佳答案

我已经根据https://github.com/NiGhTTraX/lerna-ts找到了这个问题的解决方案.

该项目现在在项目根目录中包含一个名为 tsconfig.build.json 的文件。该文件指定编译器选项,并且测试和构建文件应从构建过程中排除。

{
  "compilerOptions": {
    "declaration": true,
    "module": "commonjs",
    "resolveJsonModule": true,
    "target": "esnext"
  },
  "exclude": ["**/*.test.ts", "**/lib"]
}

根目录中的另一个文件是tsconfig.json。该文件用于构建过程之外的类型检查,例如由 Jest 和 VSCode 提供。该文件扩展了构建配置。它包括通过覆盖扩展的排除配置进行的测试。它还包含 noEmit: true,因为在开发时使用 TypeScript 的进程不应发出任何内容。它还包含在运行时解析 TypeScript 源文件所需的 baseUrlpaths 编译器选项。这是因为包的 package.json 文件中的 main 字段引用了包含输出文件的 lib

{
  "extends": "./tsconfig.build.json",
  "compilerOptions": {
    "baseUrl": ".",
    "noEmit": true,
    "paths": {
      "koas-*": ["packages/koas-*/src"]
    }
  },
  "exclude": ["**/lib"]
}

每个工作区都包含一个 tsconfig.build.json 文件。这是必需的,因为它要求 src 和 outDir 选项需要相对于 tsconfig 文件。这是用来构建项目的。重要的是此文件命名为tsconfig.json

{
  "extends": "../../tsconfig.build.json",
  "include": ["src"],
  "compilerOptions": {
    "outDir": "lib"
  }
}

每个工作区还包含一个 tsconfig.json。这可用于覆盖类型检查的编译器选项,例如,如果一个存储库将使用 dom 类型。这可以省略。

{
  "extends": "../../tsconfig.json"
}

每个工作区在 package.json 中都有以下 scripts 部分。这会导致在构建包时编译 TypeScript。

  // …
  "scripts": {
    "prepack": "tsc --project tsconfig.build.json"
  }

有两个 CI 作业用于类型检查。一个运行 tsc 以确保类型检查在开发中使用这些类型的工具中仍然有效,另一个确保构建包不会中断。

tsc:
  script:
    - yarn --frozen-lockfile
    - yarn workspaces run tsc

pack:
  script:
    - yarn --frozen-lockfile
    - yarn workspaces run pack
    - find packages -name '*.tgz' -exec mv {} ./ +
  artifacts:
    name: packages
    paths:
      - '*.tgz'

关于node.js - 构建 TypeScript monorepo 项目时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58542301/

相关文章:

mysql - 使用mysql在nodejs中分页

node.js - 如何使用 koa 2 完全不响应请求?

javascript - classList.toggle() 不工作 IE11 Angular 7(无效的调用对象)

javascript - 如何在搜索功能中处理 'No Results Found'

javascript - Express 和 Typescript - Error.stack 和 Error.status 属性不存在

git - 如何在 monorepo 中维护每个模块的自动更改日志?

node.js - 如何使用 Lerna 和 Yarn 安装预发行包?

docker - Bazel Monorepo - 如何仅重建和发布更改的 Docker 镜像?

node.js - Angular2 和 NodeJs

javascript - Nodemailer 因用户名和密码不正确而出现错误