使用 .NET CLI 發佈 .NET 應用程式

本文會示範如何從命令列發佈 .NET 應用程式。 .NET 提供三種方式來發佈您的應用程式。 與 Framework 相依的部署會產生使用本機安裝的 .NET 執行時間的跨平臺 .dll 檔案。 Framework 相依可執行檔會產生平臺特定的可執行檔,其使用本機安裝的 .NET 執行時間。 獨立可執行檔會產生平臺特定的可執行檔,並包含 .NET 執行時間的本機複本。

如需這些發行模式的總覽,請參閱 .Net 應用程式部署

需要一些使用 CLI 的快速說明嗎? 下表顯示一些如何發佈應用程式的範例。 您可以使用 -f <TFM> 參數或藉由編輯專案檔來指定目標 Framework。 如需詳細資訊,請參閱發佈基本概念

發佈模式 SDK 版本 Command
架構相依部署 2.1 dotnet publish -c Release
3.1 dotnet publish -c Release -p:UseAppHost=false
5.0 dotnet publish -c Release -p:UseAppHost=false
6.0 dotnet publish -c Release -p:UseAppHost=false
Framework 相依可執行檔 3.1 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
5.0 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
6.0 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
獨立部署 2.1 dotnet publish -c Release -r <RID> --self-contained true
3.1 dotnet publish -c Release -r <RID> --self-contained true
5.0 dotnet publish -c Release -r <RID> --self-contained true
6.0 dotnet publish -c Release -r <RID> --self-contained true

* 使用 SDK 3.1 版 或更高版本時,執行基本 dotnet publish 命令時,與 framework 相依的可執行檔是預設的發佈模式。

注意

-c Release不需要參數。 它是為了提醒您發佈應用程式的 發行 組建。

發佈基本概念

專案檔的 <TargetFramework> 設定會指定發佈應用程式時的預設目標 Framework。 您可以將目標 Framework 變更為任何有效的目標 Framework Moniker (TFM)。 例如,如果您的專案使用 <TargetFramework>netcoreapp2.1</TargetFramework> ,則會建立以 .Net Core 2.1 為目標的二進位檔。 此設定中所指定 TFM 是 dotnet publish 命令使用的預設目標。

如果您想要以多個架構為目標,您可以將此 <TargetFrameworks> 設定設定為多個 TFM 值,並以分號分隔。 當您建立應用程式時,會為每個目標架構產生組建。 不過,當您發佈應用程式時,您必須使用 dotnet publish -f <TFM> 命令來指定目標 framework。

除非另行設定,否則 dotnet publish 命令的輸出目錄為 ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/。 除非使用 -c 參數加以變更,否則預設的組建組態模式為 [偵錯]。 例如,dotnet publish -c Release -f netcoreapp2.1 會發佈至 ./bin/Release/netcoreapp2.1/publish/

如果您使用 .NET Core SDK 3.1 或更新版本,則預設發行模式是與 framework 相依的 可執行檔

如果您使用 .NET Core SDK 2.1,預設的發佈模式會是與 framework 相依的 部署

原生相依性

如果您的應用程式具有原生相依性,它可能無法在不同的作業系統上執行。 例如,如果您的應用程式使用原生 Windows API,它就不會在 macOS 或 Linux 上執行。 您必須提供平台特定程式碼,並為每個平台編譯可執行檔。

另外,請考慮如果您參考的程式庫具有原生相依性,您的應用程式可能無法在每個平台上執行。 不過,您參考的 NuGet 套件可能包含了平台特定版本,以便為您處理必要的原生相依性。

散發具有原生相依性的應用程式時,您可能需要使用 dotnet publish -r <RID> 參數來指定想要為其發佈的目標平台。 如需執行階段識別碼清單,請參閱執行階段識別碼 (RID) 目錄

平台特定二進位檔的詳細資訊涵蓋在 Framework 相依可執行檔獨立式部署章節中。

範例應用程式

您可以使用下列應用程式來探索發佈命令。 在終端機中執行下列命令即可建立此應用程式:

mkdir apptest1
cd apptest1
dotnet new console
dotnet add package Figgle

主控台範本所產生的 Program.csProgram.vb 檔案必須變更如下:

using System;

namespace apptest1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"));
        }
    }
}
Module Program
    Sub Main(args As String())
        Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"))
    End Sub
End Module

