我可以缩小 dotnet 发布包吗

Can I shrink a dotnet publish package

我最近开始使用 dotnet 核心(与老式的普通 .net 相对)进行开发,以创建许多小型实用程序控制台应用程序。

进展顺利,已经到了要发表的地步

我正在使用 CLI,因为我只对 Win 10 部署感兴趣,所以尝试了

dotnet publish -c release -r win10-x64

它工作并为我建立了一个 "publish" 文件夹,其中似乎一切正常,尽管 "publish" 文件夹与应用程序的大小(~500 行代码)相比很大(~70mb) ).

因为我只打算部署到 Win10 机器上,有没有办法打包它,这样我就不需要所有的 .NET 文件了?我认为这就是 -r 选项的用途,但似乎并没有取得多大成就。

这取决于你想如何部署你的 app/who 将要使用它们。

-r 标志创建一个独立的应用程序。这会导致 publish 命令包含指定平台所需的 .NET Core DLL(以及平台特定的 nuget 包,如果它们可用),这意味着任何人都可以使用该应用程序而无需安装 .NET Core 运行时间。

如果您删除 -r 标志,则 publish 将只包含您应用程序的 DLL。但这意味着无论谁想要使用您的应用程序,都必须先安装 .NET Core 运行time.

您可以通过使用 -o 标志将发布输出写入不同的目录来查看差异,例如

dotnet publish -c release -r win10-x64 -o ./publish-win10

dotnet publish -c release -o ./publish-any

现在去看看 ./publish-win10./publish-any 文件夹中写入的内容,您可以了解其中的区别。

如果您将它们安装到 .NET Core 运行time 已经存在的系统上,那么您可以只分发 DLL 并节省大量 space。但是,如果您希望能够在最终用户不必担心安装 .NET Core 运行time 的情况下分发应用程序,那么创建独立分发的 -r 标志是一种方法去,但导致 'package' 包括必要的 .NET Core 程序集。

AFAIK -r 标志不会影响您的应用程序的编译方式,只是 运行time DLL 作为 publish 命令的一部分包含在内。因此,如果您为 win10-x64 发布代码或使用或不使用 -r 标志,您的代码总是会获得相同的 DLL,因此您的应用程序 DLL 将在任何(.NET Core 兼容)上 运行 ) 平台,但我很高兴在这一点上得到纠正。

与您习惯于将构建作为创建输出的标准的 .NET 4.x 不同,.NET Core(和 .NET 5)认为构建和发布是非常不同的。

巨大的 (70MB) 大小是因为发布者假设您的目标没有安装任何形式的 .NET Framework,因此将其与您的项目捆绑在一起。

您可以将发布行更改为

dotnet publish -r win-x64 --self-contained false

就其本身而言,这将创建 .NET Core 标准 - 一个 .dll(您的应用程序),一个 .exe(那个 运行 应用程序),一些 .json 文件用于设置,.pdb 文件用于调试符号。

要将应用程序更改为您习惯的 .NET Framework 标准输出,请在文本编辑器中打开 .csproj 文件,然后在

<TargetFramework>netx.x</TargetFramework>

行,添加

<PublishSingleFile>true</PublishSingleFile>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>

并重新运行发布命令。这将导致 publish 目录中有一个 .exe 和一个 .pdb (您可以安全删除的 .pdb 文件)。

注意:由于您已经包含 --self-contained false,目标将需要指定版本的 .NET Framework(在您的 .csproj 中指定的版本文件)安装。虽然许多版本的 .NET Framework 当前安装在大多数 Windows 10 设备上(通常位于 C:\Windows\Microsoft.NET\FrameworkC:\Program Files\dotnet\),但 .NET Core / .NET 5 运行时尚未很常见(虽然可能会在不久的将来通过 Windows 更新分发),因此如果您的 .exe 的收件人没有下载,可能需要 once-off 下载。

虽然 .NET Core / .NET 5 生成的二进制文件更大(虽然大约 150kb - 不是 50MB),但它们 运行 比它们的 .NET Framework 4.x 对应版本快得多。