What I use for a csproj for a Roslyn Code Generator

My csproj file looks like this

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<Project Sdk="Microsoft.NET.Sdk">
 
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <LangVersion>12.0</LangVersion>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <IsRoslynComponent>true</IsRoslynComponent>
        <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
        <!--<IncludeBuildOutput>false</IncludeBuildOutput>-->
    </PropertyGroup>
    <PropertyGroup>
 
        <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
        <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
    </PropertyGroup>
 
    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
 
        <PackageReference Include="System.CodeDom" PrivateAssets="all" GeneratePathProperty="true" Version="8.0.0" />
        <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
        <None Remove="bin\Debug\netstandard2.0\\*.dll" />
        <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
 
 
    </ItemGroup>
 
 
    <PropertyGroup>
        <TreatWarningsAsErrors>True</TreatWarningsAsErrors>
        <WarningsNotAsErrors>CS0436</WarningsNotAsErrors>
    </PropertyGroup>
 
 
    <ItemGroup>
        <PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
        <None Include="../../README.md" Pack="true" PackagePath="\" />
        <None Include="../../readme.txt">
            <Pack>True</Pack>
            <PackagePath></PackagePath>
        </None>
        <None Include="../../LICENSE" Pack="true" PackagePath="\" />
    </ItemGroup>
    <PropertyGroup>
        <Description>Interface to null object - common</Description>
        <Copyright>MIT</Copyright>
        <NeutralLanguage>en-US</NeutralLanguage>
        <CurrentDate>$([System.DateTime]::Now.ToString(yyyyMMdd))</CurrentDate>
        <Authors>Andrei Ignat</Authors>
        <Title>A C# source-generated class library for generating null objects from interface</Title>
        <PackageTags>dotnet;dotnetcore;csharp;generators;sourcegen;roslyn;</PackageTags>
        <PackageProjectUrl>https://github.com/ignatandrei/rscg_Interface_to_null_object</PackageProjectUrl>
        <PublishRepositoryUrl>true</PublishRepositoryUrl>
        <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
        <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
        <IncludeSymbols>true</IncludeSymbols>
        <IncludeSource>true</IncludeSource>
        <NoWarn>NU5125;NU5039;CS0436</NoWarn>
        <!--<Version>8.$([System.DateTime]::Now.ToString(yyyy.1MMdd.1HHss))</Version>-->
        <!--<Version>$([System.DateTime]::Now.ToString(8.yyyy.1MMdd.1HHmm))</Version>-->
        <Version>2025.119.1910</Version>
 
        <!--<Optimize Condition="'$(Configuration)'=='Release'">true</Optimize>-->
        <RepositoryUrl>https://github.com/ignatandrei/rscg_Interface_to_null_object</RepositoryUrl>
        <PackageLicenseFile>LICENSE</PackageLicenseFile>
        <RepositoryType>git</RepositoryType>
        <EmbedUntrackedSources>true</EmbedUntrackedSources>
        <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
        <PackageReadmeFile>README.md</PackageReadmeFile>
        <IsPackable>true</IsPackable>
        <!--<PackageIcon>logo.png</PackageIcon>-->
    </PropertyGroup>
 
 
    <PropertyGroup Condition="'$(GITHUB_ACTIONS)' == 'true'">
        <ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
        <SourceLinkCreate>true</SourceLinkCreate>
        <SourceLinkOriginUrl>https://github.com/ignatandrei/rscg_Interface_to_null_object</SourceLinkOriginUrl>
    </PropertyGroup>
     
     
     
    <ItemGroup>
        <PackageReference Include="RazorBlade" Version="0.6.0" PrivateAssets="all" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />
        <PackageReference Include="RSCG_NameGenerator" Version="2024.11.11.1830">
            <OutputItemType>Analyzer</OutputItemType>
            <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
        </PackageReference>
 
    </ItemGroup>
 
</Project>

And now a detailed explanation

Project Sdk

<Project Sdk="Microsoft.NET.Sdk">

This tag specifies the SDK to use for the project. The Microsoft.NET.Sdk is a general-purpose SDK for .NET projects.

PropertyGroup

<PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <LangVersion>12.0</LangVersion>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <IsRoslynComponent>true</IsRoslynComponent>
    <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
</PropertyGroup>
  • TargetFramework: Targets .NET Standard 2.0, ensuring compatibility with a wide range of .NET implementations.
  • LangVersion: Specifies the C# language version to use.
  • Nullable: Enables nullable reference types to improve null safety.
  • ImplicitUsings: Automatically includes commonly used namespaces.
  • IsRoslynComponent: Indicates that this project is a Roslyn component, useful for source generators.
  • EnforceExtendedAnalyzerRules: Enforces extended analyzer rules to maintain code quality.

Emit Compiler Generated Files

<PropertyGroup>
    <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
    <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
  • EmitCompilerGeneratedFiles: Emits compiler-generated files for debugging and analysis.
  • CompilerGeneratedFilesOutputPath: Specifies the output path for compiler-generated files.

Package References

<ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4">
        <PrivateAssets>all</PrivateAssets>
        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="System.CodeDom" PrivateAssets="all" GeneratePathProperty="true" Version="8.0.0" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" />
    <None Remove="bin\Debug\netstandard2.0\\*.dll" />
    <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
  • Microsoft.CodeAnalysis.Analyzers: Adds a reference to the Microsoft.CodeAnalysis.Analyzers package, which provides code analysis tools.
  • System.CodeDom: Adds a reference to the System.CodeDom package, useful for code generation.
  • Microsoft.CodeAnalysis.CSharp: Adds a reference to the Microsoft.CodeAnalysis.CSharp package, necessary for Roslyn-based projects.
  • None Remove: Removes unnecessary DLLs from the build output.
  • None Include: Includes the generated DLL in the NuGet package under the specified path.

Treat Warnings as Errors

<PropertyGroup>
    <TreatWarningsAsErrors>True</TreatWarningsAsErrors>
    <WarningsNotAsErrors>CS0436</WarningsNotAsErrors>
</PropertyGroup>
  • TreatWarningsAsErrors: Treats all warnings as errors to ensure code quality.
  • WarningsNotAsErrors: Excludes specific warnings from being treated as errors.

Source Link and Additional Files

<ItemGroup>
    <PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
    <None Include="../../README.md" Pack="true" PackagePath="\" />
    <None Include="../../readme.txt">
        <Pack>True</Pack>
        <PackagePath></PackagePath>
    </None>
    <None Include="../../LICENSE" Pack="true" PackagePath="\" />
</ItemGroup>
  • Microsoft.SourceLink.GitHub: Adds SourceLink support for GitHub, enabling better debugging experiences.
  • README.md: Includes the README.md file in the NuGet package.
  • readme.txt: Includes the readme.txt file in the NuGet package.
  • LICENSE: Includes the LICENSE file in the NuGet package.

Package Metadata

<PropertyGroup>
    <Description>Interface to null object - common</Description>
    <Copyright>MIT</Copyright>
    <NeutralLanguage>en-US</NeutralLanguage>
    <CurrentDate>$([System.DateTime]::Now.ToString(yyyyMMdd))</CurrentDate>
    <Authors>Andrei Ignat</Authors>
    <Title>A C# source-generated class library for generating null objects from interface</Title>
    <PackageTags>dotnet;dotnetcore;csharp;generators;sourcegen;roslyn;</PackageTags>
    <PackageProjectUrl>https://github.com/ignatandrei/rscg_Interface_to_null_object</PackageProjectUrl>
    <PublishRepositoryUrl>true</PublishRepositoryUrl>
    <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
    <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
    <IncludeSymbols>true</IncludeSymbols>
    <IncludeSource>true</IncludeSource>
    <NoWarn>NU5125;NU5039;CS0436</NoWarn>
    <Version>2025.119.1910</Version>
    <RepositoryUrl>https://github.com/ignatandrei/rscg_Interface_to_null_object</RepositoryUrl>
    <PackageLicenseFile>LICENSE</PackageLicenseFile>
    <RepositoryType>git</RepositoryType>
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
    <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
    <PackageReadmeFile>README.md</PackageReadmeFile>
    <IsPackable>true</IsPackable>
</PropertyGroup>
  • Description: Provides a description for the NuGet package.
  • Copyright: Specifies the copyright information.
  • NeutralLanguage: Sets the neutral language for the assembly.
  • CurrentDate: Sets the current date, useful for versioning.
  • Authors: Specifies the author of the package.
  • Title: Provides a title for the NuGet package.
  • PackageTags: Specifies tags for the NuGet package to improve discoverability.
  • PackageProjectUrl: Provides the URL to the project repository.
  • PublishRepositoryUrl: Publishes the repository URL in the NuGet package metadata.
  • GenerateAssemblyInfo: Generates assembly information attributes.
  • GeneratePackageOnBuild: Disables automatic package generation on build.
  • IncludeSymbols: Includes symbol files in the NuGet package for debugging.
  • IncludeSource: Includes source files in the NuGet package for debugging.
  • NoWarn: Suppresses specific warnings.
  • Version: Sets the version of the NuGet package.
  • RepositoryUrl: Specifies the repository URL.
  • PackageLicenseFile: Specifies the license file for the package.
  • RepositoryType: Specifies the repository type.
  • EmbedUntrackedSources: Embeds untracked source files in the PDB for better debugging.
  • AllowedOutputExtensionsInPackageBuildOutputFolder: Allows PDB files in the package build output folder.
  • PackageReadmeFile: Specifies the README file for the package.
  • IsPackable: Indicates that the project is packable into a NuGet package.

GitHub Actions

<PropertyGroup Condition="'$(GITHUB_ACTIONS)' == 'true'>
    <ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
    <SourceLinkCreate>true</SourceLinkCreate>
    <SourceLinkOriginUrl>https://github.com/ignatandrei/rscg_Interface_to_null_object</SourceLinkOriginUrl>
</PropertyGroup>
  • ContinuousIntegrationBuild: Enables continuous integration build settings.
  • SourceLinkCreate: Enables SourceLink creation for better debugging.
  • SourceLinkOriginUrl: Specifies the SourceLink origin URL.

Additional Package References

<ItemGroup>
    <PackageReference Include="RazorBlade" Version="0.6.0" PrivateAssets="all" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />
    <PackageReference Include="RSCG_NameGenerator" Version="2024.11.11.1830">
        <OutputItemType>Analyzer</OutputItemType>
        <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
    </PackageReference>
</ItemGroup>
  • RazorBlade: Adds a reference to the RazorBlade package, useful for code generation.
  • RSCG_NameGenerator: Adds a reference to the RSCG_NameGenerator package, useful for generating names in source code.