My csproj file looks like this
<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.
 
Leave a Reply