visual studio code - Type-definisjoner for peer-pakker i TypeScript-monorepoer: utvikling vs produksjon
Jeg har et monorepo-prosjekt som bruker yarn workspaces og lerna; alle delene er skrevet i TypeScript. Modulene ligger i undermapper som packages/module-n og hver modul har sin egen package.json med følgende linjer:
"main": "dist/index.js",
"types": "dist/index.ts",
Kildekoden for hver pakke ligger i packages/module-n/src/index.ts, så ingenting uvanlig.
Når det gjelder å bygge fra kommandolinjen eller publisere, fungerer alt bra - takket være tsconfig.json og et build-skript i hver pakkemappe. Men når det gjelder daglig koding i VSCode, blir ting ikke veldig praktisk, selv om jeg kjører tsc --watch på alle pakker for å holde linkede avhengigheter synkronisert.
Når jeg kommando-klikker på en definisjon som refererer til en peer-pakke, tar VSCode meg til packages/package-n/dist/index.d.ts i stedet for packages/package-n/src/index.ts som jeg kanskje redigerer for øyeblikket. Også, når jeg vil refaktorere noe med F2, kan dist/index.d.ts-filer av og til bli endret, noe som tvinger meg til å starte build:watch på nytt på grunn av feil. Poenget er at TypeScript ser manuelle endringer i **/dist/index.d.ts og nekter å oppdatere disse filene videre.
For å overvinne denne ulempen, har jeg skrevet disse to skriptene i rot-package.json, men jeg er ikke så begeistret for min egen løsning:
"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\""
Slik bruker jeg dem i den samme rot-package.json:
"build": "yarn use-prod-typings && lerna run build",
"build:watch": "lerna run build; yarn use-dev-typings && lerna run --parallel build:watch",
Ideen er at før jeg begynner å redigere filer i VSCode og dermed kjører yarn build:watch, oppdaterer jeg alle packages/package-n/package.json-filer ved å erstatte "types": "dist/index.d.ts" med "types": "src/index.ts". Dette fikser command+klikk og refaktorering, noe som er flott. Når det gjelder engangs-bygning (f.eks. før publisering), går "types" tilbake til "dist/index.d.ts".
Jeg lurer på om det finnes en bedre måte å oppnå det jeg er ute etter, og det hadde vært flott om noen kunne gi meg råd. Jeg er ganske sikker på at jeg en dag ved et uhell vil comitte "src/index.ts" eller til og med publisere en versjon med denne verdien. Innholdet i src/*.ts er ekskludert fra npm-utgivelsene for å holde pakkene mine små.
Svar #1
https://github.com/Izhaki/mono.ts
Den bruker Yarn workspaces og fungerer godt sammen med VSCode. Jeg håper README-en er klar nok.
I utgangspunktet, bruk to (parallelle) TypeScript-konfigurasjonstrær:
- Forhåndsbygg - bruker aliaser (for VSCode, tester, webpack, osv).
- Build - bruker TypeScript 3 prosjektreferanser for publisering i hovedsak.