Lately I've been porting some projects at a client from .NET Framework to .NET Core,
and as part of that I had to convert
csproj files from the old project format
to the new one. That means getting rid of package references in
and replacing them with
PackageReference elements in the project files.
When doing this, I noticed that some files that was part of a NuGet package's TFM folder wasn't copied to the application's output folder anymore. As annoying as breaking changes are I realized that this change was an improvement in many ways, but I still needed to find a way to solve the problem.
There was a feature added in the NuGet client library that was shipped with
Visual Studio 15.9.9 that introduced a new attribute to the
GeneratePathProperty. What this attribute does is that it creates
a new MSBuild property that is set to the package's root path on disk.
Knowing where the NuGet package would be unpacked on disk allowed me to write a MSBuild target, that after building my project would copy the file to the output directory.
<!-- Specify what packages we're dependent on --> <ItemGroup> <PackageReference Include="Foo.Bar" Version="1.2.3" GeneratePathProperty="true" /> </ItemGroup> <!-- Copy the files to the output directory --> <Target Name="CopyFooBarFiles" AfterTargets="Build"> <Copy Condition="'$(TargetFramework)' == 'net462'" SourceFiles="$(PkgFoo_Bar)\lib\net40\qux.dat" DestinationFolder="$(OutDir)" /> </Target>
So by setting
GeneratePathProperty="true" for the
Foo.Bar reference above, an
MSBuild property named
PkgFoo_Bar automatically gets created set to the path to
the package on disk.