我可以缩小 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\Framework
或 C:\Program Files\dotnet\
),但 .NET Core / .NET 5 运行时尚未很常见(虽然可能会在不久的将来通过 Windows 更新分发),因此如果您的 .exe
的收件人没有下载,可能需要 once-off 下载。
虽然 .NET Core / .NET 5 生成的二进制文件更大(虽然大约 150kb - 不是 50MB),但它们 运行 比它们的 .NET Framework 4.x 对应版本快得多。
我最近开始使用 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\Framework
或 C:\Program Files\dotnet\
),但 .NET Core / .NET 5 运行时尚未很常见(虽然可能会在不久的将来通过 Windows 更新分发),因此如果您的 .exe
的收件人没有下载,可能需要 once-off 下载。
虽然 .NET Core / .NET 5 生成的二进制文件更大(虽然大约 150kb - 不是 50MB),但它们 运行 比它们的 .NET Framework 4.x 对应版本快得多。