為您的管線規劃組建相依性

已完成

在此單元中,您將了解如何封裝程式碼,使其更容易共用。 您將探索為何應該建立套件、您可以建立的套件種類、可在何處裝載套件,以及在裝載套件時如何加以存取。 您也會了解套件版本設定。

程式碼基底始終不斷成長且益發複雜。 小組撰寫其應用程式使用的所有程式碼,這是不尋常的舉動。 相反地,小組會包含由其他開發人員撰寫的現有程式碼。 應用程式中可能會有許多這種套件或相依性。 務必主動管理這些相依性,以便能夠適當地維護,並確保其符合安全性需求。

讓我們來看看小組的執行方式。 Andy 已呼叫小組一起討論其程式碼的潛在變更,此變更將可協助其他小組。

小組會議

Andy:嗨,大家好。 我正與在後端系統上為 Space Game 工作的小組進行聊天。 他們可以在其規劃撰寫的後端應用程式中,使用我們用於網站的模型。

Andy:你說的模型是什麼意思?

Andy:如您所知,Space Game 網站是 ASP.NET Core 應用程式。 其會使用 Model-View-Controller (或 MVC) 模式,將資料與在使用者介面中顯示該資料的方式分開。 我認為我們可以建立一個包含模型類別的套件,讓任何應用程式都可以使用它們。

Amita:目標到底是什麼?

Andy:這兩個小組都將共用相同的資料庫。 遊戲會將高分傳送到資料庫;我們會讀取這些分數以顯示在排行榜上。

Amita:這很合理。 我們將如何建立此套件?

Andy:這就是我想要與您聊天的原因。 我們有幾個選項,而且我正在尋找一些想法。

Tim:我很樂意提供協助,但首先我有一些問題。 我是新手,想要了解其運作方式。

何謂套件?

套件包含可重複使用的程式碼,其他開發人員可以在其自己的專案中使用此程式碼,即使他們未撰寫這個可重複使用的程式碼也是一樣。

對於編譯的語言,套件通常包含編譯的二進位程式碼,例如 .NET 中的 .dll 檔案,或 Java 中的 .class 檔案。 對於解譯而非編譯的語言,例如 JavaScript 或 Python,套件可能包含原始程式碼。

無論哪種方式,套件通常都會壓縮成 ZIP 或類似的格式。 封裝系統通常會定義唯一的副檔名 (例如 .nupkg 或 .jar),讓您可明確地使用套件。 壓縮有助於縮短下載時間,也會產生單一檔案以簡化管理。

套件通常也會包含一或多個檔案,提供有關套件的中繼資料或資訊。 此中繼資料可能會描述套件的用途、指定其授權條款、作者的連絡資訊,以及套件的版本。

為什麼要建置套件?

建置套件與複製程式碼相比,有一些優點。

建立套件而不是複製程式碼的其中一個原因是為了防止「漂移」。 當複製程式碼時,每個複本都可以快速出現差異,以滿足特定應用程式的需求。 將變更從一個複本遷移至其他複本會變得很困難。 換句話說,您無法以所有人都受益的方式來改善程式碼。

套件也會將相關功能群組為一個可重複使用的元件。 視程式設計語言而定,套件可讓應用程式存取特定類型和函式,同時限制存取其實作詳細資料。

建置套件的另一個原因是提供一致的方式來建置並測試該套件的功能。 當複製程式碼時,每個應用程式可能會以不同的方式建置並測試該程式碼。 一組測試可能包含另一組可從中獲益的檢查。

缺點是使用套件時,您會有另一個要測試和維護的程式碼基底。 新增功能時,您也必須小心。 一般來說,套件應該包含可使多種應用程式受益的功能。 例如,Json.NET 是適用於 .NET 的熱門 NuGet 套件,可讓您使用 JSON 檔案。 Json.NET 是開放原始碼,因此社群可以建議改進和回報問題。

當多個應用程式可從相同的程式碼受益時,其優點遠遠超過缺點。 您只有一個程式碼基底、一組測試,以及一個要管理的建置流程。

如何識別相依性?

如果目標是要將您的程式碼重新組織成不同的元件,您必須識別您應用程式的哪些部分可以移除、封裝成可重複使用、儲存在中央位置,以及進行版本設定。 您甚至可能要將自己的程式碼取代為本身是開放原始碼或您授權的協力廠商元件。

有許多方式可在您的程式碼基底中找出潛在的相依性。 這些包括掃描您的程式碼以找出重複使用的模式,以及分析解決方案的架構。 以下是一些用來識別相依性的方法:

  • 重複的程式碼

    如果某些程式碼片段出現在數個地方,則明顯表示您可以重複使用此程式碼。 集中化這些重複的程式碼片段,並適當地重新封裝。

  • 高內聚與低結合程度

    第二種方法是尋找程式碼元素,其彼此具有高內聚,以及具有與程式碼其他部分的低結合程度。 基本上,高內聚表示將彼此相關的程式碼基底部分保留在同一個位置。 同時,低結合程度是關於盡可能地將程式碼基底的不相關部分隔開。

  • 個別生命週期

    尋找具有類似生命週期且可以個別部署及發行的程式碼部分。 如果此程式碼可由個別小組維護,則明顯表示您可以將其封裝為解決方案之外的元件。

  • 穩定部分

    程式碼基底的某些部分可能很穩定且不常變更。 檢查您的程式碼存放庫,以找出變更頻率低的程式碼。

  • 獨立程式碼和元件

    每當程式碼和元件都是獨立的,而且與系統的其他部分無關時,您可能會將其隔離成不同的相依性。

您可以使用各種工具來協助您掃描和檢查程式碼基底。 這些工具的範圍從掃描重複程式碼,以及繪製解決方案相依性圖形的工具,到可以計算結合程度和內聚計量的工具。

