Entwicklungsumgebung
Voraussetzungen
- .NET 10 SDK - jede Plugin-csproj zielt auf
net10.0(<TargetFramework>net10.0</TargetFramework>). - EF-Core-CLI-Tools (
dotnet-ef) - für Plugins mit einemDbContext(Schulware, OdaOrg). Installieren/aktualisieren mitdotnet tool install --global dotnet-ef(oderdotnet tool update). Siehe migrations.md. - Kiota - nur nötig, um den Schulware-API-Client neu zu generieren. Siehe setup/kiota-client.md.
- Ein laufendes SchulyBackend mit PostgreSQL, um ein Plugin end-to-end zu laden und zu testen.
Die Abhängigkeit zu den Abstractions
Schuly.Plugin.Abstractions ist eine NuGet-PackageReference, keine Projektreferenz:
<PackageReference Include="Schuly.Plugin.Abstractions" Version="0.2.*" />Sie liefert ISchulyPlugin, IPluginBackgroundTask, IPluginUserContext, IPluginLogin und PluginServiceContext. Vom Backend bereitgestellte Typen wie IPluginVault (Schuly.Infrastructure.Vault) werden zur Laufzeit aus dem DI-Container des Hosts aufgelöst - der Host registriert das isolierte Vault jedes Plugins unter dessen Name.
Wie ein Plugin aufgebaut ist
Ein Plugin ist eine Class Library, die eine ISchulyPlugin-Implementierung bereitstellt (die Composition Root, schlank wie eine ASP.NET-Program.cs). Die umfangreicheren Plugins halten HTTP-Routen in Controllers/ (als MVC-ApplicationPart erkannt), statt sie in ConfigureEndpoints zu mappen, und teilen die Sync-Logik auf kleine, gescopte Services auf, die von einem einzigen IPluginBackgroundTask gesteuert werden.
Den vollständigen Lebenszyklus findest du unter adding-a-plugin.md.
Ein Plugin bauen
# Ein einzelnes Plugin restoren + bauen
dotnet build src/Schuly.Plugin.Schulware/Schuly.Plugin.Schulware.csproj -c Release
# Das ladbare Ergebnis erzeugen (DLL + Nicht-Host-Abhängigkeiten) - derselbe Befehl wie in der CI
dotnet publish src/Schuly.Plugin.Schulware/Schuly.Plugin.Schulware.csproj -c Release -o ./outJedes Plugin hat zudem eine .slnx-Solution-Datei, um es eigenständig in einer IDE zu öffnen.
Ein Plugin gegen ein laufendes Backend betreiben
Der Plugin-Host des Backends lädt Plugin-DLLs aus seinem plugins/-Verzeichnis (/app/plugins/ im Container) und liest die YAML-Konfiguration jedes Plugins aus seinem Plugins-Config-Verzeichnis.
- SchulyBackend + Postgres hochfahren (siehe README des Backends).
- Führe
dotnet publishfür das Plugin aus (siehe oben) und kopiere die Plugin-DLL samt ihren Drittanbieter-Abhängigkeits-DLLs in denplugins/-Ordner des Backends. Vom Host geteilte Assemblies (ASP.NET Core, EF Core, Npgsql, die Abstractions, die Schuly-Host-Assemblies) stellt das Backend bereits bereit - nur echte Drittanbieter-Abhängigkeiten (z. B. Kiota, AngleSharp) müssen zusammen mit dem Plugin ausgeliefert werden. - Lege die Laufzeitkonfiguration des Plugins als
Schuly.Plugin.<Name>.ymlin das Plugins-Config-Verzeichnis des Backends. Für Schulware muss diese mindestensSchulwareApi.BaseUrlenthalten - sonst wirftConfigureServiceseinen Fehler und verweigert das Laden (siehesrc/Schuly.Plugin.Schulware/config.ymlfür das Schema). - Backend neu starten. Beim Start ruft der Host
ConfigureServices→ConfigureEndpoints→MigrateAsyncauf (wasdb.Database.MigrateAsync()ausführt, um die dedizierte Postgres-Datenbank des Plugins anzulegen bzw. zu aktualisieren) und plant anschliessend jedenIPluginBackgroundTaskgemäss seinemIntervalein.
Für die reale Distribution (vorgebaute DLLs per curl herunterladen) siehe setup/distribution.md.
