I "solved" (created work around) this in simpler way.
In post build
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
is the folder where you want your published stuff go for staging
NOTE: depending on what version of dotnet.exe
you use, command --no-build
may not be available.
For example, not available in v2.0.3; and available in v2.1.402. I know that VS2017 Update4 had v2.0.3. And Update8 has 2.1.x
Update:
The setup above will work in the basic debug environment but to put it into build server/production environment more is needed. In this particular example that I had to solve, we build Release|x64
and Release|x86
separately. So I accounted for both. But to support the post build dotnet publish
command, I first added RuntimeIdentifier
to project file.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
Why I needed it and why you can get away without it? I needed this because my build program is set to intercept warning MSB3270, and fail the build if it appears. This warning says, "hey, some files in your dependencies are of wrong format". But do you remember the goal of this exercise? We need to pull package dependency DLLs. And in many cases it doesn't matter if this warning is there because following post build does not care. Again, this is my build program that cares. So, I only added RuntimeIdentifier
to 2 configurations I use during production build.
Full Post build
if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y
if $(ConfigurationName) == Release (
dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)
xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R
Explanation: dotnet publish is looking for obj\Debug
or obj\Release
. We don't have it during the build because build creates obj\x64\Release
or obj\x86\Release
. Line 1 and 2 mitigate this issue. In line 3 I tell dotnet.exe
to use specific configuration and target runtime. Otherwise, when this is debug mode, I don't care about runtime stuff and warnings. And in the last line I simply take my dlls and copy then into output folder. Job done.
dotnet publish
be a hack? Include the command in your csproj file as a post build script. – Edmonddotnet publish
throws the entire framework in the publish folder, since I'm writing a plugin, the majority of the files are not necessary since the framework would already be loaded by the bootstrapper program. I'm looking for something similar to how builds work on .NET Framework. – Breakfront<CopyToOutputDirectory>Always</CopyToOutputDirectory>
in your csproj on each of the dlls you want to move doesn't do the trick? Perhaps combined with a<link>
node? – Edmond<PackageReference/>
does not support<CopyToOutputDirectory>
. – Breakfrontbin/
dir because the files were already copied by default! – Overthrust