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