从输出目录中排除带有 x64 dll 的 nuget 包?

Excluding nuget package with x64 dll from output directory?

我刚刚将 nuget 包 Grpc.Core.Api 添加到我的一个项目中。

此项目的构建平台目标标记为 x86,但是构建过程将 grpc_csharp_ext.x64.dllgrpc_csharp_ext.x86.dll 都放入我的输出目录中。

大约 10.2MB,感觉没有必要。有什么方法可以防止包含 x64 变体(除了在 Post-build 事件中手动添加删除命令之外)。

安装 Grpc.Core NuGet 包后,我可以看到这两个 .dll 文件:grpc_csharp_ext.x64.dllgrpc_csharp_ext.x86.dll,如果我只安装 Grpc.Core.Api NuGet 包, 它们不会被生成。

通过查看详细的MSBuild输出日志,默认任务Copy复制了这两个文件。判断是否复制或跳过复制的逻辑(或控制)应该存储在Grpc.Core NuGet包文件夹的.targets文件中。

然后我在 …\MyProject\packages\Grpc.Core.xxxxx\build\net45 下找到 Grpc.Core.targets 文件。如果你找到并打开它,你会看到相关的设置:

<ItemGroup Condition="'$(Grpc_SkipNativeLibsCopy)' != 'true'">
    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x86\native\grpc_csharp_ext.x86.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>grpc_csharp_ext.x86.dll</Link>
      <Visible>false</Visible>
      <NuGetPackageId>Grpc.Core</NuGetPackageId>
    </Content>
    <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x64\native\grpc_csharp_ext.x64.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>grpc_csharp_ext.x64.dll</Link>
      <Visible>false</Visible>
      <NuGetPackageId>Grpc.Core</NuGetPackageId>
    </Content>
    ...

<condition="'$(Grpc_SkipNativeLibsCopy)'!='ture'"><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>使grpc_csharp_ext.x64.dll复制到项目输出目录。

我认为这不能通过在 .csproj 文件中使用 MSBuild 来覆盖、更改或阻止。正如您提到的,在 Post-build 事件中手动添加删除命令应该可以,但在复制文件后才可以。

什么我think/suggest

我可能会提供一个愚蠢或有风险的解决方法。我不建议修改Grpc.Core.targets文件,但是如果你为grpc_csharp_ext.x64.dll改成<CopyToOutputDirectory>Never</CopyToOutputDirectory>,如果你只为x86构建,则不会再次生成这个文件。

这可能需要此 NuGet 包的作者进行更改,除非这些操作(在 x86 下构建时将 ..x64 文件复制到输出目录)是必要的或出于某些我们没有注意到的原因。

同样,我同意考虑使用 Post-build 事件更好。