使用 CLI 发布 .NET Core 应用Publish .NET Core apps with the CLI

本文内容

本文演示了如何使用命令行发布 .NET Core 应用程序。.NET Core 提供了三种发布应用程序的方式。依赖于框架的部署生成一个跨平台 .dll 文件,该文件使用本地安装的 .NET Core 运行时。依赖于框架的可执行文件生成特定于平台的可执行文件,后者使用本地安装的 .NET Core 运行时。独立可执行文件生成特定于平台的可执行文件,并包含 .NET Core 运行时的本地副本。

请参阅 .NET Core 应用程序部署了解有关这些发布模式的概述。

正在查找有关 CLI 的快速帮助?下表列出了一些关于如何发布应用的示例。可以使用 -f <TFM> 参数或通过编辑项目文件来指定目标框架。有关详细信息,请参阅发布基本知识

发布模式SDK 版本命令
依赖框架的部署2.xdotnet publish -c Release
依赖于框架的可执行文件2.2dotnet publish -c Release -r <RID> —self-contained false
3.0dotnet publish -c Release -r <RID> —self-contained false
3.0*dotnet publish -c Release
独立部署2.1dotnet publish -c Release -r <RID> —self-contained true
2.2dotnet publish -c Release -r <RID> —self-contained true
3.0dotnet publish -c Release -r <RID> —self-contained true

* 使用 SDK 版本 3.0 时,框架依赖可执行文件是运行基本 dotnet publish 命令时的默认发布模式。仅当项目定目标到 .NET Core 2.1 或 .NET Core 3.0 时,这才适用。

发布基本知识Publishing basics

发布应用时,项目文件的 <TargetFramework> 设置指定默认目标框架。可以将目标框架更改为任意有效目标框架名字对象 (TFM)例如,如果项目使用 <TargetFramework>netcoreapp2.2</TargetFramework>,则会创建面向 .NET Core 2.2 的二进制文件。此设置中指定的 TFM 是dotnet publish 命令使用的默认目标。

如果要以多个框架为目标,可以将 <TargetFrameworks> 设置设置为多个以分号分隔的 TFM 值。可以使用 dotnet publish -f <TFM> 命令发布其中一个框架。例如,如果有 <TargetFrameworks>netcoreapp2.1;netcoreapp2.2</TargetFrameworks> 并运行 dotnet publish -f netcoreapp2.1,则会创建面向 .NET Core 2.1 的二进制文件。

除非另有设置,否则 dotnet publish 命令的输出目录为 ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/除非使用 -c 参数进行更改,否则默认的 BUILD-CONFIGURATION 模式为 Debug 。例如,dotnet publish -c Release -f netcoreapp2.1 发布到 myfolder/bin/Release/netcoreapp2.1/publish/

如果使用 .NET Core SDK 3.0,则面向 .NET Core 版本 2.1、2.2 或 3.0 的应用的默认发布模式为依赖于框架的可执行文件。

如果使用 .NET Core SDK 2.1,则面向 .NET Core 版本 2.1、2.2 的应用的默认发布模式为依赖于框架的部署。

本机依赖项Native dependencies

如果应用具有本机依赖项,则只能在相同操作系统上运行。例如,如果应用使用本机 Windows API,则不能在 macOS 或 Linux 上运行。需要提供特定于平台的代码并为每个平台编译可执行文件。

另外,如果引用的库具有本机依赖项,则应用可能无法在每个平台上运行。但是,引用的 NuGet 包可能包含特定于平台的版本,以便处理所需的本机依赖项。

使用本机依赖项分发应用时,可能需要使用 dotnet publish -r <RID> 开关来指定想要发布的目标平台。有关运行时标识符的详细信息,请参阅运行时标识符 (RID) 目录

有关特定于平台的二进制文件的详细信息,请参阅依赖于框架的可执行文件独立部署部分。

示例应用Sample app

可使用以下应用来探索发布命令。通过在终端中运行以下命令来创建应用:

  1. mkdir apptest1
  2. cd apptest1
  3. dotnet new console
  4. dotnet add package Figgle

控制台模板生成的 Program.csProgram.vb 文件需要进行以下更改:

  1. using System;
  2. namespace apptest1
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"));
  9. }
  10. }
  11. }
  1. Imports System
  2. Module Program
  3. Sub Main(args As String())
  4. Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"))
  5. End Sub
  6. End Module

运行应用 (dotnet run) 时,将显示以下输出:

  1. _ _ _ _ __ __ _ _ _
  2. | | | | ___| | | ___ \ \ / /__ _ __| | __| | |
  3. | |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
  4. | _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
  5. |_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_)
  6. |/

