我可以缩小dotnet发布包

时间:2018-10-12 22:51:52

标签: .net-core publish

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

开发很好,已经到了我要发布它们的地步。

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

dotnet publish -c release -r win10-x64

它起作用了,并为我建立了一个“发布”文件夹,其中的所有内容似乎都可以正常工作,尽管与应用程序的大小(约500行代码)相比,“发布”文件夹很大(约70mb)。

由于我只打算部署到Win10机器上,所以有一种方法可以打包它,所以我不需要所有.NET文件吗?我认为这是-r选项的用途,但似乎并没有取得太大成就。

2 个答案:

答案 0 :(得分:0)

这取决于您要如何部署应用程序/将使用它们的人。

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

如果您删除了-r标志,那么publish将仅包含适用于您应用的DLL。但这意味着任何想使用您的应用的人必须首先安装.NET Core运行时。

您可以使用-o标志将发布输出写入不同的目录,例如

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

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

现在来看一下已写入./publish-win10./publish-any文件夹的内容,您可以有所不同。

如果将它们安装到已经存在.NET Core运行时的系统上,则只需分发DLL并节省大量空间即可。但是,如果您希望能够分发应用程序而最终用户不必担心安装.NET Core运行时,则可以使用-r标志来创建一个自包含的分发程序,但是这样会导致“程序包”,包括必要的.NET Core程序集。

AFAIK -r标志不会影响您的应用程序的编译方式,只是publish命令的一部分包含哪些运行时DLL。因此,如果为win10-x64发布(无论是否带有-r标志)都可以为您的代码获得相同的DLL,以便您的应用DLL可在任何(.NET Core兼容)平台上运行,但是我很高兴在这一点上得到纠正。

答案 1 :(得分:0)

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

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

您可以将发布行更改为

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

这将单独创建.NET Core标准-一个.dll(您的应用程序),一个.exe(运行该应用程序),一些.json文件进行设置,还有一个.pdb文件用于调试符号。

要将应用程序更改为您习惯使用的.NET Framework标准输出,请在文本编辑器中的{p> 1下打开.csproj文件。

<TargetFramework>netx.x</TargetFramework>

行,添加

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

然后重新运行发布命令。这将在.exe目录(可以安全删除的.pdb文件)中产生一个publish和一个.pdb

注意:由于包含了--self-contained false,因此目标将需要安装指定版本的.NET Framework(在.csproj文件中指定的版本)。尽管大多数Windows 10设备(通常位于C:\Windows\Microsoft.NET\FrameworkC:\Program Files\dotnet\上当前都安装了.NET Framework的许多版本,但.NET Core / .NET 5运行时尚未普及(尽管可能会在不久的将来通过Windows Update分发),因此如果您的.exe的收件人没有该下载,则可能需要一次性下载。

虽然.NET Core / .NET 5生成的二进制文件更大(尽管大约为150kb-而不是50MB),但它们的运行速度却比.NET Framework 4.x同类文件要快得多。