天天看點

.NET Core部署中你不了解的架構依賴與獨立部署

作者:依樂祝

原文位址:https://www.cnblogs.com/yilezhu/p/9703460.html

NET Core項目釋出的時候你有沒有注意到這兩個選項呢?有沒有糾結過架構依賴與獨立部署到底有什麼差別呢?如果有的話那麼這篇文章可以參考下!

為什麼要寫這篇文章呢?因為今天同僚問我架構依賴與獨立部署到底應該選哪個呢?有什麼差別。印象中隻知道架構依賴釋出後檔案比獨立部署要小很多,然後就是獨立部署不占用net core的共享資源,而架構依賴需要與其他net core程式共享net core的一些資源。感覺很模糊,是以查了下資料整理如下,希望對大家有所幫助。

依賴架構的部署 (FDD)

定義

架構依賴的部署:顧名思義,依賴架構的部署 (FDD) 依賴目标系統上存在共享系統級版本的 .NET Core。 由于已存在 .NET Core,是以應用在 .NET Core 安裝程式間也是可移植的。 應用僅包含其自己的代碼和任何位于 .NET Core 庫外的第三方依賴項。 FDD 包含可通過在指令行中使用 dotnet 實用程式啟動的 .dll 檔案。 例如,dotnet app.dll 就可以運作一個名為 app 的應用程式。

對于 FDD,僅部署應用程式和第三方依賴項。 不需要部署 .NET Core,因為應用将使用目标系統上存在的 .NET Core 版本。 這是定目标到 .NET Core 的 .NET Core 和 ASP.NET Core 應用程式的預設部署模型。

優點

  • 不需要提前定義 .NET Core 應用将在其上運作的目标作業系統。 因為無論什麼作業系統,.NET Core 的可執行檔案和庫都是用通用的 PE 檔案格式,是以,無論什麼基礎作業系統,.NET Core 都可執行應用。
  • 部署包很小。 隻需部署應用及其依賴項,而無需部署 .NET Core 本身。
  • 許多應用都可使用相同的 .NET Core 安裝,進而降低了主機系統上磁盤空間和記憶體使用量。

缺點

  • 僅當主機系統上已安裝你設為目标的 .NET Core 版本或更高版本時,應用才能運作。
  • 如果不了解将來版本,.NET Core 運作時和庫可能發生更改。 在極少數情況下,這可能會更改應用的行為。

獨立部署 (SCD)

獨立部署:與 FDD 不同,獨立部署 (SCD) 不依賴目标系統上存在的共享元件。 所有元件(包括 .NET Core 庫和 .NET Core 運作時)都包含在應用程式中,并且獨立于其他 .NET Core 應用程式。 SCD 包括一個可執行檔案(如 Windows 平台上名為 app 的應用程式的 app.exe),它是特定于平台的 .NET Core 主機的重命名版本,還包括一個 .dll 檔案(如 app.dll),而它是實際的應用程式。

對于獨立部署,可以部署應用和所需的第三方依賴項以及生成應用所使用的 .NET Core 版本。 建立 SCD 不包括各種平台上的 .NET Core 本機依賴項,是以運作應用前這些依賴項必須已存在。

從 NET Core 2.1 SDK(版本 2.1.300)開始,.NET Core 支援修補程式版本前滾。 在建立獨立部署時,.NET Core 工具會自動包含你的應用程式所指向的 .NET Core 版本的最新服務的運作時。 (最新服務的運作時包括安全修補程式和其他 bug 修複程式。)服務的運作時不需要存在于你的生成系統上;它會從 NuGet.org 自動下載下傳。

FDD 和 SCD 部署使用單獨的主機可執行檔案,使你可以使用釋出者簽名為 SCD 簽署主機可執行檔案。

  • 可以對與應用一起部署的 .NET Core 版本具有單獨的控制權
  • 請放心,目标系統可以運作你的 .NET Core 應用,因為你提供的是應用将在其上運作的 .NET Core 版本

  • 由于 .NET Core 包含在部署包中,是以必須提前選擇為其生成部署包的目标平台
  • 部署包相對較大,因為需要将 .NET Core 和應用及其第三方依賴項包括在内。
從.NET Core 2.0 開始,可以通過使用 .NET Core 全球化固定模式在 Linux 系統上減少大約 28 MB 的部署大小。 通常,Linux 上的 .NET Core 依賴于 ICU 庫來實作全球化支援。 在固定模式下,庫不包含在部署中,并且所有區域性的行為均類似于固定區域性。
  • 向系統部署大量獨立的 .NET Core 應用可能會使用大量磁盤空間,因為每個應用都會複制 .NET Core 檔案

執行個體示範 .NET Core 應用的部署釋出

上面已經說了,可以将 .NET Core 應用程式部署為依賴架構的部署或獨立部署,前者包含應用程式二進制檔案,但依賴目标系統上存在的 .NET Core,而後者同時包含應用程式和 .NET Core 二進制檔案。

