分享方式:


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

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

如需這些發佈模式的概觀,請參閱 .NET 應用程式部署

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

發佈模式 Command
架構相依部署 dotnet publish -c Release -p:UseAppHost=false
Framework 相依可執行檔 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
自封式部署 dotnet publish -c Release -r <RID> --self-contained true

注意

  • -c Release 參數不需要。 系統會以提醒您發佈應用程式的發佈組建。
  • .NET SDK 3.1 或更新版本中,架構相依可執行檔是執行基本 dotnet publish 命令時的預設發佈模式。

發佈基本概念

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

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

除非使用 -c 參數加以變更,否則預設的組建組態模式為 [偵錯]

dotnet publish 命令的預設輸出目錄是 ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/。 例如,dotnet publish -c Release -f net8.0 會發佈至 ./bin/Release/net8.0/publish/。 不過,您可以針對所有組建輸出選擇加入簡易輸出路逕和資料夾結構。 如需詳細資訊,請參閱成品輸出配置

原生相依性

如果您的應用程式具有原生相依性,它可能無法在不同的作業系統上執行。 例如,如果您的應用程式使用原生 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 / (_) | |  | | (_| |_|
 |_| |_|\___|_|_|\___( )    \_/\_/ \___/|_|  |_|\__,_(_)
                     |/

架構相依部署

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

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

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

發佈模式 Command
架構相依部署 dotnet publish -c Release -p:UseAppHost=false

Framework 相依可執行檔

Framework 相依可執行檔 (FDE) 是基本 dotnet publish 命令的預設模式。 只要您想要以目前的作業系統為目標,就不需要指定任何其他參數。

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

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

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

發佈模式 Command
Framework 相依可執行檔 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 win-x64 --self-contained false。 此命令會建立下列可執行檔: ./bin/Debug/net6.0/win-x64/publish/apptest1.exe

注意

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

設定 .NET 安裝搜尋行為

在 .NET 9 和更新版本中,您可以透過 AppHostDotNetSearchAppHostRelativeDotNet 屬性來設定已發行的可執行檔的 .NET 安裝搜尋路徑。

AppHostDotNetSearch 允許指定可執行檔尋找 .NET 安裝的一個或多個位置:

  • AppLocal:應用程式可執行檔的資料夾
  • AppRelative:相對於應用程式可執行檔的路徑
  • EnvironmentVariablesDOTNET_ROOT[_<arch>] 環境變數的值
  • Global已註冊的預設的全域安裝位置

AppHostRelativeDotNet 會指定當 AppHostDotNetSearch 包含 AppRelative 時會搜尋的相對於可執行檔的路徑。

如需詳細資訊,請參閱AppHostDotNetSearchAppHostRelativeDotNetapphost 中的安裝位置選項

自封式部署

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

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

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

  • -r <RID>

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

  • --self-contained true

    此參數會指示 .NET SDK 將可執行檔建立為 SCD。

發佈模式 Command
自封式部署 dotnet publish -c Release -r <RID> --self-contained true

提示

  • 在 .NET 6 和更新版本中,您可以藉由發佈修剪來減少相容獨立應用程式的總大小。 這可讓修剪器移除不在任何程式碼路徑或執行階段反映中可能參考架構和參考組件的元件。 請參閱修剪不相容性,以判斷修剪是否適合您的應用程式。
  • 您可以啟用全域無差異模式來減少您部署的大小總計。 此模式適用於非全域應用程式,其能使用格式化慣例、大小寫慣例及字串比較,還有不因文化特性而異的排序次序。 如需全域無差異模式和如何啟用的詳細資訊,請參閱 .NET Core 全域無差異模式

另請參閱