From 566403386e940089754f65bf4acd6751b88564e7 Mon Sep 17 00:00:00 2001 From: Andrei Ignat Date: Thu, 16 Jul 2026 18:56:27 +0300 Subject: [PATCH 1/4] frist --- README.md | 30 +- later.md | 2 +- v2/.tours/Bennewitz.Ninja.AutoVersioning.tour | 36 ++ v2/Generator/all.csv | 1 + v2/RSCGExamplesData/GeneratorDataRec.json | 6 + .../description.json | 22 + .../Bennewitz.Ninja.AutoVersioning/nuget.txt | 1 + .../Bennewitz.Ninja.AutoVersioning/readme.txt | 163 ++++++++ .../src/InfoPrj.slnx | 3 + .../src/InfoPrj/InfoPrj.csproj | 49 +++ .../src/InfoPrj/Program.cs | 4 + .../Bennewitz.Ninja.AutoVersioning/video.json | 39 ++ .../docs/Authors/Brian_Bennewitz.md | 7 + .../docs/Categories/EnhancementProject.md | 36 +- .../_PrimitiveEnhancementProject.mdx | 34 +- .../Bennewitz.Ninja.AutoVersioning.md | 380 ++++++++++++++++++ .../docs/RSCG-Examples/index.md | 13 +- v2/rscg_examples_site/docs/about.md | 2 +- v2/rscg_examples_site/docs/indexRSCG.md | 5 +- .../src/components/HomepageFeatures/index.js | 2 +- .../static/exports/RSCG.json | 8 + .../static/exports/RSCG.xlsx | Bin 14447 -> 14503 bytes 22 files changed, 798 insertions(+), 45 deletions(-) create mode 100644 v2/.tours/Bennewitz.Ninja.AutoVersioning.tour create mode 100644 v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/description.json create mode 100644 v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/nuget.txt create mode 100644 v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/readme.txt create mode 100644 v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj.slnx create mode 100644 v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/InfoPrj.csproj create mode 100644 v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/Program.cs create mode 100644 v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/video.json create mode 100644 v2/rscg_examples_site/docs/Authors/Brian_Bennewitz.md create mode 100644 v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md diff --git a/README.md b/README.md index 9c473792d..07d4297e0 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# RSCG - 276 Examples of Roslyn Source Code Generators / 16 created by Microsoft / +# RSCG - 277 Examples of Roslyn Source Code Generators / 16 created by Microsoft / -The RSCG_Examples repository is a comprehensive documentation system that automatically processes and showcases 276 Roslyn Source Code Generator (RSCG) examples. The system transforms individual RSCG projects into structured documentation with code examples and cross-referenced content with a searchable website and code example exports. +The RSCG_Examples repository is a comprehensive documentation system that automatically processes and showcases 277 Roslyn Source Code Generator (RSCG) examples. The system transforms individual RSCG projects into structured documentation with code examples and cross-referenced content with a searchable website and code example exports. This system serves as both a learning resource for .NET developers interested in source generators and an automated pipeline for maintaining up-to-date documentation about the RSCG ecosystem -## Latest Update : 2026-07-03 => 03 July 2026 +## Latest Update : 2026-07-04 => 04 July 2026 If you want to see examples with code, please click ***[List V2](https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG)*** @@ -24,8 +24,30 @@ If you want to be notified each time I add a new RSCG example , please click htt ## Content -Those are the 276 Roslyn Source Code Generators that I have tested you can see and download source code example. +Those are the 277 Roslyn Source Code Generators that I have tested you can see and download source code example. ( including 16 from Microsoft ) +### 277. [Bennewitz.Ninja.AutoVersioning](https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning) , in the [EnhancementProject](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#enhancementproject) category + +Generated on : 2026-07-04 => 04 July 2026 + +
+ Expand + + + +Author: Brian Bennewitz + +Assembly info incremental source generator. + +Nuget: [https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/) + + +Link: [https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning](https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning) + +Source: [https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning) + +
+ ### 276. [TinyBDD.MSTest](https://ignatandrei.github.io/RSCG_Examples/v2/docs/TinyBDD.MSTest) , in the [Tests](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#tests) category Generated on : 2026-07-03 => 03 July 2026 diff --git a/later.md b/later.md index 7d3884886..736db985d 100644 --- a/later.md +++ b/later.md @@ -1,6 +1,6 @@ # Just later -## Latest Update : 2026-07-03 => 03 July 2026 +## Latest Update : 2026-07-04 => 04 July 2026 diff --git a/v2/.tours/Bennewitz.Ninja.AutoVersioning.tour b/v2/.tours/Bennewitz.Ninja.AutoVersioning.tour new file mode 100644 index 000000000..7cce7429b --- /dev/null +++ b/v2/.tours/Bennewitz.Ninja.AutoVersioning.tour @@ -0,0 +1,36 @@ + +{ + "$schema": "https://aka.ms/codetour-schema", + "title": "Bennewitz.Ninja.AutoVersioning", + "steps": + [ + { + "file": "rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/InfoPrj.csproj", + "description": "First, we add Nuget [Bennewitz.Ninja.AutoVersioning](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/) in csproj ", + "pattern": "Bennewitz.Ninja.AutoVersioning" + } + + ,{ + "file": "rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/Program.cs", + "description": "File Program.cs \r\n>> dotnet run --project rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/InfoPrj.csproj ", + "pattern": "this is the code" + } + + + ,{ + "file": "rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/obj/GX/Bennewitz.Ninja.AutoVersioning.SourceGenerators/Bennewitz.Ninja.AutoVersioning.SourceGenerators.AssemblyInfoGenerator/DirectoryBuildInfo.g.cs", + "description": "Generated File 2 from 2 : DirectoryBuildInfo.g.cs ", + "line": 1 + } + + ,{ + "file": "rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/obj/GX/Bennewitz.Ninja.AutoVersioning.SourceGenerators/Bennewitz.Ninja.AutoVersioning.SourceGenerators.AssemblyInfoGenerator/AutoVersionedAssemblyInfo.g.cs", + "description": "Generated File 1 from 2 : AutoVersionedAssemblyInfo.g.cs ", + "line": 1 + } + + ], + + "ref": "main" + +} \ No newline at end of file diff --git a/v2/Generator/all.csv b/v2/Generator/all.csv index d801233b3..df9f2acc0 100644 --- a/v2/Generator/all.csv +++ b/v2/Generator/all.csv @@ -275,3 +275,4 @@ Nr,Key,Source,Category 274,Dirge, https://github.com/IkuzakIkuzok/Dirge,Disposer 275,Porticle.Enumly, https://github.com/Machibuse/Porticle.Enumly,Enum 276,TinyBDD.MSTest, https://github.com/JerrettDavis/TinyBDD,Tests +277,Bennewitz.Ninja.AutoVersioning, https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning,EnhancementProject diff --git a/v2/RSCGExamplesData/GeneratorDataRec.json b/v2/RSCGExamplesData/GeneratorDataRec.json index f412f54f8..73af9bf9f 100644 --- a/v2/RSCGExamplesData/GeneratorDataRec.json +++ b/v2/RSCGExamplesData/GeneratorDataRec.json @@ -1672,5 +1672,11 @@ "Category": 13, "dtStart": "2026-07-03T00:00:00", "show": true + }, + { + "ID":"Bennewitz.Ninja.AutoVersioning", + "Category": 1, + "dtStart": "2026-07-04T00:00:00", + "show": true } ] \ No newline at end of file diff --git a/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/description.json b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/description.json new file mode 100644 index 000000000..a464d7605 --- /dev/null +++ b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/description.json @@ -0,0 +1,22 @@ +{ + "generator":{ + "name":"Bennewitz.Ninja.AutoVersioning", + "nuget":[ + "https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/" + ], + "link":"https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning", + "author":"Brian Bennewitz", + "source":"https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning" + }, + "data":{ + "goodFor":["Generating build version numbers for .NET projects"], + "csprojDemo":"InfoPrj.csproj", + "csFiles":["Program.cs"], + "excludeDirectoryGenerated":[""], + "includeAdditionalFiles":[""] + }, + "links":{ + "blog":"", + "video":"" + } +} \ No newline at end of file diff --git a/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/nuget.txt b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/nuget.txt new file mode 100644 index 000000000..b6931cdad --- /dev/null +++ b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/nuget.txt @@ -0,0 +1 @@ +Assembly info incremental source generator. \ No newline at end of file diff --git a/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/readme.txt b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/readme.txt new file mode 100644 index 000000000..e0ba900fd --- /dev/null +++ b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/readme.txt @@ -0,0 +1,163 @@ +# Bennewitz.Ninja.AutoVersioning + +A [Roslyn incremental source generator](https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview) that injects assembly metadata attributes and build-time constants into .NET projects at compile time — no `AssemblyInfo.cs`, no disk writes, full IDE caching. + +[![NuGet](https://img.shields.io/nuget/v/Bennewitz.Ninja.AutoVersioning.svg)](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning) +[![CI](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/actions/workflows/ci.yml/badge.svg)](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/actions/workflows/ci.yml) + +## Requirements + +.NET SDK 6.0 or later (requires Roslyn 4.0+ for `IIncrementalGenerator` support). The consuming project may target any framework — `.NET Framework 4.x`, `.NET Standard`, `.NET 6+`, etc. + +## Quick Start + +**1. Add the package:** + +```xml + +``` + +**2. Enable the generator** in your root `Directory.Build.props` (or any `.props` / `.csproj` imported by your build): + +```xml + + true + YourCompany + YourProduct + + + $(GITHUB_SHA) + $(GITHUB_ACTIONS) + $(MY_VERSION_VAR) + +``` + +> **Note:** The package's auto-imported `Build.props` automatically suppresses the 8 SDK-generated attributes that conflict with this generator (e.g. `AssemblyVersion`, `AssemblyCopyright`). It uses granular per-attribute suppressions rather than `false`, which means `InternalsVisibleTo` and all other SDK-generated attributes continue to work normally. Do **not** add `false` yourself — it will break `InternalsVisibleTo`. + +A ready-to-use template is available at [`Directory.Build.props.template`](Directory.Build.props.template). + +**3. Build.** The generator runs automatically — no further setup needed. + +> **Tip:** View the generated files in your IDE under `Dependencies → Analyzers → *SourceGenerators`. + +--- + +## Generated Output + +Given a build on 2026-04-29 at 14:35 UTC for company `Acme Corp`, product `Acme App`, commit `abc1234def`, and public version `3.1.0`: + +### `AutoVersionedAssemblyInfo.g.cs` + +```csharp +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyDescription("Assembly Version: 2026.2.429.1435")] +[assembly: AssemblyConfiguration("Release")] +[assembly: AssemblyCompany("Acme Corp")] +[assembly: AssemblyProduct("Acme App v2026.2.429.1435")] +[assembly: AssemblyCopyright("Copyright 2026 [Release]")] +[assembly: AssemblyVersion("2026.2.429.1435")] +[assembly: AssemblyFileVersion("2026.2.429.1435")] +[assembly: AssemblyInformationalVersion("Commit♥: abc1234def")] +[assembly: AssemblyMetadata("CommitSha", "abc1234def")] +[assembly: AssemblyMetadata("GITHUB_SHA", "abc1234def")] +[assembly: AssemblyMetadata("PublicVersion", "3.1.0")] +``` + +### `DirectoryBuildInfo.g.cs` + +```csharp +// +namespace Bennewitz.Ninja.AutoVersioning +{ + /// Build-time constants generated by the source generator. + public static class DirectoryBuildInfo + { + public const string BuildRelease = "Version 2026.2.429.1435 [built 4/29/2026 2:35:00 PM (UTC)]"; + } +} +``` + +Use `DirectoryBuildInfo.BuildRelease` wherever you need the build version at runtime — error trackers, log enrichment, health endpoints — without reading environment variables. + +--- + +## Configuration Reference + +| MSBuild Property | Description | Required | +|---|---|---| +| `GenerateAutoVersionedAssemblyInfo` | Set to `true` to enable the generator | **Yes** | +| `AssemblyCompany` | Value for `[assembly: AssemblyCompany(...)]` | **Yes** | +| `AssemblyProduct` | Value for `[assembly: AssemblyProduct(...)]` | **Yes** | +| `CopyrightHolder` | Name shown in the copyright attribute — defaults to `AssemblyCompany` if omitted | No | +| `CommitSha` | Git commit SHA | No | +| `IsContinuousIntegration` | `true` on CI runs | No | +| `PublicVersion` | Your app's public-facing version string | No | +| `Configuration` | `Debug` / `Release` — set automatically by MSBuild | Auto | +| `BuildTimestamp` | Build start time in `yyyyMMddHHmmss` format — captured automatically at MSBuild evaluation time (before any project compiles), ensuring a consistent version across all projects in a multi-project solution build. Override on CI for an exact guarantee: `dotnet build -p:BuildTimestamp=$(date +%Y%m%d%H%M%S)` | Auto | + +### CI Provider Mappings + +| Provider | Commit SHA | CI flag | +|---|---|---| +| GitHub Actions | `$(GITHUB_SHA)` | `$(GITHUB_ACTIONS)` | +| GitLab CI | `$(CI_COMMIT_SHA)` | `$(GITLAB_CI)` | +| Bitbucket Pipelines | `$(BITBUCKET_COMMIT)` | `$(CI)` | + +### Version Format + +The generator uses **CalVer**: `YEAR.QUARTER.MMDD.HHmm` + +| Part | Example | Meaning | +|---|---|---| +| Major | `2026` | Calendar year | +| Minor | `2` | Quarter (1–4) | +| Build | `429` | Month + day (`MMdd` as integer) | +| Revision | `1435` | Hour + minute (`HHmm` as integer) | + +--- + +## How It Works + +This is a modern C# `IIncrementalGenerator`. Compared to legacy `ISourceGenerator` approaches it: + +- Runs **entirely in-memory** — zero files written to disk +- Uses the **Roslyn caching pipeline** — the IDE (Rider, Visual Studio) only re-runs the generator when its inputs change, eliminating background compilation loops +- Reads MSBuild properties **via `AnalyzerConfigOptionsProvider`** — safe, no direct environment variable reads + +The package auto-imports `Build.props` via NuGet, which declares `CompilerVisibleProperty` items and suppresses the SDK's default `AssemblyInfo` generation (preventing CS0579 duplicate attribute errors when the generator is enabled). + +### Timestamp Consistency in Multi-Project Builds + +`BuildTimestamp` keeps the version consistent across every project in a solution build. See [`docs/MultiProjectBuildTimestamps.md`](docs/MultiProjectBuildTimestamps.md) for how it works and what alternative approaches were considered. + +> **TL;DR:** For CI, or any local build where an exact guarantee matters more than convenience, use `-p:BuildTimestamp=...` to fix the value explicitly instead of relying on evaluation-time capture. Ready-to-use wrappers are available at [`Build.ps1.template`](Build.ps1.template) (Windows/PowerShell 7+) and [`Build.sh.template`](Build.sh.template) (Linux/macOS/bash). + +### Diagnostics + +| ID | Severity | Description | +|---|---|---| +| `BAUTOVERSIONING00` | Warning | Generator is installed but `GenerateAutoVersionedAssemblyInfo` is not set to `true` (single-line signal) | +| `BAUTOVERSIONING01` | Warning | Generator threw an unexpected exception | +| `BAUTOVERSIONING02` | Error | `AssemblyCompany` is not configured | +| `BAUTOVERSIONING03` | Error | `AssemblyProduct` is not configured | +| `BAUTOVERSIONING04` | Warning | Multi-line setup snippet emitted alongside BAUTOVERSIONING00 — shows the required `Directory.Build.props` configuration | + +--- + +## Building Locally + +Requires PowerShell 7+ and the .NET SDK. + +```powershell +./Pack.ps1 +``` + +The script prompts for a version (defaults to CalVer `YYYY.Q.MMDD`) and produces `.nupkg` files in `packages/Debug/` and `packages/Release/`. + +--- + +## License + +MIT © 2026 Brian Bennewitz diff --git a/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj.slnx b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj.slnx new file mode 100644 index 000000000..8059a92a1 --- /dev/null +++ b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj.slnx @@ -0,0 +1,3 @@ + + + diff --git a/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/InfoPrj.csproj b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/InfoPrj.csproj new file mode 100644 index 000000000..e9d6db399 --- /dev/null +++ b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/InfoPrj.csproj @@ -0,0 +1,49 @@ + + + + Exe + net10.0 + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + true + + false + false + false + false + false + false + false + false + + + AOM Company + Andrei Ignat Product + + + $(GITHUB_SHA) + $(GITHUB_ACTIONS) + $(MY_VERSION_VAR) + + + true + $(BaseIntermediateOutputPath)\GX + + + diff --git a/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/Program.cs b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/Program.cs new file mode 100644 index 000000000..daf2b705a --- /dev/null +++ b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/src/InfoPrj/Program.cs @@ -0,0 +1,4 @@ +using Bennewitz.Ninja.AutoVersioning; + +Console.WriteLine("Hello, World!"); +Console.WriteLine(DirectoryBuildInfo.BuildRelease); \ No newline at end of file diff --git a/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/video.json b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/video.json new file mode 100644 index 000000000..7eea42a1a --- /dev/null +++ b/v2/rscg_examples/Bennewitz.Ninja.AutoVersioning/video.json @@ -0,0 +1,39 @@ +{ + "scriptName": "Bennewitz.Ninja.AutoVersioning", + "steps": +[ + {"typeStep":"exec","arg":"clipchamp.exe launch"}, + {"typeStep":"text","arg": "Welcome to Roslyn Examples"}, + {"typeStep":"text","arg":"If you want to see more examples , see List Of RSCG"}, + {"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/List-of-RSCG"}, + {"typeStep":"text","arg": "My name is Andrei Ignat and I am deeply fond of Roslyn Source Code Generator. "}, + +{"typeStep":"text","arg": "Today I will present Bennewitz.Ninja.AutoVersioning . Generating build version numbers for .NET projects ."}, +{"typeStep":"browser","arg":"https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/"}, +{"typeStep":"text","arg": "The whole example is here"}, +{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning"}, +{"typeStep":"text","arg": "You can download the code from here"}, +{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning#download-example-net--c-"}, +{"typeStep":"text","arg":"Here is the code downloaded "}, +{"typeStep":"exec","arg":"explorer.exe /select,D:\\gth\\RSCG_Examples\\v2\\Generator.sln"}, +{"typeStep":"text","arg": "So , let's start the project with Visual Studio Code "}, +{"typeStep":"stepvscode","arg": "-n D:\\gth\\RSCG_Examples\\v2"}, + +{"typeStep":"text","arg": "To use it ,you will put the Nuget Bennewitz.Ninja.AutoVersioning into the csproj "}, + +{"typeStep":"stepvscode","arg": "-r -g D:\\gth\\RSCG_Examples\\v2\\rscg_examples\\Bennewitz.Ninja.AutoVersioning\\src\\InfoPrj\\InfoPrj.csproj"}, + +{"typeStep":"text","arg": "And now I will show you an example of using Bennewitz.Ninja.AutoVersioning"}, + +{"typeStep":"hide","arg": "now execute the tour in VSCode"}, +{"typeStep":"tour", "arg": "src/.tours/"}, +{"typeStep":"text","arg":" And I will execute the project"}, +{"typeStep":"showproj", "arg":"InfoPrj.csproj"}, +{"typeStep":"text","arg":" This concludes the project"}, +{"typeStep":"waitseconds","arg":"30"}, +{"typeStep":"text","arg": "Remember, you can download the code from here"}, +{"typeStep":"browser","arg":"https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning#download-example-net--c-", +SpeakTest=" "}, +{"typeStep":"waitseconds","arg":"30"}, +] +} diff --git a/v2/rscg_examples_site/docs/Authors/Brian_Bennewitz.md b/v2/rscg_examples_site/docs/Authors/Brian_Bennewitz.md new file mode 100644 index 000000000..300c2f60e --- /dev/null +++ b/v2/rscg_examples_site/docs/Authors/Brian_Bennewitz.md @@ -0,0 +1,7 @@ +# Author : Brian Bennewitz + +Number RSCG: 1 + + + 1 [Bennewitz.Ninja.AutoVersioning](/docs/Bennewitz.Ninja.AutoVersioning) [![Nuget](https://img.shields.io/nuget/dt/Bennewitz.Ninja.AutoVersioning?label=Bennewitz.Ninja.AutoVersioning)](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/) ![GitHub Repo stars](https://img.shields.io/github/stars/JanusMael/Bennewitz.Ninja.AutoVersioning?style=social) 2026-07-04 + diff --git a/v2/rscg_examples_site/docs/Categories/EnhancementProject.md b/v2/rscg_examples_site/docs/Categories/EnhancementProject.md index 333c4bfdb..2b7bb5f1a 100644 --- a/v2/rscg_examples_site/docs/Categories/EnhancementProject.md +++ b/v2/rscg_examples_site/docs/Categories/EnhancementProject.md @@ -1,6 +1,6 @@

