本文适用于:✔️ .NET 6 SDK 及更高版本
名字
dotnet publish - 将应用程序及其依赖项发布到要部署到宿主系统的文件夹。
概要
dotnet publish [<PROJECT>|<SOLUTION>|<FILE>] [-a|--arch <ARCHITECTURE>]
[--artifacts-path <ARTIFACTS_DIR>]
[-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] [--no-self-contained]
[-s|--source <SOURCE>] [--tl:[auto|on|off]]
[--ucr|--use-current-runtime]
[-v|--verbosity <LEVEL>] [--version-suffix <VERSION_SUFFIX>]
dotnet publish -h|--help
描述
dotnet publish 编译应用程序,读取项目文件中指定的依赖项,并将生成的文件集发布到目录。 输出包括以下资产:
- 具有 dll 扩展的程序集中的中间语言 (IL) 代码。
- 包含项目的所有依赖项的 .deps.json 文件。
- 一个 .runtimeconfig.json 文件,指定应用程序所需的共享运行时,以及运行时的其他配置选项(例如垃圾回收类型)。
- 应用程序的依赖项(从 NuGet 缓存复制到输出文件夹中)。
dotnet publish 命令的输出已准备好部署到托管系统(例如服务器、电脑、Mac、笔记本电脑),以便执行。 这是准备应用程序进行部署的唯一正式支持方法。 根据项目指定的部署类型,宿主系统可能或可能未安装 .NET 共享运行时。 有关详细信息,请参阅 .NET 应用程序发布概述。
隐式还原
无需运行 dotnet restore,因为它由需要还原的所有命令隐式运行,例如 dotnet new、dotnet build、dotnet run、dotnet test、dotnet publish和 dotnet pack。 若要禁用隐式还原,请使用 --no-restore 选项。
有关如何管理 NuGet 源的信息,请参阅 dotnet restore 文档。
MSBuild
dotnet publish 命令调用 MSBuild,该 MSBuild 调用 Publish 目标。 如果 IsPublishable 属性 设置为特定项目的 false,则无法调用 Publish 目标,dotnet publish 命令仅对项目运行隐式 dotnet 还原。
传递给 dotnet publish 的任何参数都传递给 MSBuild。
-c 和 -o 参数分别映射到 MSBuild 的 Configuration 和 PublishDir 属性。
dotnet publish 命令接受 MSBuild 选项,例如用于设置属性和 -p 来定义记录器 -l。 例如,可以使用以下格式设置 MSBuild 属性:-p:<NAME>=<VALUE>。
.pubxml 文件
还可以通过引用 .pubxml 文件来设置与发布相关的属性。 例如:
dotnet publish -p:PublishProfile=FolderProfile
前面的示例使用 文件夹中找到的 < 文件。 如果在设置 PublishProfile 属性时指定路径和文件扩展名,则忽略它们。 MSBuild 默认在 Properties/PublishProfiles 文件夹中查找,并假定 pubxml 文件扩展名。 若要指定路径和文件名(包括扩展名),请设置 PublishProfileFullPath 属性而不是 PublishProfile 属性。
在 .pubxml 文件中:
- Visual Studio 使用
PublishUrl来表示发布目标。 - CLI 使用
PublishDir来表示发布目标。
如果希望方案在所有位置都正常工作,可以将这两个属性初始化为 .pubxml 文件中的相同值。 当 GitHub 问题 dotnet/sdk#20931 得到解决时,只需设置其中一个属性。
.pubxml 文件中的某些属性仅受 Visual Studio 的尊重,对 dotnet publish没有任何影响。 我们正在努力使 CLI 更符合 Visual Studio 的行为。 但 CLI 永远不会使用某些属性。 CLI 和 Visual Studio 都执行发布方面的打包,dotnet/sdk#29817 计划添加对与此相关的更多属性的支持。 但 CLI 不执行发布部署自动化方面的操作,也不支持与发布相关的属性。
不支持的最引人注目的 dotnet publish 属性是影响生成的以下属性:
LastUsedBuildConfigurationConfigurationPlatformLastUsedPlatformTargetFrameworkTargetFrameworksRuntimeIdentifierRuntimeIdentifiers
MSBuild 属性
以下 MSBuild 属性更改 dotnet publish的输出。
PublishReadyToRun将应用程序程序集编译为 ReadyToRun (R2R) 格式。 R2R 是预先编译(AOT)的一种形式。 有关详细信息,请参阅 ReadyToRun 映像。
若要查看有关可能导致运行时故障的缺少依赖项的警告,请使用
PublishReadyToRunShowWarnings=true。建议在发布配置文件而不是命令行中指定
PublishReadyToRun。PublishSingleFile将应用打包到特定于平台的单文件可执行文件中。 有关单文件发布的详细信息,请参阅 单文件捆绑程序设计文档。 当此属性设置为
true时,该PublishSelfContained属性将隐式设置为true。建议在项目文件中指定此选项,而不是在命令行中指定此选项。
PublishTrimmed剪裁未使用的库,以减少发布自包含可执行文件时应用的部署大小。 有关详细信息,请参阅 剪裁独立部署和可执行文件。 自 .NET 6 SDK 起可用。
建议在项目文件中指定此选项,而不是在命令行中指定此选项。
有关详细信息,请参阅以下资源:
工作负荷清单下载
运行此命令时,它会启动工作负荷广告清单的异步后台下载。 如果此命令完成时下载仍在运行,则下载将停止。 有关详细信息,请参阅 广告清单。
参数
PROJECT | SOLUTION | FILE
要作的项目或解决方案或 C# (基于文件的应用)文件。 如果未指定文件,MSBuild 将在当前目录中搜索项目或解决方案。
PROJECT是 C#、F# 或 Visual Basic 项目文件的路径和文件名,或者是包含 C#、F# 或 Visual Basic 项目文件的目录的路径。SOLUTION是解决方案文件的路径和文件名(.sln 或 .slnx 扩展名),或包含解决方案文件的目录的路径。FILE是 .NET 10 中添加的参数。 基于文件的应用的路径和文件名。 基于文件的应用包含在没有相应项目 (.csproj) 文件的单个文件中生成和运行。 有关详细信息,请参阅 生成基于文件的 C# 应用。
选项
-a|--arch <ARCHITECTURE>指定目标体系结构。 这是一种简写语法,用于设置 运行时标识符(RID),其中提供的值与默认 RID 结合使用。 例如,在
win-x64计算机上,指定--arch x86将 RID 设置为win-x86。 如果使用此选项,请不要使用-r|--runtime选项。 自 .NET 6 预览版 7 起可用。
--artifacts-path <ARTIFACTS_DIR>执行命令中的所有生成输出文件都将位于指定路径下的子文件夹中,由项目分隔。 有关详细信息,请参阅 项目输出布局。 自 .NET 8 SDK 起可用。
-c|--configuration <CONFIGURATION>定义生成配置。 如果使用 .NET 8 SDK 或更高版本进行开发,则默认情况下,该命令对 TargetFramework 设置为
Release或更高版本的项目使用net8.0配置。 对于早期版本的 SDK 和早期目标框架,默认生成配置Debug。 可以在项目设置中替代默认值,也可以使用此选项替代默认值。 有关详细信息,请参阅 “dotnet publish”使用发布配置,“dotnet pack”使用发布配置。
--disable-build-servers强制命令忽略任何持久性生成服务器。 此选项提供了一种一致的方式来禁用所有生成缓存的使用,这会强制从头开始生成。 由于某种原因,缓存可能损坏或不正确时,不依赖于缓存的生成非常有用。 自 .NET 7 SDK 起可用。
-f|--framework <FRAMEWORK>发布指定 目标框架的应用程序。 必须在项目文件中指定目标框架。
--force强制解析所有依赖项,即使上次还原成功也是如此。 指定此标志与删除 project.assets.json 文件相同。
--interactive允许命令停止并等待用户输入或操作。 例如,若要完成身份验证。
--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 文件中元素: <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文件夹。
--os <OS>指定目标操作系统(OS)。 这是一种简写语法,用于设置 运行时标识符(RID),其中提供的值与默认 RID 结合使用。 例如,在
win-x64计算机上,指定--os linux将 RID 设置为linux-x64。 如果使用此选项,请不要使用-r|--runtime选项。 自 .NET 6 起可用。
--sc|--self-contained使用应用程序发布 .NET 运行时,以便不需要在目标计算机上安装运行时。 默认值为
true。
--no-self-contained等效于
--self-contained false。
--source <SOURCE>还原操作期间要使用的 NuGet 包源的 URI。
-r|--runtime <RUNTIME_IDENTIFIER>发布给定运行时的应用程序。 有关运行时标识符(RID)的列表,请参阅 RID 目录。 有关详细信息,请参阅 .NET 应用程序发布概述。 如果使用此选项,请使用
--self-contained或--no-self-contained。
--tl:[auto|on|off]指定是否应将 终端记录器 用于生成输出。 默认值为
auto,在启用终端日志记录之前先验证环境。 环境检查验证终端是否能够使用新式输出功能,并且未在启用新记录器之前使用重定向的标准输出。on跳过环境检查并启用终端日志记录。off跳过环境检查并使用默认控制台记录器。终端记录器显示还原阶段,后跟生成阶段。 在每个阶段,当前生成项目显示在终端底部。 生成的每个项目都会输出当前正在生成的 MSBuild 目标以及该目标花费的时间量。 可以搜索此信息,了解有关生成的详细信息。 完成项目生成后,将编写一个捕获的“生成已完成”部分:
- 生成项目的名称。
- 目标框架(如果多目标)。
- 该生成的状态。
- 该生成的主要输出(已超链接)。
- 为该项目生成的任何诊断。
此选项从 .NET 8 开始可用。
--ucr|--use-current-runtime将当前运行时用作目标运行时。
-v|--verbosity <LEVEL>设置命令的详细级别。 允许的值为
q[uiet]、m[inimal]、n[ormal]、d[etailed]和diag[nostic]。 默认值为minimal。 有关详细信息,请参阅 LoggerVerbosity。
--version-suffix <VERSION_SUFFIX>定义版本后缀以替换项目文件的版本字段中的星号(
*)。
-?|-h|--help输出有关如何使用命令的说明。
例子
为当前目录中的项目创建 依赖于框架的跨平台二进制:
dotnet publish从 .NET Core 3.0 SDK 开始,此示例还会为当前平台创建 依赖框架的可执行文件。
为当前目录中的项目创建 自包含可执行文件,用于特定运行时:
dotnet publish --runtime osx-x64RID 必须位于项目文件中。
为当前目录中的项目创建 依赖框架的可执行文件,用于特定平台:
dotnet publish --runtime osx-x64 --self-contained falseRID 必须位于项目文件中。 此示例适用于 .NET Core 3.0 SDK 及更高版本。
在特定运行时和目标框架的当前目录中发布项目:
dotnet publish --framework net8.0 --runtime osx-x64发布指定的项目文件:
dotnet publish ~/projects/app1/app1.csproj发布当前应用程序,但不还原项目到项目(P2P)引用,只是还原操作期间的根项目:
dotnet publish --no-dependencies在当前目录中发布基于文件的 C# 程序 app.cs :
dotnet publish app.cs.NET SDK 10.0.100 中添加了基于文件的程序支持。