當您執行應用程式 (dotnet run) 時,即會顯示下列輸出:

  _   _      _ _         __        __         _     _ _
 | | | | ___| | | ___    \ \      / /__  _ __| | __| | |
 | |_| |/ _ \ | |/ _ \    \ \ /\ / / _ \| '__| |/ _` | |
 |  _  |  __/ | | (_) |    \ V  V / (_) | |  | | (_| |_|
 |_| |_|\___|_|_|\___( )    \_/\_/ \___/|_|  |_|\__,_(_)
                     |/

與 Framework 相依的部署

針對 .NET Core 2.1 SDK CLI,與 framework 相依的部署 (FDD) 是基本 dotnet publish 命令的預設模式。 在較新的 Sdk 中, Framework 相依可執行檔 是預設值。

當您將應用程式發佈為 FDD 時,就會在 ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/ 資料夾中建立 <PROJECT-NAME>.dll 檔案。 若要執行您的應用程式,請巡覽至輸出資料夾,並使用 dotnet <PROJECT-NAME>.dll 命令。

您的應用程式已設定為以特定版本的 .NET 為目標。 該目標 .NET 執行時間必須在您應用程式執行所在的任何電腦上。 例如,如果您的應用程式是以 .NET Core 3.1 為目標,則您的應用程式執行所在的任何電腦都必須安裝 .NET Core 3.1 執行時間。 依照發佈基本概念一節中所述,您可以編輯專案檔來變更預設的目標 Framework,或以多個 Framework 為目標。

發佈 FDD 會建立應用程式,以自動向前復原至執行應用程式之系統上可用的最新 .NET 安全性修補程式。 如需在編譯時期進行版本系結的詳細資訊,請參閱 選取要使用的 .net 版本

發佈模式 SDK 版本 Command
與 Framework 相依的部署 2.1 dotnet publish -c Release
3.1 dotnet publish -c Release -p:UseAppHost=false
5.0 dotnet publish -c Release -p:UseAppHost=false
6.0 dotnet publish -c Release -p:UseAppHost=false

Framework 相依可執行檔

針對 .NET 5 (和 .NET Core 3.1) SDK CLI,framework 相依可執行檔 (FDE) 是基本 dotnet publish 命令的預設模式。 只要您想要將目標設為目前的作業系統,您就不需要指定任何其他參數。

在此模式中,將會建立平台特定可執行檔主機來裝載您的跨平台應用程式。 這種模式類似于 FDD,因為 FDD 需要使用命令格式 dotnet 的主機。 主機可執行檔的檔案名會因平臺而異,而且命名 <PROJECT-FILE>.exe 如下。 您可以直接執行這個可執行檔,而不是呼叫 dotnet <PROJECT-FILE>.dll ,這仍然是執行應用程式的可接受方式。

您的應用程式已設定為以特定版本的 .NET 為目標。 該目標 .NET 執行時間必須在您應用程式執行所在的任何電腦上。 例如,如果您的應用程式是以 .NET Core 3.1 為目標,則您的應用程式執行所在的任何電腦都必須安裝 .NET Core 3.1 執行時間。 依照發佈基本概念一節中所述,您可以編輯專案檔來變更預設的目標 Framework,或以多個 Framework 為目標。

發佈 FDE 會建立應用程式,以自動向前復原至執行應用程式之系統上可用的最新 .NET 安全性修補程式。 如需在編譯時期進行版本系結的詳細資訊,請參閱 選取要使用的 .net 版本

針對 .NET 2.1,您必須搭配使用下列參數與 dotnet publish 命令來發佈 FDE:

  • -r <RID> 此參數會使用識別碼 (RID) 來指定目標平台。 如需執行階段識別碼清單,請參閱執行階段識別碼 (RID) 目錄

  • --self-contained false 此參數會停用交換器的預設行為 -r ,也就是建立獨立部署 (SCD) 。 此參數會建立 FDE。

發佈模式 SDK 版本 Command
Framework 相依可執行檔 3.1 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
5.0 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
6.0 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release

只要您使用 -r 參數,輸出資料夾路徑就會變更為: ./bin/<BUILD-CONFIGURATION>/<TFM>/<RID>/publish/

如果您使用範例應用程式,請執行 dotnet publish -f net6.0 -r win10-x64 --self-contained false。 此命令會建立下列可執行檔: ./bin/Debug/net6.0/win10-x64/publish/apptest1.exe

注意

您可以啟用全域無差異模式來減少您部署的大小總計。 此模式適用於非全域應用程式,其能使用格式化慣例、大小寫慣例及字串比較,還有不因文化特性而異的排序次序。 如需 全球化 非變異模式以及如何加以啟用的詳細資訊,請參閱 .net 全球化不變模式

自封式部署

當您發行獨立部署 (SCD) 時,.NET SDK 會建立平臺特定的可執行檔。 發佈 SCD 包含執行應用程式所需的所有 .NET 檔案,但不包含 .net 的原生相依性。 在執行應用程式之前,系統上必須具有這些相依性。

發佈 SCD 所建立的應用程式不會向前復原到最新可用的 .NET 安全性修補程式。 如需在編譯時期進行版本系結的詳細資訊,請參閱 選取要使用的 .net 版本

您必須使用下列參數搭配 dotnet publish 命令來發佈 SCD:

  • -r <RID> 此參數會使用識別碼 (RID) 來指定目標平台。 如需執行階段識別碼清單,請參閱執行階段識別碼 (RID) 目錄

  • --self-contained true 此參數會告知 .NET SDK 將可執行檔建立為 SCD。

發佈模式 SDK 版本 Command
自封式部署 2.1 dotnet publish -c Release -r <RID> --self-contained true
3.1 dotnet publish -c Release -r <RID> --self-contained true
5.0 dotnet publish -c Release -r <RID> --self-contained true
6.0 dotnet publish -c Release -r <RID> --self-contained true

提示

在 .NET 6 中,您可以藉由 發佈來減少相容獨立應用程式的總大小。 這可讓修剪器移除架構的元件,以及不在任何程式碼路徑上或在 執行時間反映中可能參考的參考元件。 請參閱 修剪不相容 性,以判斷修剪對您的應用程式是否有意義。

注意

您可以啟用全域無差異模式來減少您部署的大小總計。 此模式適用於非全域應用程式,其能使用格式化慣例、大小寫慣例及字串比較,還有不因文化特性而異的排序次序。 如需 全球化 非變異模式以及如何加以啟用的詳細資訊,請參閱 .Net Core 全球化不變模式

另請參閱