EnhancementProject

-Number RSCG: 21 +Number RSCG: 22 1 [AssemblyMetadata](/docs/AssemblyMetadata) [![Nuget](https://img.shields.io/nuget/dt/AssemblyMetadata?label=AssemblyMetadata)](https://www.nuget.org/packages/AssemblyMetadata/) ![GitHub Repo stars](https://img.shields.io/github/stars/BenjaminAbt/AssemblyMetadata?style=social) 2026-04-02 @@ -12,35 +12,37 @@ Number RSCG: 21 5 [AutoSpectre](/docs/AutoSpectre) [![Nuget](https://img.shields.io/nuget/dt/AutoSpectre.SourceGeneration?label=AutoSpectre.SourceGeneration)](https://www.nuget.org/packages/AutoSpectre.SourceGeneration)[![Nuget](https://img.shields.io/nuget/dt/AutoSpectre?label=AutoSpectre)](https://www.nuget.org/packages/AutoSpectre) ![GitHub Repo stars](https://img.shields.io/github/stars/jeppevammenkristensen/auto-spectre?style=social) 2024-02-24 - 6 [BuildInfo](/docs/BuildInfo) [![Nuget](https://img.shields.io/nuget/dt/BuildInfo?label=BuildInfo)](https://www.nuget.org/packages/BuildInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/linkdotnet/BuildInformation?style=social) 2024-01-20 + 6 [Bennewitz.Ninja.AutoVersioning](/docs/Bennewitz.Ninja.AutoVersioning) [![Nuget](https://img.shields.io/nuget/dt/Bennewitz.Ninja.AutoVersioning?label=Bennewitz.Ninja.AutoVersioning)](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/) ![GitHub Repo stars](https://img.shields.io/github/stars/JanusMael/Bennewitz.Ninja.AutoVersioning?style=social) 2026-07-04 - 7 [Credfeto.Version.Information.Generator](/docs/Credfeto.Version.Information.Generator) [![Nuget](https://img.shields.io/nuget/dt/Credfeto.Version.Information.Generator?label=Credfeto.Version.Information.Generator)](https://www.nuget.org/packages/Credfeto.Version.Information.Generator/) ![GitHub Repo stars](https://img.shields.io/github/stars/credfeto/credfeto-version-constants-generator?style=social) 2024-11-05 + 7 [BuildInfo](/docs/BuildInfo) [![Nuget](https://img.shields.io/nuget/dt/BuildInfo?label=BuildInfo)](https://www.nuget.org/packages/BuildInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/linkdotnet/BuildInformation?style=social) 2024-01-20 - 8 [Larcanum.GitInfo](/docs/Larcanum.GitInfo) [![Nuget](https://img.shields.io/nuget/dt/Larcanum.GitInfo?label=Larcanum.GitInfo)](https://www.nuget.org/packages/Larcanum.GitInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/lord-executor/Larcanum.GitInfo?style=social) 2025-01-17 + 8 [Credfeto.Version.Information.Generator](/docs/Credfeto.Version.Information.Generator) [![Nuget](https://img.shields.io/nuget/dt/Credfeto.Version.Information.Generator?label=Credfeto.Version.Information.Generator)](https://www.nuget.org/packages/Credfeto.Version.Information.Generator/) ![GitHub Repo stars](https://img.shields.io/github/stars/credfeto/credfeto-version-constants-generator?style=social) 2024-11-05 - 9 [LinqGen.Generator](/docs/LinqGen.Generator) [![Nuget](https://img.shields.io/nuget/dt/LinqGen.Generator?label=LinqGen.Generator)](https://www.nuget.org/packages/LinqGen.Generator/)[![Nuget](https://img.shields.io/nuget/dt/LinqGen?label=LinqGen)](https://www.nuget.org/packages/LinqGen/) ![GitHub Repo stars](https://img.shields.io/github/stars/cathei/LinqGen?style=social) 2024-03-04 + 9 [Larcanum.GitInfo](/docs/Larcanum.GitInfo) [![Nuget](https://img.shields.io/nuget/dt/Larcanum.GitInfo?label=Larcanum.GitInfo)](https://www.nuget.org/packages/Larcanum.GitInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/lord-executor/Larcanum.GitInfo?style=social) 2025-01-17 - 10 [Pekspro.BuildInformationGenerator](/docs/Pekspro.BuildInformationGenerator) [![Nuget](https://img.shields.io/nuget/dt/Pekspro.BuildInformationGenerator?label=Pekspro.BuildInformationGenerator)](https://www.nuget.org/packages/Pekspro.BuildInformationGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/pekspro/BuildInformationGenerator?style=social) 2024-07-19 + 10 [LinqGen.Generator](/docs/LinqGen.Generator) [![Nuget](https://img.shields.io/nuget/dt/LinqGen.Generator?label=LinqGen.Generator)](https://www.nuget.org/packages/LinqGen.Generator/)[![Nuget](https://img.shields.io/nuget/dt/LinqGen?label=LinqGen)](https://www.nuget.org/packages/LinqGen/) ![GitHub Repo stars](https://img.shields.io/github/stars/cathei/LinqGen?style=social) 2024-03-04 - 11 [PlantUmlClassDiagramGenerator](/docs/PlantUmlClassDiagramGenerator) [![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.SourceGenerator?label=PlantUmlClassDiagramGenerator.SourceGenerator)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.SourceGenerator/)[![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.Attributes?label=PlantUmlClassDiagramGenerator.Attributes)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.Attributes/) ![GitHub Repo stars](https://img.shields.io/github/stars/pierre3/PlantUmlClassDiagramGenerator?style=social) 2024-02-20 + 11 [Pekspro.BuildInformationGenerator](/docs/Pekspro.BuildInformationGenerator) [![Nuget](https://img.shields.io/nuget/dt/Pekspro.BuildInformationGenerator?label=Pekspro.BuildInformationGenerator)](https://www.nuget.org/packages/Pekspro.BuildInformationGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/pekspro/BuildInformationGenerator?style=social) 2024-07-19 - 12 [RSCG_AMS](/docs/RSCG_AMS) [![Nuget](https://img.shields.io/nuget/dt/RSCG_AMS?label=RSCG_AMS)](https://www.nuget.org/packages/RSCG_AMS/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_AMS?style=social) 2023-04-16 + 12 [PlantUmlClassDiagramGenerator](/docs/PlantUmlClassDiagramGenerator) [![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.SourceGenerator?label=PlantUmlClassDiagramGenerator.SourceGenerator)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.SourceGenerator/)[![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.Attributes?label=PlantUmlClassDiagramGenerator.Attributes)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.Attributes/) ![GitHub Repo stars](https://img.shields.io/github/stars/pierre3/PlantUmlClassDiagramGenerator?style=social) 2024-02-20 - 13 [RSCG_ExportDiagram](/docs/RSCG_ExportDiagram) [![Nuget](https://img.shields.io/nuget/dt/RSCG_ExportDiagram?label=RSCG_ExportDiagram)](https://github.com/ignatandrei/RSCG_ExportDiagram) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_ExportDiagram?style=social) 2024-08-01 + 13 [RSCG_AMS](/docs/RSCG_AMS) [![Nuget](https://img.shields.io/nuget/dt/RSCG_AMS?label=RSCG_AMS)](https://www.nuget.org/packages/RSCG_AMS/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_AMS?style=social) 2023-04-16 - 14 [RSCG_FunctionsWithDI](/docs/RSCG_FunctionsWithDI) [![Nuget](https://img.shields.io/nuget/dt/RSCG_FunctionsWithDI?label=RSCG_FunctionsWithDI)](https://www.nuget.org/packages/RSCG_FunctionsWithDI/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/functionsdi?style=social) 2023-04-16 + 14 [RSCG_ExportDiagram](/docs/RSCG_ExportDiagram) [![Nuget](https://img.shields.io/nuget/dt/RSCG_ExportDiagram?label=RSCG_ExportDiagram)](https://github.com/ignatandrei/RSCG_ExportDiagram) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_ExportDiagram?style=social) 2024-08-01 - 15 [RSCG_NameGenerator](/docs/RSCG_NameGenerator) [![Nuget](https://img.shields.io/nuget/dt/RSCG_NameGenerator?label=RSCG_NameGenerator)](https://www.nuget.org/packages/RSCG_NameGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/NameGenerator?style=social) 2024-08-25 + 15 [RSCG_FunctionsWithDI](/docs/RSCG_FunctionsWithDI) [![Nuget](https://img.shields.io/nuget/dt/RSCG_FunctionsWithDI?label=RSCG_FunctionsWithDI)](https://www.nuget.org/packages/RSCG_FunctionsWithDI/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/functionsdi?style=social) 2023-04-16 - 16 [RSCG_TimeBombComment](/docs/RSCG_TimeBombComment) [![Nuget](https://img.shields.io/nuget/dt/RSCG_TimeBombComment?label=RSCG_TimeBombComment)](https://www.nuget.org/packages/RSCG_TimeBombComment/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_TimeBombComment?style=social) 2023-04-16 + 16 [RSCG_NameGenerator](/docs/RSCG_NameGenerator) [![Nuget](https://img.shields.io/nuget/dt/RSCG_NameGenerator?label=RSCG_NameGenerator)](https://www.nuget.org/packages/RSCG_NameGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/NameGenerator?style=social) 2024-08-25 - 17 [RSCG_Wait](/docs/RSCG_Wait) [![Nuget](https://img.shields.io/nuget/dt/RSCG_WaitAndOptions?label=RSCG_WaitAndOptions)](https://www.nuget.org/packages/RSCG_WaitAndOptions/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_WaitAndOptions?style=social) 2024-02-21 + 17 [RSCG_TimeBombComment](/docs/RSCG_TimeBombComment) [![Nuget](https://img.shields.io/nuget/dt/RSCG_TimeBombComment?label=RSCG_TimeBombComment)](https://www.nuget.org/packages/RSCG_TimeBombComment/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_TimeBombComment?style=social) 2023-04-16 - 18 [ShadowWriterProjectInfo](/docs/ShadowWriterProjectInfo) [![Nuget](https://img.shields.io/nuget/dt/ShadowWriter?label=ShadowWriter)](https://www.nuget.org/packages/ShadowWriter/) ![GitHub Repo stars](https://img.shields.io/github/stars/StefanStolz/ShadowWriter?style=social) 2025-07-27 + 18 [RSCG_Wait](/docs/RSCG_Wait) [![Nuget](https://img.shields.io/nuget/dt/RSCG_WaitAndOptions?label=RSCG_WaitAndOptions)](https://www.nuget.org/packages/RSCG_WaitAndOptions/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_WaitAndOptions?style=social) 2024-02-21 - 19 [ThisAssembly](/docs/ThisAssembly) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly?label=ThisAssembly)](https://www.nuget.org/packages/ThisAssembly) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2023-04-16 + 19 [ShadowWriterProjectInfo](/docs/ShadowWriterProjectInfo) [![Nuget](https://img.shields.io/nuget/dt/ShadowWriter?label=ShadowWriter)](https://www.nuget.org/packages/ShadowWriter/) ![GitHub Repo stars](https://img.shields.io/github/stars/StefanStolz/ShadowWriter?style=social) 2025-07-27 - 20 [ThisAssembly.Constants](/docs/ThisAssembly.Constants) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Constants?label=ThisAssembly.Constants)](https://www.nuget.org/packages/ThisAssembly.Constants/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-18 + 20 [ThisAssembly](/docs/ThisAssembly) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly?label=ThisAssembly)](https://www.nuget.org/packages/ThisAssembly) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2023-04-16 - 21 [ThisAssembly.Metadata](/docs/ThisAssembly.Metadata) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Metadata?label=ThisAssembly.Metadata)](https://www.nuget.org/packages/ThisAssembly.Metadata/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-20 + 21 [ThisAssembly.Constants](/docs/ThisAssembly.Constants) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Constants?label=ThisAssembly.Constants)](https://www.nuget.org/packages/ThisAssembly.Constants/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-18 + + 22 [ThisAssembly.Metadata](/docs/ThisAssembly.Metadata) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Metadata?label=ThisAssembly.Metadata)](https://www.nuget.org/packages/ThisAssembly.Metadata/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-20 \ No newline at end of file diff --git a/v2/rscg_examples_site/docs/Categories/_PrimitiveEnhancementProject.mdx b/v2/rscg_examples_site/docs/Categories/_PrimitiveEnhancementProject.mdx index 2f0102445..8622833f9 100644 --- a/v2/rscg_examples_site/docs/Categories/_PrimitiveEnhancementProject.mdx +++ b/v2/rscg_examples_site/docs/Categories/_PrimitiveEnhancementProject.mdx @@ -10,37 +10,39 @@ 5 [AutoSpectre](/docs/AutoSpectre) [![Nuget](https://img.shields.io/nuget/dt/AutoSpectre.SourceGeneration?label=AutoSpectre.SourceGeneration)](https://www.nuget.org/packages/AutoSpectre.SourceGeneration)[![Nuget](https://img.shields.io/nuget/dt/AutoSpectre?label=AutoSpectre)](https://www.nuget.org/packages/AutoSpectre) ![GitHub Repo stars](https://img.shields.io/github/stars/jeppevammenkristensen/auto-spectre?style=social) 2024-02-24 - 6 [BuildInfo](/docs/BuildInfo) [![Nuget](https://img.shields.io/nuget/dt/BuildInfo?label=BuildInfo)](https://www.nuget.org/packages/BuildInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/linkdotnet/BuildInformation?style=social) 2024-01-20 + 6 [Bennewitz.Ninja.AutoVersioning](/docs/Bennewitz.Ninja.AutoVersioning) [![Nuget](https://img.shields.io/nuget/dt/Bennewitz.Ninja.AutoVersioning?label=Bennewitz.Ninja.AutoVersioning)](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/) ![GitHub Repo stars](https://img.shields.io/github/stars/JanusMael/Bennewitz.Ninja.AutoVersioning?style=social) 2026-07-04 - 7 [Credfeto.Version.Information.Generator](/docs/Credfeto.Version.Information.Generator) [![Nuget](https://img.shields.io/nuget/dt/Credfeto.Version.Information.Generator?label=Credfeto.Version.Information.Generator)](https://www.nuget.org/packages/Credfeto.Version.Information.Generator/) ![GitHub Repo stars](https://img.shields.io/github/stars/credfeto/credfeto-version-constants-generator?style=social) 2024-11-05 + 7 [BuildInfo](/docs/BuildInfo) [![Nuget](https://img.shields.io/nuget/dt/BuildInfo?label=BuildInfo)](https://www.nuget.org/packages/BuildInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/linkdotnet/BuildInformation?style=social) 2024-01-20 - 8 [Larcanum.GitInfo](/docs/Larcanum.GitInfo) [![Nuget](https://img.shields.io/nuget/dt/Larcanum.GitInfo?label=Larcanum.GitInfo)](https://www.nuget.org/packages/Larcanum.GitInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/lord-executor/Larcanum.GitInfo?style=social) 2025-01-17 + 8 [Credfeto.Version.Information.Generator](/docs/Credfeto.Version.Information.Generator) [![Nuget](https://img.shields.io/nuget/dt/Credfeto.Version.Information.Generator?label=Credfeto.Version.Information.Generator)](https://www.nuget.org/packages/Credfeto.Version.Information.Generator/) ![GitHub Repo stars](https://img.shields.io/github/stars/credfeto/credfeto-version-constants-generator?style=social) 2024-11-05 - 9 [LinqGen.Generator](/docs/LinqGen.Generator) [![Nuget](https://img.shields.io/nuget/dt/LinqGen.Generator?label=LinqGen.Generator)](https://www.nuget.org/packages/LinqGen.Generator/)[![Nuget](https://img.shields.io/nuget/dt/LinqGen?label=LinqGen)](https://www.nuget.org/packages/LinqGen/) ![GitHub Repo stars](https://img.shields.io/github/stars/cathei/LinqGen?style=social) 2024-03-04 + 9 [Larcanum.GitInfo](/docs/Larcanum.GitInfo) [![Nuget](https://img.shields.io/nuget/dt/Larcanum.GitInfo?label=Larcanum.GitInfo)](https://www.nuget.org/packages/Larcanum.GitInfo/) ![GitHub Repo stars](https://img.shields.io/github/stars/lord-executor/Larcanum.GitInfo?style=social) 2025-01-17 - 10 [Pekspro.BuildInformationGenerator](/docs/Pekspro.BuildInformationGenerator) [![Nuget](https://img.shields.io/nuget/dt/Pekspro.BuildInformationGenerator?label=Pekspro.BuildInformationGenerator)](https://www.nuget.org/packages/Pekspro.BuildInformationGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/pekspro/BuildInformationGenerator?style=social) 2024-07-19 + 10 [LinqGen.Generator](/docs/LinqGen.Generator) [![Nuget](https://img.shields.io/nuget/dt/LinqGen.Generator?label=LinqGen.Generator)](https://www.nuget.org/packages/LinqGen.Generator/)[![Nuget](https://img.shields.io/nuget/dt/LinqGen?label=LinqGen)](https://www.nuget.org/packages/LinqGen/) ![GitHub Repo stars](https://img.shields.io/github/stars/cathei/LinqGen?style=social) 2024-03-04 - 11 [PlantUmlClassDiagramGenerator](/docs/PlantUmlClassDiagramGenerator) [![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.SourceGenerator?label=PlantUmlClassDiagramGenerator.SourceGenerator)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.SourceGenerator/)[![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.Attributes?label=PlantUmlClassDiagramGenerator.Attributes)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.Attributes/) ![GitHub Repo stars](https://img.shields.io/github/stars/pierre3/PlantUmlClassDiagramGenerator?style=social) 2024-02-20 + 11 [Pekspro.BuildInformationGenerator](/docs/Pekspro.BuildInformationGenerator) [![Nuget](https://img.shields.io/nuget/dt/Pekspro.BuildInformationGenerator?label=Pekspro.BuildInformationGenerator)](https://www.nuget.org/packages/Pekspro.BuildInformationGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/pekspro/BuildInformationGenerator?style=social) 2024-07-19 - 12 [RSCG_AMS](/docs/RSCG_AMS) [![Nuget](https://img.shields.io/nuget/dt/RSCG_AMS?label=RSCG_AMS)](https://www.nuget.org/packages/RSCG_AMS/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_AMS?style=social) 2023-04-16 + 12 [PlantUmlClassDiagramGenerator](/docs/PlantUmlClassDiagramGenerator) [![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.SourceGenerator?label=PlantUmlClassDiagramGenerator.SourceGenerator)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.SourceGenerator/)[![Nuget](https://img.shields.io/nuget/dt/PlantUmlClassDiagramGenerator.Attributes?label=PlantUmlClassDiagramGenerator.Attributes)](https://www.nuget.org/packages/PlantUmlClassDiagramGenerator.Attributes/) ![GitHub Repo stars](https://img.shields.io/github/stars/pierre3/PlantUmlClassDiagramGenerator?style=social) 2024-02-20 - 13 [RSCG_ExportDiagram](/docs/RSCG_ExportDiagram) [![Nuget](https://img.shields.io/nuget/dt/RSCG_ExportDiagram?label=RSCG_ExportDiagram)](https://github.com/ignatandrei/RSCG_ExportDiagram) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_ExportDiagram?style=social) 2024-08-01 + 13 [RSCG_AMS](/docs/RSCG_AMS) [![Nuget](https://img.shields.io/nuget/dt/RSCG_AMS?label=RSCG_AMS)](https://www.nuget.org/packages/RSCG_AMS/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_AMS?style=social) 2023-04-16 - 14 [RSCG_FunctionsWithDI](/docs/RSCG_FunctionsWithDI) [![Nuget](https://img.shields.io/nuget/dt/RSCG_FunctionsWithDI?label=RSCG_FunctionsWithDI)](https://www.nuget.org/packages/RSCG_FunctionsWithDI/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/functionsdi?style=social) 2023-04-16 + 14 [RSCG_ExportDiagram](/docs/RSCG_ExportDiagram) [![Nuget](https://img.shields.io/nuget/dt/RSCG_ExportDiagram?label=RSCG_ExportDiagram)](https://github.com/ignatandrei/RSCG_ExportDiagram) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_ExportDiagram?style=social) 2024-08-01 - 15 [RSCG_NameGenerator](/docs/RSCG_NameGenerator) [![Nuget](https://img.shields.io/nuget/dt/RSCG_NameGenerator?label=RSCG_NameGenerator)](https://www.nuget.org/packages/RSCG_NameGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/NameGenerator?style=social) 2024-08-25 + 15 [RSCG_FunctionsWithDI](/docs/RSCG_FunctionsWithDI) [![Nuget](https://img.shields.io/nuget/dt/RSCG_FunctionsWithDI?label=RSCG_FunctionsWithDI)](https://www.nuget.org/packages/RSCG_FunctionsWithDI/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/functionsdi?style=social) 2023-04-16 - 16 [RSCG_TimeBombComment](/docs/RSCG_TimeBombComment) [![Nuget](https://img.shields.io/nuget/dt/RSCG_TimeBombComment?label=RSCG_TimeBombComment)](https://www.nuget.org/packages/RSCG_TimeBombComment/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_TimeBombComment?style=social) 2023-04-16 + 16 [RSCG_NameGenerator](/docs/RSCG_NameGenerator) [![Nuget](https://img.shields.io/nuget/dt/RSCG_NameGenerator?label=RSCG_NameGenerator)](https://www.nuget.org/packages/RSCG_NameGenerator/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/NameGenerator?style=social) 2024-08-25 - 17 [RSCG_Wait](/docs/RSCG_Wait) [![Nuget](https://img.shields.io/nuget/dt/RSCG_WaitAndOptions?label=RSCG_WaitAndOptions)](https://www.nuget.org/packages/RSCG_WaitAndOptions/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_WaitAndOptions?style=social) 2024-02-21 + 17 [RSCG_TimeBombComment](/docs/RSCG_TimeBombComment) [![Nuget](https://img.shields.io/nuget/dt/RSCG_TimeBombComment?label=RSCG_TimeBombComment)](https://www.nuget.org/packages/RSCG_TimeBombComment/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_TimeBombComment?style=social) 2023-04-16 - 18 [ShadowWriterProjectInfo](/docs/ShadowWriterProjectInfo) [![Nuget](https://img.shields.io/nuget/dt/ShadowWriter?label=ShadowWriter)](https://www.nuget.org/packages/ShadowWriter/) ![GitHub Repo stars](https://img.shields.io/github/stars/StefanStolz/ShadowWriter?style=social) 2025-07-27 + 18 [RSCG_Wait](/docs/RSCG_Wait) [![Nuget](https://img.shields.io/nuget/dt/RSCG_WaitAndOptions?label=RSCG_WaitAndOptions)](https://www.nuget.org/packages/RSCG_WaitAndOptions/) ![GitHub Repo stars](https://img.shields.io/github/stars/ignatandrei/RSCG_WaitAndOptions?style=social) 2024-02-21 - 19 [ThisAssembly](/docs/ThisAssembly) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly?label=ThisAssembly)](https://www.nuget.org/packages/ThisAssembly) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2023-04-16 + 19 [ShadowWriterProjectInfo](/docs/ShadowWriterProjectInfo) [![Nuget](https://img.shields.io/nuget/dt/ShadowWriter?label=ShadowWriter)](https://www.nuget.org/packages/ShadowWriter/) ![GitHub Repo stars](https://img.shields.io/github/stars/StefanStolz/ShadowWriter?style=social) 2025-07-27 - 20 [ThisAssembly.Constants](/docs/ThisAssembly.Constants) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Constants?label=ThisAssembly.Constants)](https://www.nuget.org/packages/ThisAssembly.Constants/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-18 + 20 [ThisAssembly](/docs/ThisAssembly) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly?label=ThisAssembly)](https://www.nuget.org/packages/ThisAssembly) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2023-04-16 - 21 [ThisAssembly.Metadata](/docs/ThisAssembly.Metadata) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Metadata?label=ThisAssembly.Metadata)](https://www.nuget.org/packages/ThisAssembly.Metadata/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-20 + 21 [ThisAssembly.Constants](/docs/ThisAssembly.Constants) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Constants?label=ThisAssembly.Constants)](https://www.nuget.org/packages/ThisAssembly.Constants/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-18 + + 22 [ThisAssembly.Metadata](/docs/ThisAssembly.Metadata) [![Nuget](https://img.shields.io/nuget/dt/ThisAssembly.Metadata?label=ThisAssembly.Metadata)](https://www.nuget.org/packages/ThisAssembly.Metadata/) ![GitHub Repo stars](https://img.shields.io/github/stars/devlooped/ThisAssembly?style=social) 2024-07-20 ### See category diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md b/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md new file mode 100644 index 000000000..9713c3f59 --- /dev/null +++ b/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md @@ -0,0 +1,380 @@ +--- +sidebar_position: 2770 +title: 277 - Bennewitz.Ninja.AutoVersioning +description: Generating build version numbers for .NET projects +slug: /Bennewitz.Ninja.AutoVersioning +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import TOCInline from '@theme/TOCInline'; +import SameCategory from '../Categories/_PrimitiveEnhancementProject.mdx'; + +# Bennewitz.Ninja.AutoVersioning by Brian Bennewitz + + + + +## NuGet / site data +[![Nuget](https://img.shields.io/nuget/dt/Bennewitz.Ninja.AutoVersioning?label=Bennewitz.Ninja.AutoVersioning)](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/) +[![GitHub last commit](https://img.shields.io/github/last-commit/JanusMael/Bennewitz.Ninja.AutoVersioning?label=updated)](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning) +![GitHub Repo stars](https://img.shields.io/github/stars/JanusMael/Bennewitz.Ninja.AutoVersioning?style=social) + +## Details + +### Info +:::info + +Name: **Bennewitz.Ninja.AutoVersioning** + +Assembly info incremental source generator. + +Author: Brian Bennewitz + +NuGet: +*https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/* + + +You can find more details at https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning + +Source: https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning + +::: + +### Author +:::note +Brian Bennewitz +![Alt text](https://github.com/JanusMael.png) +::: + +## Original Readme +:::note + +# Bennewitz.Ninja.AutoVersioning + +A [Roslyn incremental source generator](https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview) that injects assembly metadata attributes and build-time constants into .NET projects at compile time — no `AssemblyInfo.cs`, no disk writes, full IDE caching. + +[![NuGet](https://img.shields.io/nuget/v/Bennewitz.Ninja.AutoVersioning.svg)](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning) +[![CI](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/actions/workflows/ci.yml/badge.svg)](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/actions/workflows/ci.yml) + +## Requirements + +.NET SDK 6.0 or later (requires Roslyn 4.0+ for `IIncrementalGenerator` support). The consuming project may target any framework — `.NET Framework 4.x`, `.NET Standard`, `.NET 6+`, etc. + +## Quick Start + +**1. Add the package:** + +```xml + +``` + +**2. Enable the generator** in your root `Directory.Build.props` (or any `.props` / `.csproj` imported by your build): + +```xml + + true + YourCompany + YourProduct + + + $(GITHUB_SHA) + $(GITHUB_ACTIONS) + $(MY_VERSION_VAR) + +``` + +> **Note:** The package's auto-imported `Build.props` automatically suppresses the 8 SDK-generated attributes that conflict with this generator (e.g. `AssemblyVersion`, `AssemblyCopyright`). It uses granular per-attribute suppressions rather than `false`, which means `InternalsVisibleTo` and all other SDK-generated attributes continue to work normally. Do **not** add `false` yourself — it will break `InternalsVisibleTo`. + +A ready-to-use template is available at [`Directory.Build.props.template`](Directory.Build.props.template). + +**3. Build.** The generator runs automatically — no further setup needed. + +> **Tip:** View the generated files in your IDE under `Dependencies → Analyzers → *SourceGenerators`. + +--- + +## Generated Output + +Given a build on 2026-04-29 at 14:35 UTC for company `Acme Corp`, product `Acme App`, commit `abc1234def`, and public version `3.1.0`: + +### `AutoVersionedAssemblyInfo.g.cs` + +```csharp +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyDescription("Assembly Version: 2026.2.429.1435")] +[assembly: AssemblyConfiguration("Release")] +[assembly: AssemblyCompany("Acme Corp")] +[assembly: AssemblyProduct("Acme App v2026.2.429.1435")] +[assembly: AssemblyCopyright("Copyright 2026 [Release]")] +[assembly: AssemblyVersion("2026.2.429.1435")] +[assembly: AssemblyFileVersion("2026.2.429.1435")] +[assembly: AssemblyInformationalVersion("Commit♥: abc1234def")] +[assembly: AssemblyMetadata("CommitSha", "abc1234def")] +[assembly: AssemblyMetadata("GITHUB_SHA", "abc1234def")] +[assembly: AssemblyMetadata("PublicVersion", "3.1.0")] +``` + +### `DirectoryBuildInfo.g.cs` + +```csharp +// +namespace Bennewitz.Ninja.AutoVersioning +{ + /// Build-time constants generated by the source generator. + public static class DirectoryBuildInfo + { + public const string BuildRelease = "Version 2026.2.429.1435 [built 4/29/2026 2:35:00 PM (UTC)]"; + } +} +``` + +Use `DirectoryBuildInfo.BuildRelease` wherever you need the build version at runtime — error trackers, log enrichment, health endpoints — without reading environment variables. + +--- + +## Configuration Reference + +| MSBuild Property | Description | Required | +|---|---|---| +| `GenerateAutoVersionedAssemblyInfo` | Set to `true` to enable the generator | **Yes** | +| `AssemblyCompany` | Value for `[assembly: AssemblyCompany(...)]` | **Yes** | +| `AssemblyProduct` | Value for `[assembly: AssemblyProduct(...)]` | **Yes** | +| `CopyrightHolder` | Name shown in the copyright attribute — defaults to `AssemblyCompany` if omitted | No | +| `CommitSha` | Git commit SHA | No | +| `IsContinuousIntegration` | `true` on CI runs | No | +| `PublicVersion` | Your app's public-facing version string | No | +| `Configuration` | `Debug` / `Release` — set automatically by MSBuild | Auto | +| `BuildTimestamp` | Build start time in `yyyyMMddHHmmss` format — captured automatically at MSBuild evaluation time (before any project compiles), ensuring a consistent version across all projects in a multi-project solution build. Override on CI for an exact guarantee: `dotnet build -p:BuildTimestamp=$(date +%Y%m%d%H%M%S)` | Auto | + +### CI Provider Mappings + +| Provider | Commit SHA | CI flag | +|---|---|---| +| GitHub Actions | `$(GITHUB_SHA)` | `$(GITHUB_ACTIONS)` | +| GitLab CI | `$(CI_COMMIT_SHA)` | `$(GITLAB_CI)` | +| Bitbucket Pipelines | `$(BITBUCKET_COMMIT)` | `$(CI)` | + +### Version Format + +The generator uses **CalVer**: `YEAR.QUARTER.MMDD.HHmm` + +| Part | Example | Meaning | +|---|---|---| +| Major | `2026` | Calendar year | +| Minor | `2` | Quarter (1–4) | +| Build | `429` | Month + day (`MMdd` as integer) | +| Revision | `1435` | Hour + minute (`HHmm` as integer) | + +--- + +## How It Works + +This is a modern C# `IIncrementalGenerator`. Compared to legacy `ISourceGenerator` approaches it: + +- Runs **entirely in-memory** — zero files written to disk +- Uses the **Roslyn caching pipeline** — the IDE (Rider, Visual Studio) only re-runs the generator when its inputs change, eliminating background compilation loops +- Reads MSBuild properties **via `AnalyzerConfigOptionsProvider`** — safe, no direct environment variable reads + +The package auto-imports `Build.props` via NuGet, which declares `CompilerVisibleProperty` items and suppresses the SDK's default `AssemblyInfo` generation (preventing CS0579 duplicate attribute errors when the generator is enabled). + +### Timestamp Consistency in Multi-Project Builds + +`BuildTimestamp` keeps the version consistent across every project in a solution build. See [`docs/MultiProjectBuildTimestamps.md`](docs/MultiProjectBuildTimestamps.md) for how it works and what alternative approaches were considered. + +> **TL;DR:** For CI, or any local build where an exact guarantee matters more than convenience, use `-p:BuildTimestamp=...` to fix the value explicitly instead of relying on evaluation-time capture. Ready-to-use wrappers are available at [`Build.ps1.template`](Build.ps1.template) (Windows/PowerShell 7+) and [`Build.sh.template`](Build.sh.template) (Linux/macOS/bash). + +### Diagnostics + +| ID | Severity | Description | +|---|---|---| +| `BAUTOVERSIONING00` | Warning | Generator is installed but `GenerateAutoVersionedAssemblyInfo` is not set to `true` (single-line signal) | +| `BAUTOVERSIONING01` | Warning | Generator threw an unexpected exception | +| `BAUTOVERSIONING02` | Error | `AssemblyCompany` is not configured | +| `BAUTOVERSIONING03` | Error | `AssemblyProduct` is not configured | +| `BAUTOVERSIONING04` | Warning | Multi-line setup snippet emitted alongside BAUTOVERSIONING00 — shows the required `Directory.Build.props` configuration | + +--- + +## Building Locally + +Requires PowerShell 7+ and the .NET SDK. + +```powershell +./Pack.ps1 +``` + +The script prompts for a version (defaults to CalVer `YYYY.Q.MMDD`) and produces `.nupkg` files in `packages/Debug/` and `packages/Release/`. + +--- + +## License + +MIT © 2026 Brian Bennewitz + + +::: + +### About +:::note + +Generating build version numbers for .NET projects + + +::: + +## How to use + +### Example (source csproj, source files) + + + + + +This is the CSharp Project that references **Bennewitz.Ninja.AutoVersioning** +```xml showLineNumbers {11} + + + + Exe + net10.0 + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + true + + false + false + false + false + false + false + false + false + + + AOM Company + Andrei Ignat Product + + + $(GITHUB_SHA) + $(GITHUB_ACTIONS) + $(MY_VERSION_VAR) + + + true + $(BaseIntermediateOutputPath)\GX + + + + +``` + + + + + + This is the use of **Bennewitz.Ninja.AutoVersioning** in *Program.cs* + +```csharp showLineNumbers +using Bennewitz.Ninja.AutoVersioning; + +Console.WriteLine("Hello, World!"); +Console.WriteLine(DirectoryBuildInfo.BuildRelease); +``` + + + + +### Generated Files + +Those are taken from $(BaseIntermediateOutputPath)\GX + + + + +```csharp showLineNumbers +//------------------------------------------------------------------------------ +// +// This code was automatically generated by Andrei Ignat Product version 2026.3.716.1852; +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +using System.CodeDom.Compiler; +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyDescription("Assembly Version: 2026.3.716.1852")] +[assembly: AssemblyConfiguration("Debug")] +[assembly: AssemblyCompany("AOM Company")] +[assembly: AssemblyProduct("Andrei Ignat Product v2026.3.716.1852")] +[assembly: AssemblyCopyright("Copyright 2026 [Debug]")] +[assembly: AssemblyVersion("2026.3.716.1852")] +[assembly: AssemblyFileVersion("2026.3.716.1852")] +[assembly: AssemblyInformationalVersion("Built with ♥")] +``` + + + + +```csharp showLineNumbers + +// +namespace Bennewitz.Ninja.AutoVersioning +{ + /// + /// Build-time constants generated by the source generator. + /// + public static class DirectoryBuildInfo + { + /// The build version string calculated at compile time. + public const string BuildRelease = "Version 2026.3.716.1852 [built 7/16/2026 6:52:32 PM (GST)]"; + } +} +``` + + + + +## Useful + +### Download Example (.NET C#) + +:::tip + +[Download Example project Bennewitz.Ninja.AutoVersioning ](/sources/Bennewitz.Ninja.AutoVersioning.zip) + +::: + + +### Share Bennewitz.Ninja.AutoVersioning + + + +https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning + + + diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/index.md b/v2/rscg_examples_site/docs/RSCG-Examples/index.md index 58c3dde48..797c717cc 100644 --- a/v2/rscg_examples_site/docs/RSCG-Examples/index.md +++ b/v2/rscg_examples_site/docs/RSCG-Examples/index.md @@ -1,7 +1,7 @@ --- sidebar_position: 30 -title: 276 RSCG list by category -description: 276 RSCG list by category +title: 277 RSCG list by category +description: 277 RSCG list by category slug: /rscg-examples --- @@ -725,7 +725,7 @@ import DocCardList from '@theme/DocCardList'; ## EnhancementProject
- Expand EnhancementProject =>examples:21 + Expand EnhancementProject =>examples:22 @@ -831,6 +831,11 @@ import DocCardList from '@theme/DocCardList'; [AssemblyMetadata.Generators](/docs/AssemblyMetadata.Generators) + + + +[Bennewitz.Ninja.AutoVersioning](/docs/Bennewitz.Ninja.AutoVersioning) +
@@ -1992,6 +1997,8 @@ flowchart LR; EnhancementProject--> AssemblyMetadata.Generators((AssemblyMetadata.Generators)) + EnhancementProject--> Bennewitz.Ninja.AutoVersioning((Bennewitz.Ninja.AutoVersioning)) + Enum--> NetEscapades.EnumGenerators((NetEscapades.EnumGenerators)) Enum--> EnumClass((EnumClass)) diff --git a/v2/rscg_examples_site/docs/about.md b/v2/rscg_examples_site/docs/about.md index 098ca6746..cb2cbce29 100644 --- a/v2/rscg_examples_site/docs/about.md +++ b/v2/rscg_examples_site/docs/about.md @@ -6,7 +6,7 @@ title: About ## Content You will find here code examples -of 276 Roslyn Source Code Generator (RSCG) +of 277 Roslyn Source Code Generator (RSCG) that can be useful for you. That means, you will write more elegant and concise code - even if the generators code is not always nice to look. ## Are those examples ready for production? diff --git a/v2/rscg_examples_site/docs/indexRSCG.md b/v2/rscg_examples_site/docs/indexRSCG.md index d1bb99bd2..2010727bb 100644 --- a/v2/rscg_examples_site/docs/indexRSCG.md +++ b/v2/rscg_examples_site/docs/indexRSCG.md @@ -7,9 +7,9 @@ slug: /List-of-RSCG import useBaseUrl from '@docusaurus/useBaseUrl'; -## 276 RSCG with examples in descending chronological order +## 277 RSCG with examples in descending chronological order -This is the list of 276 ( 16 from Microsoft) RSCG with examples +This is the list of 277 ( 16 from Microsoft) RSCG with examples [See by category](/docs/rscg-examples) [See as json](/exports/RSCG.json) [See as Excel](/exports/RSCG.xlsx) @@ -20,6 +20,7 @@ This is the list of 276 ( 16 from Microsoft) RSCG with examples | No | Name | Date | Category | | --------- | ----- | ---- | -------- | +|277| [Bennewitz.Ninja.AutoVersioning by Brian Bennewitz ](/docs/Bennewitz.Ninja.AutoVersioning)|2026-07-04 => 04 July 2026 | [EnhancementProject](/docs/Categories/EnhancementProject) | |276| [TinyBDD.MSTest by Jerrett Davis ](/docs/TinyBDD.MSTest)|2026-07-03 => 03 July 2026 | [Tests](/docs/Categories/Tests) | |275| [Porticle.Enumly by Carsten Jendro ](/docs/Porticle.Enumly)|2026-07-02 => 02 July 2026 | [Enum](/docs/Categories/Enum) | |274| [Dirge by Kazuki Kohzuki ](/docs/Dirge)|2026-07-01 => 01 July 2026 | [Disposer](/docs/Categories/Disposer) | diff --git a/v2/rscg_examples_site/src/components/HomepageFeatures/index.js b/v2/rscg_examples_site/src/components/HomepageFeatures/index.js index 0cd686d1b..aa7c60932 100644 --- a/v2/rscg_examples_site/src/components/HomepageFeatures/index.js +++ b/v2/rscg_examples_site/src/components/HomepageFeatures/index.js @@ -4,7 +4,7 @@ import styles from './styles.module.css'; const FeatureList = [ { -title: '276 Examples (16 from MSFT)', +title: '277 Examples (16 from MSFT)', Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, description: ( <> diff --git a/v2/rscg_examples_site/static/exports/RSCG.json b/v2/rscg_examples_site/static/exports/RSCG.json index e60d5dac8..e5eb212ef 100644 --- a/v2/rscg_examples_site/static/exports/RSCG.json +++ b/v2/rscg_examples_site/static/exports/RSCG.json @@ -2209,6 +2209,14 @@ "Source": "https://github.com/JerrettDavis/TinyBDD", "Category": "Tests", "AddedOn": "2026-07-03T00:00:00" + }, + { + "Name": "Bennewitz.Ninja.AutoVersioning", + "Link": "https://ignatandrei.github.io/RSCG_Examples/v2/docs/Bennewitz.Ninja.AutoVersioning", + "NuGet": "https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning/", + "Source": "https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning", + "Category": "EnhancementProject", + "AddedOn": "2026-07-04T00:00:00" } ] } \ No newline at end of file diff --git a/v2/rscg_examples_site/static/exports/RSCG.xlsx b/v2/rscg_examples_site/static/exports/RSCG.xlsx index 292fd9cefab90ae4f63662d59861543d1f0ded39..b31bd835371bc4a8039049ddda9c930e2368913f 100644 GIT binary patch delta 12911 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 J3;wt9{{z}b0FwX! delta 12842 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

?- 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 LKwRPfkM92frf|?1 From 88cd0b5d95c1f23063e176675f1b1cbe68865d3b Mon Sep 17 00:00:00 2001 From: Andrei Ignat Date: Thu, 16 Jul 2026 18:57:09 +0300 Subject: [PATCH 2/4] Update Bennewitz.Ninja.AutoVersioning.md --- .../Bennewitz.Ninja.AutoVersioning.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md b/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md index 9713c3f59..6282ef099 100644 --- a/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md +++ b/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md @@ -49,18 +49,18 @@ Brian Bennewitz ## Original Readme :::note -# Bennewitz.Ninja.AutoVersioning +### Bennewitz.Ninja.AutoVersioning A [Roslyn incremental source generator](https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview) that injects assembly metadata attributes and build-time constants into .NET projects at compile time — no `AssemblyInfo.cs`, no disk writes, full IDE caching. [![NuGet](https://img.shields.io/nuget/v/Bennewitz.Ninja.AutoVersioning.svg)](https://www.nuget.org/packages/Bennewitz.Ninja.AutoVersioning) [![CI](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/actions/workflows/ci.yml/badge.svg)](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/actions/workflows/ci.yml) -## Requirements +###### Requirements .NET SDK 6.0 or later (requires Roslyn 4.0+ for `IIncrementalGenerator` support). The consuming project may target any framework — `.NET Framework 4.x`, `.NET Standard`, `.NET 6+`, etc. -## Quick Start +###### Quick Start **1. Add the package:** @@ -93,11 +93,11 @@ A ready-to-use template is available at [`Directory.Build.props.template`](Direc --- -## Generated Output +###### Generated Output Given a build on 2026-04-29 at 14:35 UTC for company `Acme Corp`, product `Acme App`, commit `abc1234def`, and public version `3.1.0`: -### `AutoVersionedAssemblyInfo.g.cs` +######### `AutoVersionedAssemblyInfo.g.cs` ```csharp using System.Reflection; @@ -116,7 +116,7 @@ using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("PublicVersion", "3.1.0")] ``` -### `DirectoryBuildInfo.g.cs` +######### `DirectoryBuildInfo.g.cs` ```csharp // @@ -134,7 +134,7 @@ Use `DirectoryBuildInfo.BuildRelease` wherever you need the build version at run --- -## Configuration Reference +###### Configuration Reference | MSBuild Property | Description | Required | |---|---|---| @@ -148,7 +148,7 @@ Use `DirectoryBuildInfo.BuildRelease` wherever you need the build version at run | `Configuration` | `Debug` / `Release` — set automatically by MSBuild | Auto | | `BuildTimestamp` | Build start time in `yyyyMMddHHmmss` format — captured automatically at MSBuild evaluation time (before any project compiles), ensuring a consistent version across all projects in a multi-project solution build. Override on CI for an exact guarantee: `dotnet build -p:BuildTimestamp=$(date +%Y%m%d%H%M%S)` | Auto | -### CI Provider Mappings +######### CI Provider Mappings | Provider | Commit SHA | CI flag | |---|---|---| @@ -156,7 +156,7 @@ Use `DirectoryBuildInfo.BuildRelease` wherever you need the build version at run | GitLab CI | `$(CI_COMMIT_SHA)` | `$(GITLAB_CI)` | | Bitbucket Pipelines | `$(BITBUCKET_COMMIT)` | `$(CI)` | -### Version Format +######### Version Format The generator uses **CalVer**: `YEAR.QUARTER.MMDD.HHmm` @@ -169,7 +169,7 @@ The generator uses **CalVer**: `YEAR.QUARTER.MMDD.HHmm` --- -## How It Works +###### How It Works This is a modern C# `IIncrementalGenerator`. Compared to legacy `ISourceGenerator` approaches it: @@ -179,13 +179,13 @@ This is a modern C# `IIncrementalGenerator`. Compared to legacy `ISourceGenerato The package auto-imports `Build.props` via NuGet, which declares `CompilerVisibleProperty` items and suppresses the SDK's default `AssemblyInfo` generation (preventing CS0579 duplicate attribute errors when the generator is enabled). -### Timestamp Consistency in Multi-Project Builds +######### Timestamp Consistency in Multi-Project Builds -`BuildTimestamp` keeps the version consistent across every project in a solution build. See [`docs/MultiProjectBuildTimestamps.md`](docs/MultiProjectBuildTimestamps.md) for how it works and what alternative approaches were considered. +`BuildTimestamp` keeps the version consistent across every project in a solution build. See [`docs/MultiProjectBuildTimestamps.md`](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/docs/MultiProjectBuildTimestamps.md) for how it works and what alternative approaches were considered. > **TL;DR:** For CI, or any local build where an exact guarantee matters more than convenience, use `-p:BuildTimestamp=...` to fix the value explicitly instead of relying on evaluation-time capture. Ready-to-use wrappers are available at [`Build.ps1.template`](Build.ps1.template) (Windows/PowerShell 7+) and [`Build.sh.template`](Build.sh.template) (Linux/macOS/bash). -### Diagnostics +######### Diagnostics | ID | Severity | Description | |---|---|---| @@ -197,7 +197,7 @@ The package auto-imports `Build.props` via NuGet, which declares `CompilerVisibl --- -## Building Locally +###### Building Locally Requires PowerShell 7+ and the .NET SDK. @@ -209,7 +209,7 @@ The script prompts for a version (defaults to CalVer `YYYY.Q.MMDD`) and produces --- -## License +###### License MIT © 2026 Brian Bennewitz From c950d2a1655d96e8120b5e5f77adb9771ea9921c Mon Sep 17 00:00:00 2001 From: Andrei Ignat Date: Thu, 16 Jul 2026 18:58:54 +0300 Subject: [PATCH 3/4] Create Bennewitz.Ninja.AutoVersioning.zip --- .../sources/Bennewitz.Ninja.AutoVersioning.zip | Bin 0 -> 1440 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 v2/rscg_examples_site/static/sources/Bennewitz.Ninja.AutoVersioning.zip diff --git a/v2/rscg_examples_site/static/sources/Bennewitz.Ninja.AutoVersioning.zip b/v2/rscg_examples_site/static/sources/Bennewitz.Ninja.AutoVersioning.zip new file mode 100644 index 0000000000000000000000000000000000000000..a5bd36e6d12b89a1c84ee263d1c7448dd04889f3 GIT binary patch literal 1440 zcmWIWW@Zs#U|`^2*faG*%;Wj8#^ykt8xZpVv1eXden3%{UU5!d#b(ZP=QVXto;kny z@zbDy4V)UM&U^Xl1#)=koZJxl>5TVjevMO?+Amd|Jj&`&smfZrAW6DbWiCSi+=A|D zA7b?GDO5~nW?ChFKv*|~JYNow16v?=^tto8x&fO0_Hk)`?961|)_GnDI#tjq2M{_r@ z^XE?5@zpd(Rzteuy>IScyWRABluwVnVRP)-i!Uaqb_$2^t(~}U0l&63 zkN-!ZWz*C@s&b_L5U%ZAVxV!RM}38UBj>ay_8tw#C6Bf|(S?2v-00xoVCtB ze)A>e{ENwx%j8+LmRDc4Kh|eESM8_6nUstvOLwh*%(W|CidRCjW>K0+On^*t*J_$D&Rkd@ z)6DM0s&i4u;HevXK#sY#DaL4(x|UA& z72Vd<*jsMg3AfPJ@@?Z6ef7|5JEvtHbNQ$BRc_s+ zUcc5GZqGuu+1_EyO*-~GOq5r4;Rd1DlYcl%msFIA_no$@@mGKg2}s_c5dF|p{{53@));Us>>PQ!uYHA z=d6D$UizYBLEQS*{BysXPflMS&i`2dZg*L6Z^SE!3?+k@h|I0ltDkw>n?>Gzeeyw> z#j-Qb7n;&jmX}=mZM#P~D|@ZZn`gHV*S^p5`NRMHuC><2){-N?x7R)my|#GTor;&G zq1x}0zJJQ9Z{N!hadvZ3?$5*NF5g)@_a;eoU$!|qLpWt~#mDmh>ytL<2ZwAcE{i&H zC*SnfH+w`@wgzTp1)XA!0$>(y0b(JftQ=63pI(%htCw6{y}!CXvoI}gS5t6STwGRV zn&;Gc@o8~ki{>R~de%i`1s0~&$pze+HNAWKX-oU{7WV3)`g=4st6Wt#)(>?)scfpQ z9`CMbvtL8qHPG|2)NG~cXBJ&~GU?AEujQA{%n>=iXG@K(fwqRJy6HxX(92T5qK1)4 zgaLPH26QA6fE78QvJF`$wqgpQEfL6s>O?EFkj=mrJ_s{(SP*6)LMy Date: Thu, 16 Jul 2026 19:08:55 +0300 Subject: [PATCH 4/4] replacing links --- v2/Generator/MultiGeneratorV2.cs | 3 +++ .../docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/v2/Generator/MultiGeneratorV2.cs b/v2/Generator/MultiGeneratorV2.cs index 35e0de32f..644724680 100644 --- a/v2/Generator/MultiGeneratorV2.cs +++ b/v2/Generator/MultiGeneratorV2.cs @@ -118,6 +118,9 @@ public string[] SourceNoRSCG() if (File.Exists(nameFile)) { var text=await File.ReadAllTextAsync(nameFile); + text = text.Replace("(Directory.Build.props.template", $"({d.Generator!.Source}/Directory.Build.props.template"); + text = text.Replace("(Build.ps1.template", $"({d.Generator!.Source}/Build.ps1.template"); + text = text.Replace("(Build.sh.template", $"({d.Generator!.Source}/Build.sh.template"); text = text.Replace("(examples/", $"({d.Generator!.Source}/examples/"); text = text.Replace("(tests/", $"({d.Generator!.Source}/tests/"); diff --git a/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md b/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md index 6282ef099..b819a1f2b 100644 --- a/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md +++ b/v2/rscg_examples_site/docs/RSCG-Examples/Bennewitz.Ninja.AutoVersioning.md @@ -85,7 +85,7 @@ A [Roslyn incremental source generator](https://learn.microsoft.com/en-us/dotnet > **Note:** The package's auto-imported `Build.props` automatically suppresses the 8 SDK-generated attributes that conflict with this generator (e.g. `AssemblyVersion`, `AssemblyCopyright`). It uses granular per-attribute suppressions rather than `false`, which means `InternalsVisibleTo` and all other SDK-generated attributes continue to work normally. Do **not** add `false` yourself — it will break `InternalsVisibleTo`. -A ready-to-use template is available at [`Directory.Build.props.template`](Directory.Build.props.template). +A ready-to-use template is available at [`Directory.Build.props.template`](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/Directory.Build.props.template). **3. Build.** The generator runs automatically — no further setup needed. @@ -183,7 +183,7 @@ The package auto-imports `Build.props` via NuGet, which declares `CompilerVisibl `BuildTimestamp` keeps the version consistent across every project in a solution build. See [`docs/MultiProjectBuildTimestamps.md`](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/docs/MultiProjectBuildTimestamps.md) for how it works and what alternative approaches were considered. -> **TL;DR:** For CI, or any local build where an exact guarantee matters more than convenience, use `-p:BuildTimestamp=...` to fix the value explicitly instead of relying on evaluation-time capture. Ready-to-use wrappers are available at [`Build.ps1.template`](Build.ps1.template) (Windows/PowerShell 7+) and [`Build.sh.template`](Build.sh.template) (Linux/macOS/bash). +> **TL;DR:** For CI, or any local build where an exact guarantee matters more than convenience, use `-p:BuildTimestamp=...` to fix the value explicitly instead of relying on evaluation-time capture. Ready-to-use wrappers are available at [`Build.ps1.template`](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/Build.ps1.template) (Windows/PowerShell 7+) and [`Build.sh.template`](https://github.com/JanusMael/Bennewitz.Ninja.AutoVersioning/Build.sh.template) (Linux/macOS/bash). ######### Diagnostics