Wie @yarlisai-Pakete eingebunden werden
Die Dual-Mode-Architektur: Bun-Workspace-Quellkonsumption intern, npm-Dist-Tarballs extern.
Jedes @yarlisai/*-Paket wird gleichzeitig auf zwei völlig unterschiedliche Arten eingebunden. Das VerstĂ€ndnis beider Modi erklĂ€rt, warum Deployments nie npm berĂŒhren, warum es in der lokalen Entwicklung keinen Build-Schritt gibt und warum das Veröffentlichen ein paralleler Prozess und keine Deploy-AbhĂ€ngigkeit ist.
Die Exports-Map
Beide Modi hÀngen an derselben konditionalen exports-Map, die in jedem Paket vorhanden ist:
{
"exports": {
".": {
"bun": "./src/index.ts",
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"default": "./dist/index.js"
}
}
}Die bun-Bedingung wird unter der Bun-Runtime zuerst aufgelöst und zeigt direkt auf den TypeScript-Quellcode. Alle anderen Konsumenten (Node, Bundler, die import/default unterstĂŒtzen) erhalten die kompilierte dist/-Ausgabe.
Interner Modus â Workspace-Quellcode
Innerhalb des Monorepos deklarieren Apps Pakete als "@yarlisai/<pkg>": "workspace:*". Bun-Workspaces verlinken node_modules/@yarlisai/<pkg> per Symlink auf packages/<pkg>/, und die bun-Exportbedingung löst Importe direkt zu src/index.ts auf:
- Kein Build-Schritt in der Entwicklung. Das Bearbeiten von
packages/email/src/lĂ€dt die App sofort neu â es gibt keindist/zum Neubauen und kein veraltetes Artefakt, dem man hinterherjagen mĂŒsste. - Docker/CD baut aus dem Quellcode. Das Produktions-Image (
Dockerfile.cloudrun) kopiert den Workspace, baut mit turbo, und Next.js standalone output tracing bĂŒndelt genau die Paketdateien, die die App importiert. - npm wird bei Deployments nie kontaktiert. Ein Registry-Ausfall, eine zurĂŒckgezogene Version oder ein fehlgeschlagenes Publish können ein Deployment nicht gefĂ€hrden â die App liefert aus, was im Git-Tree vorhanden ist.
Externer Modus â npm-Tarballs
Externe Konsumenten installieren von npm und erhalten das veröffentlichte Tarball:
- Das Tarball enthÀlt
dist/(plusREADME.mdundLICENSE) â niemalssrc/. Die Auflösung erfolgt ĂŒber dieimport/default-Bedingungen zudist/index.js, mit Typen ausdist/index.d.ts. - Builds fĂŒhren
tscund anschlieĂendtsc-alias --resolve-full-pathsaus, sodass emittierte Importe explizite.js-Erweiterungen tragen â Node ESM ist dabei streng, auch wenn Bundler es nicht sind. - Zum Zeitpunkt der Veröffentlichung werden
workspace:*-AbhĂ€ngigkeitsbereiche vom Publish-Workflow in echte Semver-Bereiche (^x.y.z) umgeschrieben. Ohne diese Umschreibung wĂŒrdenpm installaufgrund ungĂŒltiger Semver scheitern. - Pakete werden derzeit als restricted in der Yarlis-npm-Org veröffentlicht; öffentlicher Zugriff ist geplant.
Der externe Pfad wird in CI durch einen External-Consumer-Smoke-Test geprĂŒft, der jedes Paket packt, die Tarballs in ein temporĂ€res Projekt mit normalem npm installiert und jeden Export-Subpfad unter normalem Node importiert â kein Bun, keine Workspace-Symlinks. Die bun-Bedingung wĂŒrde andernfalls defekte dist/-Artefakte vor allen internen Konsumenten verbergen.
Warum beides
- Deployments sind unabhĂ€ngig von npm. Probleme beim Veröffentlichen (und npm-AusfĂ€lle) blockieren nie die Auslieferung des Produkts â die App konsumiert den Quellcode ĂŒber den Workspace.
- Sofortige Entwicklungsiteration. Konsumption auf Quellebene bedeutet, dass paketĂŒbergreifende Ănderungen ein einziger Hot-Reload sind und kein Build-Link-Neustart-Zyklus.
- Der Framework-Track ist entkoppelt. Versionierung, Changelogs und das Veröffentlichen laufen ĂŒber Changesets und dedizierte Publish-Workflows in eigenem Rhythmus, ohne Koordination mit App-Releases.
Der Preis des Dual-Mode ist, dass interne Konsumption externe Fehler verbergen kann â genau dafĂŒr gibt es das publint-Gate und den externen Smoke-Test.
Siehe auch
- Framework-Ăbersicht
- ADR 0007 â Port/Adapter-Vertrag
- Access-Flip-Runbook:
docs/maintenance/npm-public-launch.mdim Monorepo