有哪些種類的套件?

每個程式設計語言或架構都提供自己的方式來建置套件。 熱門的封裝系統會提供有關流程運作方式的文件。

您可能已經熟悉這些熱門的封裝系統:

  • NuGet:封裝 .NET 程式庫
  • NPM:封裝 JavaScript 程式庫
  • Maven:封裝 Java 程式庫
  • Docker:以稱為容器的隔離單位來封裝軟體

在何處裝載套件?

您可以在自己的網路上裝載套件,也可以使用裝載服務。 裝載服務通常稱為「套件存放庫」或「套件登錄」。 其中許多服務可讓您免費裝載開放原始碼專案。

以下是我們剛剛所描述套件類型的一些熱門裝載服務:

  • NuGet 資源庫

    NuGet 套件用於 .NET 程式碼成品。 這些成品包括 .NET 組件和相關檔案、工具,以及 (有時) 中繼資料。 NuGet 定義建立、儲存和取用套件的方式。 NuGet 套件基本上是壓縮的資料夾結構 (具有 ZIP 格式的檔案),且副檔名為 .nupkg

  • NPM

    NPM 套件用於 JavaScript。 NPM 套件是包含 JavaScript 檔案的檔案或資料夾,也是描述套件中繼資料的 package.json 檔案。 對於 node.js,套件通常會包含一或多個可在取用套件之後載入的模組。

  • Maven 中央存放庫

    Maven 會用於 Java 型專案。 每個套件都有一個描述專案中繼資料的專案物件模型檔案,而且是用於定義套件和使用套件的基本單位。

  • Docker Hub (英文)

    Docker 套件稱為映像,並包含完整的獨立式部署。 最常見的情況是,Docker 映像代表可以自行裝載和執行的軟體元件,沒有任何其他映像上的相依性。 Docker 映像會分層,而且可能相依於其他映像。

套件摘要是指您的套件存放庫伺服器。 此伺服器可以位於網際網路上,或位於您網路上的防火牆後方。 例如,您可以使用裝載產品 (例如 Azure Artifacts 和 MyGet) 來裝載您自己的 NuGet 摘要。 您也可以在檔案共用上裝載套件。

在防火牆後方裝載套件時,您可以將摘要併入至您自己的套件中。 當您的系統無法連線到網際網路時,您也可以快取網路上您信任的套件。

哪些元素構成良好的相依性管理策略?

良好的相依性管理策略取決於這三個元素:

  • 標準化

    將宣告和解決相依性的方式標準化,可協助您的自動化發行流程保持可重複且可預測的狀態。

  • 封裝格式和來源

    每個相依性都應該使用適用的格式進行封裝,並儲存在中央位置。

  • 版本控制

    您必須追蹤一段時間內在相依性中所發生的變更,就像您使用自己的程式碼所做一樣。 這表示相依性應該進行版本設定。

誰可以存取套件?

許多套件摘要都提供套件的無限制存取權。 例如,您可以從 nuget.org 下載 Json.NET,而不需要登入或驗證。

其他套件摘要需要驗證。 您可以透過幾種方式來驗證摘要的存取權。 例如,某些種類的摘要需要使用者名稱和密碼。 其他摘要需要「存取權杖」,其通常是很長的一系列字元,用來識別您的身分,以及您可以存取的資源。 您可以將存取權杖設定為在指定的時段之後過期。

如何設定套件的版本?

版本設定配置取決於您所使用的封裝系統。

例如,NuGet 套件會使用語意化版本控制系統

語意化版本控制系統是一種熱門的版本設定配置。 格式如下:

Major.Minor.Patch[-Suffix]

以下是其中每個參數所代表的意義:

  • 新的 Major 版本引進了重大變更。 應用程式通常需要更新其使用套件的方式,才能使用新的主要版本。
  • 新的 Minor 版本引進了新功能,但可與舊版相容。
  • 新的 Patch 引進了與舊版相容的錯誤修正,但不是新的功能。
  • -Suffix 是選用的部分,並且會將套件識別為發行前版本。 例如,1.0.0 Beta1 可能會將套件識別為 1.0.0 版的第一個 Beta 發行前組建。

參考套件時,您可以依版本號碼進行。

以下是使用 PowerShell 和特定版本號碼來安裝套件的範例:

Install-Package Newtonsoft.Json -Version 13.0.1

當套件變更時,會發生什麼情況?

從您的應用程式參考套件時,您通常會「釘選」(或指定) 您想要使用的套件版本。

許多架構可讓您指定要安裝的套件版本的允許範圍。 有些架構也可讓您指定萬用字元,我們稱之為「浮動版本」。

例如,在 NuGet 中,版本 "1.0" 表示等於或大於 1.0 的第一個版本。 "[1.0]" 指定只安裝 1.0 版,而不是較新的版本。

以下是一些其他範例:

此標記法: 選取:
(1.0,) 大於 1 的第一個版本。
[1.0,2.0] 大於或等於 1.0 且小於或等於 2.0 的第一個版本
(1.0,2.0) 大於 1.0 且小於 2.0 的第一個版本
[1.0,2.0) 大於或等於1.0 且小於2.0 的第一個版本

因為每個維護程式都會發行新的套件版本,所以您可以評估變更的內容,並針對其測試您的應用程式。 當您準備好時,可以在組態中更新套件的版本號碼,並將變更提交至組建管線。

以下範例說明如何在 C# 應用程式專案 (.csproj) 檔案中包含 Newtonsoft.Json 套件。 此範例會指定該套件的版本 13.0.1:

<ItemGroup>
  <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

檢定您的知識

1.

何謂套件?

2.

假設您已建置想要公開共用的套件。 最簡單的做法是什麼?