从 Windows 上的 libgrpc_csharp_ext.x64.so 中去除调试信息

问题描述

我的团队最近开始在我们基于 .Net Framework 构建的产品中使用 gRPC。由于主要是 libgrpc_csharp_ext.x64.so 中的大量调试符号,因此我们的构建工件已从 50 MB 激增至 400 MB。由于互联网带宽较低,这给我们的 CI/CD 环境以及我们的交付链带来了一些问题。

我想减小构建工件的大小。 我知道可以使用 binutils/strip 命令从 libgrpc_csharp_ext.x64.so 中剥离调试符号。

这是最好的方法吗?或者在 Visual Studio(csproj、sln)、Nuget 或 MSBuild 中是否有一些设置可用于从继承的 gRPC so 文件删除调试信息?

在 Windows 上使用 binutils/strip 的最简单方法是什么?

解决方法

恐怕 msbuild 无法做到这一点。 so 文件基于 linux,VS IDE 基于 Windows,无法处理 so 文件。它不是由 MSBuild、VS IDE 生成的,而是根据 RuntimeIdentifier 从 nuget 包复制到您的输出文件中。

但是该文件是由其他工具生成的,而不是 VS IDE,而 VS IDE 和 MSBuild 无法处理它,它只是从第三个工具复制到您的 VS IDE 中。

事实上,如果它是dll类型(Windows)并且您拥有libgrpc_csharp_ext.x64项目的开源代码。

注意:你必须在一开始就通过MSBuild修改开源代码,然后你才能生成没有dll信息的文件。并且没有其他选项可以在重新生成过程后删除调试信息。

然后然后您可以将这些添加到 csproj 文件的底部:

<PropertyGroup>

<DebugSymbols>false</DebugSymbols>
<DebugType>none</DebugType>

</PropertyGroup>

然后然后重建源代码以生成没有调试信息的dll。那就是 MSBuild 函数。

但是这是针对 Windows 的。它不适合您的 linux 文件。并且在 MSBuild、Nuget、csproj 文件上没有关于它的选项。

所以最好的功能是使用你的方法,使用 binutils/strip 命令的第三方剥离工具。而且它更容易和更合适。