dotnet publish

本文适用于: ✔️ .NET Core 3.1 SDK 及更高版本

“属性”

dotnet publish - 将应用程序及其依赖项发布到文件夹以部署到托管系统。

摘要

dotnet publish [<PROJECT>|<SOLUTION>] [-a|--arch <ARCHITECTURE>]
    [-c|--configuration <CONFIGURATION>] [--disable-build-servers]
    [-f|--framework <FRAMEWORK>] [--force] [--interactive]
    [--manifest <PATH_TO_MANIFEST_FILE>] [--no-build] [--no-dependencies]
    [--no-restore] [--nologo] [-o|--output <OUTPUT_DIRECTORY>]
    [--os <OS>] [-r|--runtime <RUNTIME_IDENTIFIER>]
    [--sc|--self-contained [true|false]] [--no-self-contained]
    [-s|--source <SOURCE>] [--tl:[auto|on|off]]
    [--use-current-runtime, --ucr [true|false]]
    [-v|--verbosity <LEVEL>] [--version-suffix <VERSION_SUFFIX>]

dotnet publish -h|--help

描述

dotnet publish 编译应用程序、读取 project 文件中指定的所有依赖项并将生成的文件集发布到目录。 输出包括以下资产:

  • 扩展名为 dll 的程序集中的中间语言 (IL) 代码。
  • 包含项目所有依赖项的 .deps.json 文件。
  • .runtimeconfig.json 文件,其中指定了应用程序所需的共享运行时,以及运行时的其他配置选项(例如垃圾回收类型)。
  • 应用程序的依赖项,将这些依赖项从 NuGet 缓存复制到输出文件夹。

dotnet publish 命令的输出可供部署至托管系统(例如服务器、电脑、Mac、笔记本电脑)以便执行。 若要准备用于部署的应用程序,这是唯一正式受支持的方法。 根据项目指定的部署类型,托管系统不一定已在其上安装 .NET 共享运行时。 有关详细信息,请参阅使用 .NET CLI 发布 .NET 应用

隐式还原

无需运行 dotnet restore,因为它由所有需要还原的命令隐式运行,如 dotnet newdotnet builddotnet rundotnet testdotnet publishdotnet pack。 若要禁用隐式还原,请使用 --no-restore 选项。

在执行显式还原有意义的某些情况下,例如 dotnet restore中,或在需要显式控制还原发生时间的生成系统中,dotnet restore 命令仍然有用。

有关如何使用 NuGet 源的信息,请参阅 dotnet restore 文档

MSBuild

dotnet publish 命令调用 MSBuild,后者会调用 Publish 目标。 如果特定项目的 IsPublishable 属性设置为 false,则无法调用 Publish 目标,并且 dotnet publish 命令仅在项目上运行隐式 dotnet restore

任何传递给 dotnet publish 的参数都将传递给 MSBuild。 -c-o 参数分别映射到 MSBuild 的 ConfigurationPublishDir 属性。

dotnet publish 命令接受 MSBuild 选项,如用来设置属性的 -p 和用来定义记录器的 -l。 例如,可以使用以下格式设置 MSBuild 属性:-p:<NAME>=<VALUE>

.pubxml 文件

还可以通过引用 .pubxml 文件来设置与发布相关的属性。 例如:

dotnet publish -p:PublishProfile=FolderProfile

前面的示例使用 <project_folder>/Properties/PublishProfiles 文件夹中的 FolderProfile.pubxml 文件。 如果在设置 PublishProfile 属性时指定路径和文件扩展名,则它们会被忽略。 默认情况下,MSBuild 会在 Properties/PublishProfiles 文件夹中查找,并假定 .pubxml 文件扩展名。 若要指定包含扩展名的路径和文件名,请设置 PublishProfileFullPath 属性,而不是 PublishProfile 属性。

.pubxml 文件中:

  • PublishUrl 由 Visual Studio 用来表示发布目标。
  • CLI 使用 PublishDir 表示发布目标。

