Как использовать рабочие области пряжи с машинописным текстом и папками out?

Я пытаюсь настроить монорепозиторий с использованием пряжи. Я не понимаю, как настроить машинописный текст со ссылками на проекты, чтобы все было правильно.

Например, если у меня есть структура папок вроде

/cmd
/client

И я хочу, чтобы cmd зависел от client, я мог бы:

cmd/tsconfig.json:

{
  "compilerOptions": {
    "types": ["reflect-metadata", "jest"],
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "moduleResolution": "node",
    "declaration": true,
    "importHelpers": true,
    "composite": true,
    "target": "esnext"
    "sourceRoot": "src",
    "outDir": "dist"
  },
  "references": [
    {
      "path": "../client"
    }
  ],
  "include": [
    "src/**/*"
  ]
}

с package.json

{
  "name": "cmd",
  "version": "1.0.0",
  "dependencies": {
    "client": "^1.0.0",
  }
}

В этой модели и cmd, и client компилируются с полями outDir и sourceRoot, установленными в их tsconfig. Это означает, что весь их скомпилированный JavaScript помещается в подпапку dist/ папок cmd/dist и client/dist.

Если сейчас я попытаюсь сослаться на класс из client в cmd, например

import Foo from 'client/src/foo'

IDE вполне рада решить эту проблему, поскольку кажется, что она отображается через свойство typescript references.

Однако скомпилированный javascript сводится к

const foo_1 = require("client/src/foo");

Однако фактический встроенный javascript находится в client/dist/src/foo, поэтому во время выполнения это никогда не работает.

С другой стороны, если я не использую sourceRoots и outDirs и у меня есть javascript, встроенный в файлы typescript в той же папке, все работает (но делает репо грязным и требует пользовательских gitignores для исключения вещей)

Может ли кто-нибудь пролить свет на то, как правильно настроить монорепозиторий TypeScript 3.x с рабочими пространствами пряжи, чтобы все просто работало?


person devshorts    schedule 27.08.2019    source источник
comment
Примечание: я использовал lerna для настройки монорепозитория и нашел его весьма достойным, и он также должен работать с пряжей. (Я использовал его с npm.)   -  person k0pernikus    schedule 10.09.2019
comment
Я помню, как имел дело с чем-то вроде этого. Если вы хотите опубликовать ссылку на репозиторий, которая воспроизводит проблему, я посмотрю.   -  person Burt_Harris    schedule 01.10.2019
comment
взгляните на это репо. Они сделали это хорошо. просмотрите его github.com/apollographql/apollo-client   -  person m.akbari    schedule 01.10.2019


Ответы (2)


Я установил monorepo I с некоторыми конфигурациями, которые я всегда использую в своих проектах, используя Yarn Workspaces и Typescript в этот репозиторий.

Я не знаю, решит ли эта настройка вашу проблему, но вам не нужно указывать свои пакеты в конфигурации Typescript. Когда вы используете Yarn Workspaces, он связывает все ваши пакеты в корневом node_modules, который вы определили в свойстве пакета рабочего пространства в корневом package.json:

"workspaces": {
    "packages": [
        "packages/**/*"
    ],
    "nohoist": []
}

После yarn install корень node_modules имеет client и cmd в качестве связанных папок.

введите здесь описание изображения

С этой конфигурацией вы можете просто импортировать любой пакет в любой пакет внутри Workspace. Например:

// cmd/src/index.ts

import { name } from 'client';

const otherName = 'cmd' + name;

console.log(otherName);
person Pedro Arantes    schedule 01.10.2019
comment
Сборка не будет работать из cmd, если вы ранее не собирали клиент. ошибка TS2307: не удается найти модуль «клиент». - person gremo; 01.10.2019
comment
Вы запускали yarn в корневом каталоге перед сборкой? - person Pedro Arantes; 01.10.2019
comment
Ну конечно; естественно. Удалите все dist dir и попробуйте сами. - person gremo; 01.10.2019
comment
Понятно. В предлагаемой мной конфигурации вы не должны удалять dist папки, это часть вашего кода. Возможно, я совершенно неправильно понял вопрос, и если dist не должен быть частью репозитория, мое решение не сработает. - person Pedro Arantes; 01.10.2019

person    schedule
comment
@devshorts это работает для вас? Или вам чего-то не хватает в моем решении? - person a1300; 09.10.2019
comment
отличный ответ. так как я разместил вопрос, я уже давно настроил его таким образом. Моя первоначальная проблема заключалась в том, что я не понимал, что у вас должна быть папка dist, и если вы хотите, чтобы импорт был чистым, вам нужно экспортировать их из модуля индекса. - person devshorts; 13.01.2021
comment
Очень хорошая запись! Я не нашел применения файлу tsconfig корневого уровня. Вызов tsc на нем не создает пакеты и кажется избыточным, если вы не хотите использовать его в качестве базовой конфигурации для наследования. Поскольку для каждого пакета по-прежнему нужны собственные настройки ссылок, я не понимаю, что цель ссылок корневого уровня. - person Thijs Koerselman; 20.06.2021