【问题标题】:Optimizing .NET Core self-contained deployment优化 .NET Core 自包含部署
【发布时间】:2020-06-23 15:53:53
【问题描述】:

我正在开发一个简单的跨平台 .NET 应用程序。我需要将其作为独立部署分发,因为我无法假设是否已经安装了 .NET。

.NET 发布适用于 Windows 10 64 位会生成一个 64 MB 的目录。我很确定不需要大多数 DLL 文件。有没有办法优化分发以便只保留必要的 DLL 文件?

【问题讨论】:

  • 旁注:如果您应该使用 .net core 2.0,请使用 win-x64 而不是 win10-x64
  • 谢谢。有道理。

标签: deployment .net-core


【解决方案1】:

我也面临同样的问题。到目前为止,这是我发现的:

Microsoft 发布了一个Trim tool,它可以找到未使用的程序集并将其删除。

使用 .NET CLI:

  • dotnet add package Microsoft.Packaging.Tools.Trimming -v 1.1.0-preview1-25818-01
  • dotnet publish -r win-x64 -c release /p:TrimUnusedDependencies=true

您的应用程序的占用空间现在要小得多(通常)


为了更好的优化,您可以将它与 ILLinker 一起使用:

  • dotnet new nuget

打开nuget.config并在<packageSource>之间添加<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />

Here 是您的 nuget.config 应该是什么样子的示例。

然后执行以下命令:

  • dotnet add package ILLink.Tasks -v 0.1.4-preview-981901
  • dotnet add package Microsoft.Packaging.Tools.Trimming -v 1.1.0-preview1-25818-01
  • dotnet publish -r win-x64 -c release /p:TrimUnusedDependencies=true

使用这两个工具,我设法将应用程序的大小除以三。

来源:Reducing the size of self-contained .NET Core applications


我仍在努力进行更好的优化。我想在只有 10 MB 的嵌入式系统中运行我的 ASP.NET Core 应用程序(当前为 72 MB)。

如果有人找到更好的优化,我是买家。

【讨论】:

    【解决方案2】:

    从 .NET Core 3.0 开始,就像在项目的 .csproj 文件中添加一个标志一样简单:

    <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <RuntimeIdentifier>win-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    
      <PublishTrimmed>true</PublishTrimmed> <!-- Add this flag to enable trimming -->
    </PropertyGroup>
    

    然后你可以使用dotnet publish 来生成一个修剪后的可执行文件。

    这是来自the documentation的警告:

    重要的是要考虑应用程序或框架(包括 使用反射或相关动态功能的 ASP.NET Core 和 WPF), 修剪时经常会断裂。发生这种损坏是因为链接器 不知道这种动态行为,也无法确定哪个 反射需要框架类型。 IL Linker 工具可以是 配置为意识到这种情况。

    最重要的是,一定要在修剪后测试您的应用。

    简单控制台应用程序的典型缩减结果似乎是从大约 70 MB 到大约 28 MB

    【讨论】:

      【解决方案3】:

      2020 年更新:这现在是工具链的一部分,请参阅 Pawel 的回答。

      此任务可以通过使用 IL 链接器来完成。通过将 NuGet 包添加到您的项目,它可以通过删除不需要的代码来减小已发布的自包含应用程序的大小。但是,它仍处于预览阶段(截至 2017 年)。有关独立应用程序,请参阅 announcement postsample instructions

      【讨论】:

      • 这令人印象深刻 :-) 正如页面所声称的那样,部署规模减少了 50%。非常有前途,但我不确定我是否可以将其用于生产用途。仍然让我难以置信,我需要 32MB 的空间来创建一个简单的应用程序,该应用程序与标准输入/标准输出、与 newtonsoft 的 json 接口以及与 Serilog 的输出日志相连接。 Python 中的类似应用程序被冻结到 10MB。我相信这可能是苹果和橘子的比较。我将密切关注这个链接器的进展,因为它可能对微服务至关重要
      • @PeterMortensen 你是对的。随着事情的变化,这样的答案很难。
      【解决方案4】:

      Microsoft.DotNet.ILCompiler 似乎是比 ILLinker 更好的选择。 See this reply.

      我在相同源代码上对 .NET Core 2.2 独立输出的测试给出:

      1. 默认独立发布:68 MB
      2. ILLinker:36 MB
      3. IL 编译器:5 MB

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2019-09-01
        相关资源
        最近更新 更多