问题描述
我的团队最近开始在我们基于 .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 命令的第三方剥离工具。而且它更容易和更合适。