我以更简单的方式“解决”(创建了解决方法)。
在后期制作中
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
是您希望已发布的内容用于分阶段的文件夹
注意:根据dotnet.exe
您使用的版本,命令--no-build
可能不可用。
例如,在v2.0.3中不可用;并在v2.1.402中可用。我知道VS2017 Update4拥有v2.0.3。而且Update8具有2.1.x
更新:
上面的设置将在基本调试环境中工作,但需要将其放入构建服务器/生产环境中的情况更多。在这个特殊的例子,我不得不解决的,我们建立Release|x64
和Release|x86
分开。所以我把两者都考虑在内。但是为了支持post build dotnet publish
命令,我首先将其添加RuntimeIdentifier
到项目文件中。
<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>
为什么我需要它,为什么没有它您可以逃脱?我需要这样做,因为我的构建程序设置为拦截警告MSB3270,并在构建出现时使构建失败。此警告说,“嘿,您的依赖项中的某些文件格式错误”。但是您还记得此练习的目标吗?我们需要提取程序包依赖的DLL。而且在很多情况下,是否存在此警告都无关紧要,因为后续的构建并不重要。同样,这是我关心的构建程序。因此,我只添加RuntimeIdentifier
了在生产构建期间使用的2种配置。
全文发布
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
说明:dotnet publish正在寻找obj\Debug
或obj\Release
。在构建期间我们没有它,因为build创建obj\x64\Release
或obj\x86\Release
。第1行和第2行缓解了此问题。在第3行中,我告诉dotnet.exe
您使用特定的配置和目标运行时。否则,当这是调试模式时,我不在乎运行时的东西和警告。在最后一行中,我只需将自己的dll并复制到输出文件夹中即可。任务完成。
dotnet publish
hack?将命令包含在csproj文件中,作为后期构建脚本。