从输出目录中排除带有 x64 dll 的 nuget 包?
Excluding nuget package with x64 dll from output directory?
我刚刚将 nuget 包 Grpc.Core.Api
添加到我的一个项目中。
此项目的构建平台目标标记为 x86
,但是构建过程将 grpc_csharp_ext.x64.dll
和 grpc_csharp_ext.x86.dll
都放入我的输出目录中。
大约 10.2MB,感觉没有必要。有什么方法可以防止包含 x64 变体(除了在 Post-build 事件中手动添加删除命令之外)。
安装 Grpc.Core
NuGet 包后,我可以看到这两个 .dll
文件:grpc_csharp_ext.x64.dll
和 grpc_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 事件更好。
我刚刚将 nuget 包 Grpc.Core.Api
添加到我的一个项目中。
此项目的构建平台目标标记为 x86
,但是构建过程将 grpc_csharp_ext.x64.dll
和 grpc_csharp_ext.x86.dll
都放入我的输出目录中。
大约 10.2MB,感觉没有必要。有什么方法可以防止包含 x64 变体(除了在 Post-build 事件中手动添加删除命令之外)。
安装 Grpc.Core
NuGet 包后,我可以看到这两个 .dll
文件:grpc_csharp_ext.x64.dll
和 grpc_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 事件更好。