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

来源:https://www.cnblogs.com/yilezhu/archive/2018/09/25/9703460.html
-Advertisement-
Play Games

作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9703460.html 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. 在編輯器中打開 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}");
                }
            }
        }
    }
}
  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 子目錄的子目錄中。 請註意,每個子目錄中都包含完整的啟動應用所需的文件集(既有應用文件,也有所有 .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 newdotnet builddotnet run

總結

本文首先介紹了框架依賴與獨立部署的概念,然後分別介紹了框架依賴與獨立部署的優缺點讓大家加深理解!最後通過一個實例來講述瞭如何進行框架依賴與獨立部署。採用的實例使用的是控制台的方式進行的,當然你也可以使用vs進行發佈。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring是眾多開源 Java 項目中的一員,基於分層的 JavaEE 應用一站式輕量級開源框架,主要核心是IOC控制反轉(Inversion of Control, IoC)和依賴註入(Dependency Injection, DI)這兩大技術。 下麵是一個非常原始,簡易的BeanFactor ...
  • 標準庫 map multimap元素訪問 一,map,unordered_map下標操作 | 下標操作種類 | 功能描述 | | | | | c[k] | 返回關鍵字為k的元素;如果k不在c中,添加一個關鍵字為k的元素,並對其初始化 | | c.at(k) | 訪問關鍵字為k的元素;若k不在c中,拋 ...
  • 兩個基本類型變數相比較,=是比較它們的值是否相等 兩個對象相比是比較他們的地址值是否相等 equals()是比較對象的屬性值是否相等,前提是這兩個對象必須重寫object對象的equals方法,object對象是所有對象的基類,也就是所有對象都繼承了object對象,如果不重寫equals方法,ob ...
  • python筆記網站:http://www.runoob.com/python/python-tutorial.html ...
  • 1.pyc文件 是python預編譯後的位元組碼文件,並不是機器碼。2.PyCodeObject 是Python編譯器真正編譯成的結果; 當python程式運行時,編譯的結果是保存在PyCodeObject中。 在Python程式運行結束時,Python解釋器則將PyCodeObject寫回到pyc文 ...
  • 感謝博主提供的思路https://blog.csdn.net/softimite_zifeng/article/details/54289012 ...
  • 一、數值運算 各進位的數值計算很簡單,把各進位數轉換成 十進位數進行計算,然後再轉換成原類型即可。 舉例 :二進位之間的加法 二、位運算 什麼是位運算?程式中的所有內容在電腦記憶體中都是以二進位的形式儲存的(即:0或1),位運算就是直接對在記憶體中的二進位數的每位進行運算操作 在C#中可以對整型運算對 ...
  • MVC裡面如果直接將數據返回到前端頁面,我們常用的方式就是用return view(); 那麼我不想直接用razor語法,畢竟razor這玩意兒實在是太難記了,還不如寫ajax對接來得舒服不是 那麼我們可以這麼做 1.定義ActionResult,返回json,標記屬性可以採用HttpPost,也可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...