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