我以更简单的方式“解决”(创建了解决方法)这个问题。
在后期构建中
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。我们在构建过程中没有它,因为构建会创建 obj\x64\Release 或 obj\x86\Release。第 1 行和第 2 行缓解了这个问题。在第 3 行中,我告诉 dotnet.exe 使用特定的配置和目标运行时。否则,当这是调试模式时,我不关心运行时的东西和警告。在最后一行中,我只需将我的 dll 复制到输出文件夹中。任务完成。