依赖框架的部署Framework-dependent deployment

对于 .NET Core SDK 2.x CLI,依赖于框架的部署 (FDD) 是基本 dotnet publish 命令的默认模式。

将应用作为 FDD 发布时,会在 ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/ 文件夹中创建 <PROJECT-NAME>.dll 文件。若要运行应用,请导航到输出文件夹并使用 dotnet <PROJECT-NAME>.dll 命令。

应用配置为面向 .NET Core 的特定版本。目标 .NET Core 运行时需要位于要运行应用程序的计算机上。例如,如果应用面向 .NET Core 2.2,则运行应用的任何计算机都必须已安装 .NET Core 2.2 运行时。发布基础知识部分中所述,可以编辑项目文件为更改默认目标框架或面向多个框架。

发布 FDD 会创建一个应用,该应用会自动前滚到运行该应用的系统上可用的最新 .NET Core 安全修补程序。有关编译时的版本绑定的详细信息,请参阅选择要使用的 .NET Core 版本

依赖于框架的可执行文件Framework-dependent executable

对于 .NET Core SDK 3.x CLI,依赖于框架的可执行文件 (FDE) 是基本 dotnet publish 命令的默认模式。只要想要面向当前操作系统,就不需要指定任何其他参数。

在此模式下,将创建特定于平台的可执行主机来托管跨平台应用。此模式类似于 FDD,因为 FDD 需要 dotnet 命令形式的主机。每个平台的主机可执行文件名各不相同,其文件名类似于 <PROJECT-FILE>.exe可以直接运行此可执行文件,而不是调用 dotnet <PROJECT-FILE>.dll,这仍然是运行应用的可接受方式。

应用配置为面向 .NET Core 的特定版本。目标 .NET Core 运行时需要位于要运行应用程序的计算机上。例如,如果应用面向 .NET Core 2.2,则运行应用的任何计算机都必须已安装 .NET Core 2.2 运行时。发布基础知识部分中所述,可以编辑项目文件为更改默认目标框架或面向多个框架。

发布 FDE 会创建一个应用,该应用会自动前滚到运行该应用的系统上可用的最新 .NET Core 安全修补程序。有关编译时的版本绑定的详细信息,请参阅选择要使用的 .NET Core 版本

必须通过 dotnet publish 命令使用以下开关来发布 FDE(面向当前平台时,.NET Core 3.x 除外):

  • -r <RID> 此开关使用标识符 (RID) 来指定目标平台。有关运行时标识符的详细信息,请参阅运行时标识符 (RID) 目录

  • —self-contained false 此开关告知 .NET Core SDK 创建可执行文件作为 FDE。

每次使用 -r 开关时,输出文件路都将更改为:./bin/<BUILD-CONFIGURATION>/<TFM>/<RID>/publish/

如果使用示例应用,请运行 dotnet publish -f netcoreapp2.2 -r win10-x64 —self-contained false此命令将创建以下可执行文件:./bin/Debug/netcoreapp2.2/win10-x64/publish/apptest1.exe

备注

可以通过启用全局固定模式来降低部署的总大小 。此模式适用于不具有全局意识且可以使用固定区域性的格式约定、大小写约定以及字符串比较和排序顺序的应用程序。有关全局固定模式及其启用方式的详细信息,请参阅 .NET Core 全局固定模式

独立部署Self-contained deployment

发布独立部署 (SCD) 时,.NET Core SDK 创建特定于平台的可执行文件。发布 SCD 时会包括运行应用所需的所有 .NET Core 文件,但不包含 .NET Core 的本机依赖项这些依赖项必须在应用运行前存在于系统中。

发布 SCD 会创建一个不会前滚到最新可用 .NET Core 安全修补程序的应用。有关编译时的版本绑定的详细信息,请参阅选择要使用的 .NET Core 版本

必须通过 dotnet publish 命令使用以下开关来发布 SCD:

  • -r <RID> 此开关使用标识符 (RID) 来指定目标平台。有关运行时标识符的详细信息,请参阅运行时标识符 (RID) 目录

  • —self-contained true 此开关告知 .NET Core SDK 创建可执行文件作为 SCD。

备注

可以通过启用全局固定模式来降低部署的总大小 。此模式适用于不具有全局意识且可以使用固定区域性的格式约定、大小写约定以及字符串比较和排序顺序的应用程序。有关全局固定模式及其启用方式的详细信息,请参阅 .NET Core 全局固定模式

请参阅See also