MyBotBoxMyBotBox

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 kein dist/ 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/ (plus README.md und LICENSE) — niemals src/. Die Auflösung erfolgt ĂŒber die import/default-Bedingungen zu dist/index.js, mit Typen aus dist/index.d.ts.
  • Builds fĂŒhren tsc und anschließend tsc-alias --resolve-full-paths aus, 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ĂŒrde npm install aufgrund 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