Development
Local environment for building and packing the abstractions package.
Prerequisites
- .NET SDK 10.0.x - the project targets
net10.0(<TargetFramework>net10.0</TargetFramework>in the csproj). - The project uses a
Microsoft.AspNetCore.Appframework reference, so the ASP.NET Core shared framework must be available (it ships with the .NET SDK).
Project layout
src/
├── Directory.Build.props # reads <version> from application.properties
├── Schuly.Plugin.Abstractions/
│ ├── ISchulyPlugin.cs # + PluginServiceContext record
│ ├── IPluginBackgroundTask.cs
│ ├── PluginSchedule.cs # PluginSchedule record
│ ├── IPluginEventHandler.cs
│ ├── IPluginUserContext.cs
│ ├── IPluginLogin.cs # + PluginLoginResult record
│ ├── NUGET_README.md # packed as the NuGet README
│ ├── Schuly.Plugin.Abstractions.csproj
│ └── libs/ # shipped backend DLLs
│ ├── Schuly.Domain.dll
│ └── Schuly.Infrastructure.dll
└── Schuly.Plugin.Abstractions.Tests/
├── PluginScheduleTests.cs
└── Schuly.Plugin.Abstractions.Tests.csprojThe csproj references libs/Schuly.Domain.dll and libs/Schuly.Infrastructure.dll (synced from SchulyBackend) so the project compiles against them, and packs them under lib/net10.0/ so plugins get typed DB access. The transitive deps those DLLs need (Microsoft.EntityFrameworkCore, Npgsql.EntityFrameworkCore.PostgreSQL) are declared as PackageReferences in the csproj.
Build
The repo root has a solution file (Schuly.Plugin.Abstractions.slnx) that builds both the abstractions project and its test project together:
dotnet buildOr point at the abstractions project directly, as the publish workflow does:
dotnet build src/Schuly.Plugin.Abstractions/Schuly.Plugin.Abstractions.csprojThere is now a TUnit test project (Schuly.Plugin.Abstractions.Tests) covering PluginSchedule:
dotnet testThe interfaces themselves have no runtime behavior of their own and are still verified by downstream consumers (SchulyBackend and the plugins).
Pack dry-run (local)
To produce the .nupkg locally without publishing:
dotnet pack Schuly.Plugin.Abstractions.csproj --configuration Release -o ./out(From the repo root, point at the full path src/Schuly.Plugin.Abstractions/Schuly.Plugin.Abstractions.csproj - that's exactly what the publish workflow runs.)
You do not pass -p:Version=. The version comes from application.properties (<version>…</version>), which src/Directory.Build.props reads at project-load time via a regex and assigns to $(Version). Directory.Build.props also pins the assembly version to MAJOR.MINOR.0.0 so any MAJOR.MINOR.x plugin binds to a single stable assembly version, while FileVersion / InformationalVersion keep the full version for diagnostics.
See publishing for how packing fits into the release flow.