如果希望方案在所有位置都可用,可以将这两个属性初始化为 .pubxml 文件中的相同值。 解决 GitHub 问题 dotnet/sdk#20931 时,只需设置其中一个属性。

.pubxml 文件中的某些属性仅受 Visual Studio 使用,对 dotnet publish 没有影响。 我们正在努力使 CLI 与 Visual Studio 的行为更加一致。 但 CLI 永远不会使用某些属性。 CLI 和 Visual Studio 都执行发布的打包方面,dotnet/sdk#29817 计划添加对更多与此相关的属性的支持。 但 CLI 不执行发布时部署自动化方面的操作,与此相关的属性不受支持。 不支持的最值得注意的 .pubxmldotnet publish 属性是影响生成的以下属性:

  • LastUsedBuildConfiguration
  • Configuration
  • Platform
  • LastUsedPlatform
  • TargetFramework
  • TargetFrameworks
  • RuntimeIdentifier
  • RuntimeIdentifiers

MSBuild 属性

以下 MSBuild 属性更改 dotnet publish 的输出。

  • PublishReadyToRun

    以 ReadyToRun (R2R) 格式编译应用程序集。 R2R 是一种预先 (AOT) 编译形式。 有关详细信息,请参阅 ReadyToRun 图像

    若要查看有关缺少的依赖项可能导致运行时失败的警告,请使用 PublishReadyToRunShowWarnings=true

    建议在发布配置文件中而不是在命令行中指定 PublishReadyToRun

  • PublishSingleFile

    将应用打包到特定于平台的单个文件可执行文件中。 有关单文件发布的详细信息,请参阅单文件捆绑程序设计文档

    建议在项目文件中而不是在命令行中指定此选项。

  • PublishTrimmed

    在发布自包含的可执行文件时,剪裁未使用的库以减小应用的部署大小。 有关详细信息,请参阅剪裁自包含部署和可执行文件。 自 .NET 6 SDK 起可用。

    建议在项目文件中而不是在命令行中指定此选项。

有关更多信息,请参见以下资源:

工作负载清单下载

运行此命令时,它将为工作负载启动播发清单的异步后台下载。 如果此命令完成后,下载仍在运行,则将停止下载。 有关详细信息,请参阅播发清单

自变量

  • PROJECT|SOLUTION

    要发布的项目或解决方案。

    • PROJECT 是 C#、F# 或 Visual Basic 项目文件的路径和文件名,或包含 C#、F# 或 Visual Basic 项目文件的目录的路径。 如果未指定目录,则默认为当前目录。

    • SOLUTION 是解决方案文件(扩展名为 .sln)的路径和文件名,或包含解决方案文件的目录的路径。 如果未指定目录,则默认为当前目录。

