Проблемы при создании проекта TypeScript monorepo - PullRequest
1 голос
/ 24 октября 2019

У меня довольно простое моно репо. Он доступен на GitLab здесь . Для этого используются рабочие пространства пряжи, TypeScript, Jest, ts-jest и ESLint с eslint-plugin-import.

. Я пытаюсь правильно построить пакеты проектов с использованием TypeScript. Ранее я просто публиковал файлы TypeScript вместе с их кодом JavaScript в том же каталоге.

Моя попытка построить проект доступна в запросе слияния GitLab здесь

Сейчасхранилище имеет следующую структуру:

 |- 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.

Как это исправить?

1 Ответ

0 голосов
/ 04 ноября 2019

Я нашел решение для этой проблемы на основе https://github.com/NiGhTTraX/lerna-ts.

В проекте теперь есть файл с именем tsconfig.build.ts в корневом каталоге проекта. Эти файлы в основном просто определяют параметры компилятора, и эти файлы тестирования и сборки должны быть исключены из процесса сборки.

{
  "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, в котором содержатся выходные файлы.

{
  "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"
}

Каждое рабочее пространство имеет следующий раздел scripts в package.json. Это приводит к тому, что 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...