閱讀英文

共用方式為


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

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

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

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

發佈模式 命令
架構相依部署 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> 設定會在您發佈應用程式時指定預設的目標框架。 您可以將目標框架更改為任何有效的目標框架標記 (TFM)。 例如,如果您的專案使用 <TargetFramework>net9.0</TargetFramework>,則會建立以 .NET 9 為目標的二進位檔。 此設定中所指定 TFM 是 dotnet publish 命令使用的預設目標。

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

除非使用 -c 參數變更,否則預設的 BUILD-CONFIGURATION 模式為 Release

dotnet publish 命令的預設輸出目錄是 ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/。 例如,dotnet publish -c Release -f net9.0 會發佈至 ./bin/Release/net9.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!"));
        }
    }
}

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

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

架構相依部署

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

您的應用程式會設定為以 .NET 特定版本為目標。 執行您的應用程式的任何電腦上都需要安裝指定的 .NET 執行階段。 例如,如果您的應用程式以 .NET 9 為目標,則應用程式執行的任何計算機都必須安裝 .NET 9 運行時間。 依照發佈基本概念一節中所述,您可以編輯專案檔來變更預設的目標框架,或以多個框架為目標。

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

發佈模式 命令
架構相依部署 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 9 為目標,則應用程式執行的任何計算機都必須安裝 .NET 9 運行時間。 依照發佈基本概念一節中所述,您可以編輯專案檔來變更預設的目標框架,或以多個框架為目標。

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

發佈模式 命令
依賴 Framework 的可執行檔 dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release

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

如果您使用範例應用程式,請執行 dotnet publish -f net9.0 -r win-x64 --self-contained false。 此命令會建立下列可執行檔: ./bin/Debug/net9.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 8)。 在執行應用程式之前,系統上必須具有這些相依性。

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

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

  • -r <RID>

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

  • --self-contained true

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

發佈模式 命令
獨立部署 dotnet publish -c Release -r <RID> --self-contained true

提示

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

另請參閱


其他資源