Определения типов для одноранговых пакетов в TypeScript monorepos: разработка против производства - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть монорепроект, который использует 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, чтобы мои пакеты были маленькими.

1 Ответ

0 голосов
/ 28 декабря 2018

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

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

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

  • Pre-build - использует псевдонимы (для VSCode, тестов, веб-пакетов и т. Д.).
  • Сборка - для публикации по существу используются ссылки на проекты машинописного текста 3.
...