不包含第三方依賴的架構依賴的部署

  1. 為項目建立一個目錄,并将其設為目前目錄
  2. 在指令行中,鍵入 dotnet new console 以建立新的 C# 控制台項目
  3. 在編輯器中打開 Program.cs 檔案,然後使用下列代碼替換自動生成的代碼。 它會提示使用者輸入文本,并顯示使用者輸入的個别詞。 它使用正規表達式

    \w+

    來将輸入文本中的詞分開。
    using System;
    using System.Text.RegularExpressions;
    
    namespace Applications.ConsoleApps
    {
        public class ConsoleParser
        {
            public static void Main()
            {
                Console.WriteLine("Enter any text, followed by <Enter>:\n");
                String s = Console.ReadLine();
                ShowWords(s);
                Console.Write("\nPress any key to continue... ");
                Console.ReadKey();
            }
    
            private static void ShowWords(String s)
            {
                String pattern = @"\w+";
                var matches = Regex.Matches(s, pattern);
                if (matches.Count == 0)
                {
                    Console.WriteLine("\nNo words were identified in your input.");
                }
                else
                {
                    Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                    for (int ctr = 0; ctr < matches.Count; ctr++)
                    {
                        Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                    }
                }
            }
        }
    }
               
  4. 運作 dotnet restore(請參閱注釋)指令,還原項目中指定的依賴項。
  5. 使用

    dotnet build

    指令生成應用程式,或使用

    dotnet run

    指令生成并運作應用程式。
  6. 完成程式調試和測試後,使用下列指令建立部署
    dotnet publish -f netcoreapp2.1 -c Release
               

    這将建立一個應用的發行版(而不是調試版)。 生成的檔案位于名為“publish”的目錄中,該目錄位于項目的 bin 目錄的子目錄中。

    與應用程式的檔案一起,釋出過程将發出包含應用調試資訊的程式資料庫 (.pdb) 檔案。 該檔案主要用于調試異常。 可以選擇不将其與應用程式的檔案一起分布。 但是,如果要調試應用的釋出版本,則應儲存該檔案。

    可以采用任何喜歡的方式部署完整的應用程式檔案集。 例如,可以使用簡單的

    copy

    指令将其打包為 Zip 檔案,或者使用選擇的安裝包進行部署。
  7. 安裝成功後,使用者可通過使用 dotnet 指令或提供應用程式檔案名(如 dotnet fdd.dll)來執行應用程式。

    除應用程式二進制檔案外,安裝程式還應捆綁共享架構安裝程式,或在安裝應用程式的過程中将其作為先決條件進行檢查。 安裝共享架構需要管理者/根通路權限。

包含第三方依賴項的依賴架構的部署

要使用一個或多個第三方依賴項來部署依賴架構的部署,需要這些依賴項都可供項目使用。 在運作 dotnet restore指令之前,還需執行額外兩個步驟:

  1. 向 csproj 檔案的 部分添加對所需第三方庫的引用。 以下 部分包含 Json.NET 的依賴項(作為第三方庫):
<ItemGroup>
  <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
</ItemGroup>
           
  1. 如果尚未安裝,請下載下傳包含第三方依賴項的 NuGet 包。 若要下載下傳該包,請在添加依賴項後執行

    dotnet restore

    指令。 因為依賴項在釋出時已從本地 NuGet 緩存解析出來,是以它一定适用于你的系統。
請注意,如果依賴架構的部署具有第三方依賴項,則其可移植性隻與第三方依賴項相同。 例如,如果某個第三方庫隻支援 macOS,該應用将無法移植到 Windows 系統。 當第三方依賴項本身取決于本機代碼時,也可能發生此情況。 Kestrel 伺服器就是一個很好的示例,它需要 libuv 的本機依賴項。 當為具有此類第三方依賴項的應用程式建立 FDD 時,已釋出的輸出會針對每個本機依賴項支援(存在于 NuGet 包中)的運作時辨別符 (RID) 包含一個檔案夾。

不包含第三方依賴項的獨立部署

部署沒有第三方依賴項的獨立部署包括建立項目、修改 csproj 檔案、生成、測試以及釋出應用。 一個用 C# 編寫的簡單示例可說明此過程。 該示例示範如何使用指令行中的 dotnet 實用工具建立獨立部署。

  1. 為項目建立一個目錄,并将其設為目前目錄。
  2. 在指令欄行中,鍵入

    dotnet new console

    ,在該目錄中建立新的 C# 控制台項目
  3. \w+

using System;
using System.Text.RegularExpressions;

namespace Applications.ConsoleApps
{
    public class ConsoleParser
    {
        public static void Main()
        {
            Console.WriteLine("Enter any text, followed by <Enter>:\n");
            String s = Console.ReadLine();
            ShowWords(s);
            Console.Write("\nPress any key to continue... ");
            Console.ReadKey();
        }

