Определения типов для одноранговых пакетов в монорепозиториях TypeScript: разработка и производство

У меня есть проект монорепозитория, в котором используются yarn workspaces и lerna; все его части написаны на TypeScript. Модули расположены во вложенных папках, таких как packages/module-n, и каждый модуль имеет свою собственную папку package.json со следующими строками:

"main": "dist/index.js",
"types": "dist/index.ts",

Исходный код каждого пакета находится в packages/module-n/src/index.ts, так что ничего необычного.

Когда дело доходит до сборки из командной строки или публикации, все работает хорошо — благодаря tsconfig.json и скрипту build в каждой папке пакета. Однако, когда дело доходит до повседневного редактирования кода в VSCode, все становится не очень удобно, даже несмотря на то, что я запускаю tsc --watch все пакеты, чтобы синхронизировать связанные зависимости.

Когда я нажимаю команду на определение, которое относится к одноранговому пакету, VSCode возвращает меня к packages/package-n/dist/index.d.ts вместо packages/package-n/src/index.ts, который я сейчас редактирую. Кроме того, когда я хочу что-то реорганизовать с помощью F2, файлы dist/index.d.ts могут время от времени изменяться, что вынуждает меня перезапустить build:watch из-за ошибок. Дело в том, что TypeScript видит ручные правки в **/dist/index.d.ts и отказывается дальше обновлять эти файлы.

Чтобы преодолеть это неудобство, я написал эти два скрипта в корне package.json, но я не большой поклонник собственного решения:

"use-dev-typings": "lerna exec \"replace --quiet dist\\/index\\.d\\.ts src/index.ts package.json\"",
"use-prod-typings": "lerna exec \"replace --quiet src\\/index\\.ts dist/index.d.ts package.json\""

Вот как я использую их в одном корне package.json:

"build": "yarn use-prod-typings && lerna run build",
"build:watch": "lerna run build; yarn use-dev-typings && lerna run --parallel build:watch",

Идея состоит в том, что прежде чем я начну редактировать файлы в VSCode и, таким образом, перейду на yarn build:watch, я пропатчу все файлы packages/package-n/package.json, заменив "types": "dist/index.d.ts" на "types": "src/index.ts". Это исправляет команду + щелчок и рефакторинг, и это здорово. Когда дело доходит до одноразового создания (например, перед публикацией), "types" возвращается к "dist/index.d.ts".

Мне интересно, есть ли лучший способ добиться того, что мне нужно, и было бы здорово, если бы кто-нибудь дал мне совет. Я почти уверен, что когда-нибудь случайно зафиксирую "src/index.ts" или даже опубликую версию с этим значением. Содержимое src/*.ts исключено из выпусков npm, чтобы мои пакеты были небольшими.


person Alexander Kachkaev    schedule 30.04.2018    source источник
comment
Для тех, кто борется с той же проблемой и хочет увидеть обходной путь, вот репозиторий, в котором я применяю хак, описанный выше: github.com/gicentre/litvis   -  person Alexander Kachkaev    schedule 11.10.2018


Ответы (1)


https://github.com/Izhaki/mono.ts

Он использует рабочие области пряжи и хорошо сочетается с VSCode. Я надеюсь, что README достаточно ясен.

По сути, используйте два (параллельных) дерева конфигурации машинописного текста:

  • Предварительная сборка — использует псевдонимы (для VSCode, тестов, веб-пакетов и т. д.).
  • Сборка — для публикации по существу используются ссылки на проекты машинописного текста 3.
person Izhaki    schedule 27.12.2018
comment
Спасибо за ответ @Izhaki! Как вы предлагаете подойти к вопросу с типизациями, которые я описываю в вопросе? Это моя главная проблема, которую я смог преодолеть, только добавив эти хакерские скрипты, называемые use-dev-typings / use-prod-typings. - person Alexander Kachkaev; 29.12.2018
comment
Только что вышел: github.com/Izhaki/mono.ts; Все еще нужно добавить README и т. д., но в основном все, что tsconfig.json предварительно собрано (vscode и mocha), и все, что tsconfig.build.json... хммм... связано со сборкой. - person Izhaki; 29.12.2018