MSBuild .props and .targets in a package

In additional to the more traditional assemblies, NuGet packages may sometimes add custom build targets or properties to projects that consume that package. This can be achieved by adding a valid MSBuild file, in the form <package_id>.targets or <package_id>.props (such as Contoso.Utility.UsefulStuff.targets) within the build folders of the project.

Build folders

As NuGet has evolved, various different folders for build .props and .targets have been added.

Folder NuGet Version Use
build 2.5+ Build logic for every framework of a project.
buildMultiTargeting 4.0+ Build logic for the outer build for projects that target multiple frameworks. PackageReference only.
buildTransitive 5.0+ Build logic for assets that flow transitively to any consuming project. See the feature page. PackageReference only.

Framework specific build folder

All 3 build folder follow the same pattern for deciding the most suitable file based on the project target framework.

Files in the root build folder, build/<package_id>.targets and build/<package_id>.props are considered suitable for all target frameworks.

To provide framework-specific files, first place them within appropriate subfolders, such as the following:

    \build
        \netstandard1.4
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets
        \net462
            \Contoso.Utility.UsefulStuff.props
            \Contoso.Utility.UsefulStuff.targets

Prefer using framework-specific build folders whenever appropriate to avoid false positive installations in projects that may not be supported by your package.

Note that if a package does not have any files in the lib or ref folders and only files under a framework specific build folder, that package will be considered compatible with all projects. Up to date versions of the pack tooling, raise the NU5127 warning when such packages are created.

Projects consuming packages with build files

PackageReference projects

.props and .targets are not added to the project file but are instead made available through {projectName}.nuget.g.targets and {projectName}.nuget.g.props. These files are automatically generated when restore is run.

When a project targets more than one framework, the imports to these files are conditioned on the target framework name.

MSBuild .props and .targets files for multi-framework targeting can be placed in the \buildMultiTargeting folder. When the imports are generated, a condition that the MSBuild property $(TargetFramework) is empty is set.

packages.config projects

When NuGet installs a package with \build files, it adds MSBuild <Import> elements in the project file pointing to the .targets and .props files. (.props is added at the top of the project file; .targets is added at the bottom.) A separate conditional MSBuild <Import> element is added for each target framework.

Authoring packages with MSBuild props and targets

You can use any of the following tools to include MSBuild .props and .targets in your package.

Guidance for the content of MSBuild props and targets

NuGet does not limit how you author .props and .targets as they will vary based on the need of the package author and the target projects themselves.

There are a few things that must not be done in packages' .props and .targets, such as not specifying properties and items that affect restore, as those will be automatically excluded.

  • Some examples of properties that must not be added or updated: TargetFramework, TargetFrameworkMoniker, TargetPlatformMoniker, AssetTargetFallback etc.

  • Some examples of items that must not be added or updated: PackageReference, PackageVersion, PackageDownload, etc.