首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构建TypeScript monorepo项目的问题

构建TypeScript monorepo项目的问题
EN

Stack Overflow用户
提问于 2019-10-24 13:19:32
回答 1查看 10.9K关注 0票数 12

我有一个相当简单的单次回购。它可以在GitLab 这里上使用。这使用纱线工作区,TypeScript,Jest,ts-jest和ESLint与eslint-plugin-import

我正在尝试使用TypeScript正确地构建项目包。以前,我只是将TypeScript文件和它们的JavaScript代码一起发布在同一个目录中。

我构建该项目的尝试在GitLab合并请求这里中可用。

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

代码语言:javascript
运行
复制
 |- 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如下所示:

代码语言:javascript
运行
复制
{
  "compilerOptions": {
    "baseUrl": ".",
    "composite": true,
    "declaration": true,
    "module": "commonjs",
    "noEmit": true,
    "resolveJsonModule": true,
    "target": "esnext",
    "paths": {
      "koas-*": ["packages/koas-*/src"]
    }
  },
  "exclude": ["**/*.test.ts"]
}

工作区tsconfig.json文件如下所示:

代码语言:javascript
运行
复制
{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "rootDir": "src",
    "outDir": "lib"
  }
}

每个工作区都有一个在prepack中定义的package.json脚本,如下所示:

代码语言:javascript
运行
复制
{
  "scripts": {
    "prepack": "tsc --noEmit false"
  }
}

main字段引用lib

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

代码语言:javascript
运行
复制
$ 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 for koas-status-code

代码语言:javascript
运行
复制
{
  "extends": "../../tsconfig.json",
  "include": ["src"],
  "references": [{ "path": "../koas-core" }],
  "compilerOptions": {
    "outDir": "lib"
  }
}

这将生成工作区,但仍然会给出以下错误:

代码语言:javascript
运行
复制
$ 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.

我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-04 10:41:36

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

该项目现在在项目根目录中包含一个名为tsconfig.build.ts的文件。这个文件基本上只是指定编译器选项,测试和构建文件应该被排除在构建过程之外。

代码语言:javascript
运行
复制
{
  "compilerOptions": {
    "declaration": true,
    "module": "commonjs",
    "resolveJsonModule": true,
    "target": "esnext"
  },
  "exclude": ["**/*.test.ts", "**/lib"]
}

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

代码语言:javascript
运行
复制
{
  "extends": "./tsconfig.build.json",
  "compilerOptions": {
    "baseUrl": ".",
    "noEmit": true,
    "paths": {
      "koas-*": ["packages/koas-*/src"]
    }
  },
  "exclude": ["**/lib"]
}

每个工作区都包含一个tsconfig.build.json文件。这是必需的,因为它需要srcoutDir选项相对于tsconfig文件。用于构建项目。重要的是,这个文件是,而不是,名为tsconfig.json

代码语言:javascript
运行
复制
{
  "extends": "../../tsconfig.build.json",
  "include": ["src"],
  "compilerOptions": {
    "outDir": "lib"
  }
}

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

代码语言:javascript
运行
复制
{
  "extends": "../../tsconfig.json"
}

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

代码语言:javascript
运行
复制
  // …
  "scripts": {
    "prepack": "tsc --project tsconfig.build.json"
  }

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

代码语言:javascript
运行
复制
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'
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58542301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档