选项

  • -a|--arch <ARCHITECTURE>

    指定目标体系结构。 这是用于设置运行时标识符 (RID) 的简写语法,其中提供的值与默认 RID 相结合。 例如,在 win-x64 计算机上,指定 --arch x86 会将 RID 设置为 win-x86。 如果使用此选项,请不要使用 -r|--runtime 选项。 从 .NET 6 Preview 7 开始提供。

  • -c|--configuration <CONFIGURATION>

    定义生成配置。 如果要使用 .NET 8 SDK 或更高版本进行开发,则默认情况下,该命令对 TargetFramework 设置为net8.0或更高版本的项目使用Release配置。 默认生成配置适用于 Debug 早期版本的 SDK 和早期目标框架。 可以在项目设置中替代默认值,也可以使用此选项替代默认值。 有关详细信息,请参阅 “dotnet publish”使用发布配置“dotnet pack”使用发布配置

  • --disable-build-servers

    强制运行命令以忽略任何永久性生成服务器。 此选项提供一种一致的方法来禁止对生成缓存的所有使用,这会强制从头开始生成。 当缓存可能由于某种原因而损坏或不正确时,不依赖缓存的生成非常有用。 自 .NET 7 SDK 起可用。

  • -f|--framework <FRAMEWORK>

    为指定的目标框架发布应用程序。 必须在项目文件中指定目标框架。

  • --force

    强制解析所有依赖项,即使上次还原已成功,也不例外。 指定此标记等同于删除 project.assets.json 文件。

  • -?|-h|--help

    打印出有关如何使用命令的说明。

  • --interactive

    允许命令停止并等待用户输入或操作。 例如,完成身份验证。 自 .NET Core 3.0 SDK 起可用。

  • --manifest <PATH_TO_MANIFEST_FILE>

    指定一个或多个目标清单,用于剪裁与应用程序一同发布的一组包。 清单文件是 dotnet store 命令输出的一部分。 若要指定多个清单,请为每个清单添加一个 --manifest 选项。

  • --no-build

    发布前不生成项目。 还将隐式设置 --no-restore 标记。

  • --no-dependencies

    忽略项目间引用,仅还原根项目。

  • --nologo

    不显示启动版权标志或版权消息。

  • --no-restore

    运行此命令时不执行隐式还原。

  • -o|--output <OUTPUT_DIRECTORY>

    指定输出目录的路径。

    如果未指定,则默认为依赖框架的可执行文件和跨平台二进制文件的路径 [project_file_folder]/bin/[configuration]/[framework]/publish/。 默认为独立的可执行文件路径 [project_file_folder]/bin/[configuration]/[framework]/[runtime]/publish/。

    在 Web 项目中,如果输出文件夹位于项目文件夹,则连续的 dotnet publish 命令将产生嵌套的输出文件夹。 例如,如果项目文件夹是“myproject”,发布输出文件夹是“myproject/publish”,并且运行 dotnet publish 两次,则第二次运行会将“.config”和“.json”等内容文件放入“myproject/publish/publish” 。 若要避免嵌套发布文件夹,请指定一个不在项目文件夹下方的发布文件夹,或从项目中排除发布文件夹。 若要排除名为“publishoutput”的发布文件夹,请将以下元素添加到“.csproj”文件中的 PropertyGroup 元素中 :

    <DefaultItemExcludes>$(DefaultItemExcludes);publishoutput**</DefaultItemExcludes>
    
    • .NET 7.0.200 SDK 及更高版本

      如果在解决方案中运行此命令时指定 --output 选项,则 CLI 将因输出路径的语义不明确而发出警告(7.0.200 中的一个错误)。 不允许 --output 选项,因为所有生成项目的所有输出都将复制到指定的目录中,该目录与多目标项目以及具有不同版本的直接和可传递依赖项的项目不兼容。 有关详细信息,请参阅解决方案级 --output 选项不再对生成相关命令有效

    • .NET Core 3.x SDK 和更高版本

      如果在发布项目时指定相对路径,则生成的输出目录相对于当前工作目录,而不是项目文件位置。

      如果在发布解决方案时指定相对路径,则所有项目的所有输出都会进入相对于当前工作目录的指定文件夹中。 若要使发布输出进入每个项目的单独文件夹,请使用 msbuild PublishDir 属性(而不是 --output 选项)指定相对路径。 例如,dotnet publish -p:PublishDir=.\publish 将每个项目的发布输出发送到包含项目文件的文件夹下的 publish 文件夹中。

    • .NET Core 2.x SDK

      如果在发布项目时指定相对路径,则生成的输出目录相对于项目文件位置,而不是当前工作目录。

      如果在发布解决方案时指定相对路径,则每个项目的输出会进入相对于项目文件位置的单独文件夹中。 如果在发布解决方案时指定绝对路径,则所有项目的所有发布输出都会进入指定文件夹中。

  • --os <OS>

    指定目标操作系统 (OS)。 这是用于设置运行时标识符 (RID) 的简写语法,其中提供的值与默认 RID 相结合。 例如,在 win-x64 计算机上,指定 --os linux 会将 RID 设置为 linux-x64。 如果使用此选项,请不要使用 -r|--runtime 选项。 自 .NET 6 之后可用。

  • --sc|--self-contained [true|false]

    .NET 运行时随应用程序一同发布,因此无需在目标计算机上安装运行时。 如果指定了运行时标识符,并且项目是可执行项目(而不是库项目),则默认值为 true。 有关详细信息,请参阅 .NET 应用程序发布使用 .NET CLI 发布 .NET 应用

    如果在未指定 truefalse 的情况下使用此选项,则默认值为 true。 在这种情况下,请不要紧接在 --self-contained 后放置解决方案或项目参数,因为该位置需要 truefalse

  • --no-self-contained

    等效于 --self-contained false

  • --source <SOURCE>

    要在还原操作期间使用的 NuGet 包源的 URI。

  • -r|--runtime <RUNTIME_IDENTIFIER>

    发布针对给定运行时的应用程序。 有关运行时标识符 (RID) 的列表,请参阅 RID 目录。 有关详细信息,请参阅 .NET 应用程序发布使用 .NET CLI 发布 .NET 应用。 如果使用此选项,则还要使用 --self-contained--no-self-contained

  • --tl:[auto|on|off]

    指定是否应将终端记录器用于生成输出。 默认值为 auto,它首先验证环境,然后再启用终端日志记录。 在启用新的记录器之前,环境检查会验证终端能否使用新式输出功能,并且不使用重定向的标准输出。 on 跳过环境检查并启用终端日志记录。 off 跳过环境检查并使用默认控制台记录器。

    终端记录器显示还原阶段,然后显示生成阶段。 在每个阶段,当前生成项目显示在终端的底部。 每个正在生成的项目都会输出当前正在生成的 MSBuild 目标,以及在该目标上花费的时间。 可以搜索此信息以了解有关生成的详细信息。 项目生成完成后,将会编写一个“已完成生成”部分以捕获以下内容:

    • 生成项目的名称。
    • 目标框架(如果是多目标)。
    • 该生成的状态。
    • 该生成的主要输出(它设置了超链接)。
    • 为该项目生成的任何诊断。

    此选项从 .NET 8 开始可用。

  • --use-current-runtime, --ucr [true|false]

    根据计算机之一将 RuntimeIdentifier 设置为平台可移植的 RuntimeIdentifier。 需要 RuntimeIdentifier(例如 SelfContainedPublishAotPublishSelfContainedPublishSingleFilePublishReadyToRun)的属性会隐式发生这种情况。 如果该属性设置为 false,则不再发生隐式解析。

  • -v|--verbosity <LEVEL>

    设置命令的详细级别。 允许使用的值为 q[uiet]m[inimal]n[ormal]d[etailed]diag[nostic]。 默认值为 minimal。 有关详细信息,请参阅 LoggerVerbosity

  • --version-suffix <VERSION_SUFFIX>

    定义版本后缀来替换项目文件的版本字段中的星号 (*)。

示例

  • 为当前目录中的项目创建一个依赖框架的跨平台二进制文件

    dotnet publish
    

    自 .NET Core 3.0 SDK 起,此示例还为当前平台创建依赖框架的可执行文件

  • 针对特定运行时,为当前目录中的项目创建独立可执行文件

    dotnet publish --runtime osx-x64
    

    项目文件中必须包含 RID。

  • 针对特定平台,为当前目录中的项目创建依赖框架的可执行文件

    dotnet publish --runtime osx-x64 --self-contained false
    

    项目文件中必须包含 RID。 此示例适用于 .NET Core 3.0 SDK 及更高版本。

  • 针对特定运行时和目标框架,在当前目录中发布项目:

    dotnet publish --framework netcoreapp3.1 --runtime osx-x64
    
  • 发布指定的项目文件:

    dotnet publish ~/projects/app1/app1.csproj
    
  • 发布当前应用程序,但在还原操作期间不还原项目到项目 (P2P) 引用,只还原根项目:

    dotnet publish --no-dependencies
    

请参阅