Publishing
Publishing is automatic on a GitHub release — you never run dotnet nuget push by hand.
Flow (.github/workflows/nuget-publish.yml)
Triggered on release: published. Two jobs:
sync-version— checks outmain, strips the leadingvfrom the release tag, and compares it to the<version>inapplication.properties. If they differ it edits the file, pushes arelease-sync/<version>branch, opens aCI/CD-labeled PR, and auto-merges it (gh pr merge --admin --squash --delete-branch). This keepsapplication.properties(the single source of truth for the package version) in lockstep with the tag.publish(needs: sync-version) — checks outmain, sets up .NET10.0.x, then:dotnet pack src/Schuly.Plugin.Abstractions/Schuly.Plugin.Abstractions.csproj \--configuration Release -o ./outdotnet nuget push ./out/*.nupkg \--api-key ${{ secrets.NUGET_API_KEY }} \--source https://api.nuget.org/v3/index.json \--skip-duplicate--skip-duplicatemakes a re-run safe if the version already exists on NuGet.org.
Where releases come from
Releases are cut by .github/workflows/auto-release-on-main.yml, which fires only when the
shipped backend DLLs change (paths: src/Schuly.Plugin.Abstractions/libs/**). It computes
the next patch version from application.properties and runs gh release create. Releases
for contract changes are otherwise driven by release-drafter — see versioning.
Package metadata
Edit metadata in the csproj PropertyGroup
(src/Schuly.Plugin.Abstractions/Schuly.Plugin.Abstractions.csproj): PackageId,
Description, Authors, PackageProjectUrl, PackageLicenseExpression (MIT),
PackageTags, etc.
Two READMEs
| File | Audience | Notes |
|---|---|---|
README.md (repo root) | GitHub | Centered logo, badges, raw HTML. |
src/Schuly.Plugin.Abstractions/NUGET_README.md | NuGet.org | Plain markdown with absolute image URLs — NuGet.org doesn't render HTML, and relative image paths won't resolve. |
The csproj sets <PackageReadmeFile>README.md</PackageReadmeFile> and packs
NUGET_README.md as README.md inside the package:
<None Include="NUGET_README.md" Pack="true" PackagePath="README.md" />
So the NuGet page shows NUGET_README.md, while the GitHub repo page shows the root
README.md.
Icon
The package icon is assets/app_icon.png, packed as icon.png:
<None Include="../../assets/app_icon.png" Pack="true" PackagePath="icon.png" />
and wired up with <PackageIcon>icon.png</PackageIcon>.