Using Directory.Build.props & Directory.Packages.props to enable Central Package Management
What is a Directory.Build.props
file?
A Directory.Build.props file can reside in the root directory of your .NET project and contain properties that will get applied to every project in the solution. It is useful for enforcing project standards in one spot without needing to configure each project.
An example of a Directory.Build.props
is below
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<ImplicitUsings>true</ImplicitUsings>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<AccelerateBuildsInVisualStudio>true</AccelerateBuildsInVisualStudio>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
</Project>
The property I want to highlight in this post is ManagePackageVersionsCentrally
. This comes into play with the second file I want to discuss, Directory.Packages.props
. Setting ManagePackageVersionsCentrally
to true
and creating a Directory.Packages.props
file will enable Central Package Management.
What is Central Package Management? What is a Directory.Packages.props
file?
Central Package Management enables you to review and manage your NuGet dependencies in one file, Directory.Packages.props
. This is useful if you have many .NET projects in one solution. Using a Directory.Packages.props
file allows you to set a version number once for a NuGet dependency. .NET projects downstream can include the dependency, but will not specify a version number. The project(s) will use the version specified in the Directory.Packages.props
file.
Another advantage of Directory.Packages.props
is for including Roslyn analyzers. You can set a GlobalPackageReference
which is used to specify that the dependency will be used by every project. A sample Directory.Packages.props
file might look like the following:
<Project>
<ItemGroup>
<GlobalPackageReference Include="IDisposableAnalyzers" Version="4.0.6" PrivateAssets="All" IncludeAssets="Runtime;Build;Native;contentFiles;Analyzers" />
<PackageVersion Include="FluentValidation" Version="11.5.2" />
<PackageVersion Include="Polly" Version="7.2.4" />
</ItemGroup>
</Project>
In the above example, IDisposableAnalyzers
is included as a GlobalPackageReference
which will make it available for all projects. FluentValidation and Polly are included as a PackageVersion
and specify a version. Projects can then include a package using the syntax: <PackageReference Include="FluentValidation" />
. Now, when you update the version of a NuGet package in Directory.Packages.props
, the dependency will be updated for any project downstream!