        private static void ShowWords(String s)
        {
            String pattern = @"\w+";
            var matches = Regex.Matches(s, pattern);
            if (matches.Count == 0)
            {
                Console.WriteLine("\nNo words were identified in your input.");
            }
            else
            {
                Console.WriteLine($"\nThere are {matches.Count} words in your string:");
                for (int ctr = 0; ctr < matches.Count; ctr++)
                {
                    Console.WriteLine($"   #{ctr,2}: '{matches[ctr].Value}' at position {matches[ctr].Index}");
                }
            }
        }
    }
}
           
  1. 在 csproj 檔案(該檔案用于定義應用的目标平台)的

    部分中建立 标記,然後指定每個目标平台的運作時辨別符 (RID)。 請注意,還需要添加分号來分隔 RID。 請檢視運作時辨別符目錄,擷取運作時辨別符清單。

    例如,以下

    部分表明應用在 64 位 Windows 10 作業系統和 64 位 OS X 10.11 版本的作業系統上運作。

<PropertyGroup>
    <RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers>
</PropertyGroup>
           

請注意, 元素可能出現在 csproj 檔案的任何

中。 本節後面部分将顯示完整的示例 csproj 檔案。

  1. 運作

    dotnet restore

    指令,還原項目中指定的依賴項。
  2. dotnet restore

    (請參閱注釋)指令,還原項目中指定的依賴項。特别是如果應用面向 Linux,則可以通過利用全球化固定模式來減小部署的總規模。 全球化固定模式适用于不具有全局意識且可以使用固定區域性的格式約定、大小寫約定以及字元串比較和排序順序的應用程式。要啟用固定模式,右鍵單擊“解決方案資料總管”中的項目(不是解決方案),然後選擇“編輯 SCD.csproj”。 然後将以下突出顯示的行添加到檔案中:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <RuntimeHostConfigurationOption Include="System.Globalization.Invariant" Value="true" />
  </ItemGroup> 
</Project>
           
  1. 在指令行中,使用 dotnet run 生成指令。
  2. 調試并測試程式後,為應用的每個目标平台建立要與應用一起部署的檔案。

    同時對兩個目标平台使用 dotnet publish 指令,如下所示:

dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r osx.10.11-x64
           

這将為每個目标平台建立一個應用的發行版(而不是調試版)。 生成的檔案位于名為“釋出”的子目錄中,該子目錄位于項目的 .\bin\Release\netcoreapp2.1<runtime_identifier> 子目錄的子目錄中。 請注意,每個子目錄中都包含完整的啟動應用所需的檔案集(既有應用檔案,也有所有 .NET Core 檔案)。

與應用程式的檔案一樣,釋出過程将生成包含應用調試資訊的程式資料庫 (.pdb) 檔案。 該檔案主要用于調試異常。 可以選擇不使用應用程式檔案打包該檔案。 但是,如果要調試應用的釋出版本,則應儲存該檔案。

可按照任何喜歡的方式部署已釋出的檔案。 例如,可以使用簡單的 copy 指令将其打包為 Zip 檔案,或者使用選擇的安裝包進行部署。

下面是此項目完整的 csproj 檔案。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers>
  </PropertyGroup>
</Project>

           

包含第三方依賴項的獨立部署

部署包含一個或多個第三方依賴項的獨立部署包括添加依賴項。 在運作 dotnet restore指令之前,還需執行額外兩個步驟:

  1. 将對任何第三方庫的引用添加到 csproj 檔案的 部分。 以下 部分使用 Json.NET 作為第三方庫。
<ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>
           
  1. 如果尚未安裝,請将包含第三方依賴項的 NuGet 包下載下傳到系統。 若要使依賴項對應用适用,請在添加依賴項後執行 dotnet restore指令。 因為依賴項在釋出時已從本地 NuGet 緩存解析出來,是以它一定适用于你的系統。

    下面是此項目的完整 csproj 檔案:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeIdentifiers>win10-x64;osx.10.11-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>
</Project>
           

部署應用程式時,應用中使用的任何第三方依賴項也包含在應用程式檔案中。 運作應用的系統上不需要第三方庫。

請注意,可以隻将具有一個第三方庫的獨立部署部署到該庫支援的平台。 這與依賴架構的部署中具有本機依賴項和第三方依賴項相似,其中的本機依賴項必須與部署應用的平台相容。

備注:

從 .NET Core 2.0 開始,無需運作

dotnet restore

,因為它由所有需要還原的指令隐式運作,如

dotnet new

dotnet build

dotnet run

總結

本文首先介紹了架構依賴與獨立部署的概念,然後分别介紹了架構依賴與獨立部署的優缺點讓大家加深了解!最後通過一個執行個體來講述了如何進行架構依賴與獨立部署。采用的執行個體使用的是控制台的方式進行的,當然你也可以使用vs進行釋出。

作者:依樂祝(祝雷)

出處:https://www.cnblogs.com/yilezhu

聯系:[email protected] .NET Core實戰項目交流群:637326624 微信:jkingzhu

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如有問題或建議,請多多賜教,非常感謝。

.NET Core部署中你不了解的架構依賴與獨立部署

繼續閱讀