NuGet

以 NuGet 管理專案庫

費歐 Haack

 

請試著可能,Microsoft 無法提供每個可能的程式庫開發人員的需求。雖然 Microsoft 90000 採用了接近到世界各地的人,全球有數百萬開發人員。不符合常理以便 Microsoft 可以嘗試填滿每個利基的開發人員,也就不會縮放。開發人員來說,因此,常把它本身 「 可用他們自己的 itch,"時,他們編寫千分位在數千個有用的程式庫分散各地的網頁時。。

洽詢網路管理員有這麼多的程式庫共用它們。共用及重複使用程式碼是一大挑戰。不會相信我嗎?查核任何中型至大型購買並要求他們有需要將多少記錄文件庫服務。瀏覽足夠的公司,您會發現,高比例的內部記錄文件庫時是很好的-Log4Net,NLog 和錯誤記錄模組和處理常式或 ELMAH,已經存在。

當開發人員會啟動新的專案時,他會面臨空白畫布的問題。他要如何找到這些好用的程式庫?他如何並不會併入他目前的專案中的文件庫和管理其相依性與更新?

ELMAH 是很有用的程式庫開發人員撰寫花在本身時的最佳範例。ELMAH,以此類推,記錄在網頁應用程式的所有要求資訊,例如伺服器變數的頁首中的所有未處理例外狀況,擲回例外狀況時。假設您只聽說 ELMAH,而且想要用於下一個專案。

這些是您可能會採取的步驟:

  1. 尋找 ELMAH。 唯一的名稱,受限於 Bing 搜尋,尋找 ELMAH Google 的字碼頁為第一個結果。
  2. 立即下載正確的 zip 套件。 站台的下載頁面有多個的 zip 套件。您必須考慮它,並選擇其中之一。有時候是正確的選擇並不容易了解。
  3. 解除 「 封鎖 」 套件。 一旦您從 Web 下載套件,您需要的檔案上按一下滑鼠右鍵,叫出 [屬性] 對話方塊,按一下 [解除封鎖] 按鈕,以移除檔案中的"的網頁的標記 」。
  4. 請確認其對由裝載環境所提供的雜湊。 Google 的程式碼的站台會顯示說明 QR 代碼來代表 zip 檔。多少的開發人員知道必須仔細檢查檔案是否符合說明說明 QR 程式碼?
  5. 將套件內容解壓縮到方案中的特定位置。 大部分的開發人員避免解壓縮到 bin 目錄下,組件,因為目錄用來建置,而不使用 [輸入時,輸出,而不由版本控制追蹤。相反地,務必加入致力於版本控制和參考組件從該位置的資料夾中的相依性。
  6. 將組件參考加入至專案。 組件不可以使用,直到您將新增一個參照給它從 Visual Studio 的專案中。
  7. 使用來更新 web.config 正確的設定。這可能表示更多的搜尋,如何使用 Bing 或 Google,當您嘗試尋找所需的組態檔的正確設定。

很麻煩 !現在假設您有 10 到 15 的相依性對執行這個動作。說要釋放下一版的應用程式的時間,您會花很多時間,搜尋您的應用程式的相依性的更新。

該常 maligned 概念,「 未發明 」 (NIH),即會開始聽起來很好的作法。

拯救 NuGet

NuGet 是 Visual Studio 的擴充,讓您可以輕鬆地加入、 更新和移除 (部署為套件中) 的程式庫 Visual Studio 的專案中。NuGet 套件是一組封裝成單一檔案使用的檔案。使用開放封裝慣例 (OPC) 格式的 nupkg 副檔名。

OPC 是只是某些中繼資料的 zip 檔案美觀縮略字。事實上,您可能早已熟悉 OPC,因為它是 Word 和 Excel 文件所使用的格式。如果您曾經採取.docx 檔案並變更檔案副檔名為.zip,就會知道您可以將其開啟,並檢查一下它的內部資訊。一樣的道理。nupkg 的檔案。

NuGet 產品也都附有公用程式來輕鬆地建立和發佈套件。現在,我將著重使用 NuGet 來探索並安裝套件。稍後我將介紹如何建立和發佈套件。

安裝 NuGet

若要安裝 NuGet,啟動 Visual Studio 擴充管理員,透過 [工具 |擴充管理員功能表選項。[線上組件庫] 如所示,請按一下索引標籤來檢視可用的 Visual Studio 的延伸, 圖 1。如您所見,NuGet 就會是最高順位後套件,把它放入第一個畫面。如果的變更,您可以使用搜尋方塊右上方,尋找它。按一下 [下載] 按鈕,來安裝 NuGet。

[圖 1 Visual Studio 擴充管理員

如果您已經安裝了 ASP。Net 和 3,您已經安裝的 NuGet。ASP。NET MVC 3 包括 NuGet,以及 Microsoft 計劃要納入下一版的 Visual Studio 的 NuGet。

安裝封裝

舉個 NuGet 的安裝套件的好記] 對話方塊。NuGet 也能以 Windows PowerShell 為基礎的主控台,針對我將在稍後說明的進階使用者。

[參考] 的若要啟動 NuGet,專案的節點上按一下滑鼠右鍵並選取 [管理 NuGet 套件選項 (這個選項會有不同的標籤,以 NuGet 1.4 之前)。這會啟動所管理的 NuGet 套件顯示的對話方塊在 圖 2

[圖 2 NuGet 封裝管理員對話方塊

請確定已選取 [線上] 索引標籤,然後輸入搜尋字詞裡右上方 (比方說,MiniProfiler 的搜尋,從 StackOverflow.com 同仁有用的程式庫)。

[安裝] 一旦您找到套件,請按一下按鈕,來安裝套件。NuGet 再下載封裝和其相依性,並視需要變更套用於您的封裝所指定的專案。

NuGet 會執行下列步驟來安裝封裝:

  1. 下載封裝檔案及其所有相依性。 某些封裝需要明確授權接受度,並提示使用者接受授權條款的封裝。大多數的套件是以隱含的授權接受正常的而且不再顯示提示。如果方案中,或在本機快取中,封裝已經存在,NuGet 會跳過下載套件。
  2. 解壓縮套件的內容。 NuGet 擷取內容到 [套件] 資料夾中,如有必要,請建立該資料夾中。[驅動程式套件回復] 資料夾位於您的方案 (.sln) 檔案的旁邊。如果同一個套件安裝在多個專案的方案中,封裝只能擷取一次,並由每個專案共用。
  3. 在封裝中的參考組件。 依照慣例,NuGet 會更新專案參考適當的組件 (或組件),在套件內 lib 資料夾。例如,當安裝封裝到 Microsoft 的目標專案。NET Framework 4,NuGet 將會加入組件內的參考 lib/net40 資料夾。
  4. 複製到專案的內容。 依照慣例,NuGet 會將套件的內容資料夾的內容複製到專案中。這非常有用的封裝包含 JavaScript 檔案或圖像。
  5. 適用於封裝的轉換。 如果任何封裝包含轉型檔案,例如 app.config.transform 或 web.config.transform 的設定,因此對於 NuGet 之前將此內容複製,就會套用這些轉換。有些套件可能包含可以轉換為原始程式檔中包含目前的專案命名空間的原始程式碼。NuGet 轉換這些檔案。
  6. 執行相關聯的套件中的 Windows PowerShell 指令碼。 有些套件可能包含自動化使用設計階段環境 (DTE) 來處理的工作 NuGet 不設計為 Visual Studio 的 Windows PowerShell 指令檔。

NuGet 會執行所有步驟之後,就有一個文件庫可供使用。許多封裝呼叫本身以減少所需的任何組態在安裝完成後使用 WebActivator 套件。

封裝可以解除安裝,會傳回您的專案來安裝套件前的狀態。

更新套件

"事實和 Fallacies 的軟體工程 」 (Addison Wesley 器,2002年,劉小龍 l。 他活頁簿中,Glass 狀態: 「 維護通常消耗約有 40 至 80%(60percent 平均) 軟體的費用。因此,它是可能最重要的生命週期階段。

安裝封裝是故事的開頭。經過一段時間,因為系統會維持這些程式庫,便愈來愈重要保持最新與最新的錯誤修正程式庫的應用程式。這會要求您回答這個問題,「 在此專案中的相依項目有新的更新 」?

如同先前所述,回答這個問題向來是耗時的努力。與 NuGet,不過,您只需啟動 
dialog,並按一下上的 [更新] 索引標籤,以查看一份與可用的更新套件中所示圖 3。按一下 [更新] 按鈕,來更新封裝的最新版本。

[圖 3 更新仍能使用目前的專案

更新命令解除安裝舊的封裝,然後安裝新的一個,確保所有的相依性會予以適當更新,必要時。

NuGet 提供 [封裝管理員] 主控台中的命令更精確地掌控更新-例如,更新方案中的所有套件,或是執行 「 安全 」 都更新,例如。

NuGet 為進階使用者的

雖然我熱衷於 GUI 好用的對話方塊,我就會知道許多開發人員期盼滑鼠拖曳像我這樣的人。這些人偏好以一起撰寫一組命令的能力的使用者介面的命令列的 
shell。

NuGet 會填入稱為 [封裝管理員] 主控台中,以及一系列 Windows PowerShell 與 NuGet 互動以 Windows PowerShell 為基礎的主控台視窗中的這項需求。Windows PowerShell。NET 為基礎的指令碼語言以及命令列殼層,很適合這樣撰寫的指令集和使用物件。

若要啟動 [封裝管理員] 主控台,瀏覽,按一下 [工具 |程式庫封裝管理員 |封裝管理員主控台] 功能表選項。

列出並安裝封裝

清單和搜尋套件,使用取得封裝的命令。[命令] 根據預設,清單會安裝套件目前專案中。您可以指定與篩選器旗標結合 ListAvailable 旗標,就可搜尋的線上封裝。「 MVC": 下列命令會搜尋所有的封裝一提的是。

取得套件 ListAvailable 篩選 Mvc

一旦您找到要安裝的封裝時,請使用安裝套件的命令。例如,如果要安裝 ELMAH,到目前的專案:

安裝套件 Elmah

Windows PowerShell 是一種動態語言,因為它可以提供協助您正確地輸入命令引數的程式碼展開索引標籤。索引標籤上的程式碼展開為相當於 IntelliSense 的 c #,但是可以在執行時間填入] 索引標籤上的程式碼展開和 IntelliSense,根據編譯時間的資訊而定,不同的是。

比方說,如果您在安裝套件 Mvc {tab} 時,您會看到來源的封裝,可能的套件名稱的清單中所示圖 4

圖 4] 索引標籤擴展的封裝清單

更新套件

[封裝管理員] 主控台也包含可提供更能控制更新比對話方塊] 指令。例如,呼叫沒有指定引數這個指令,以更新方案的每一個專案中的每個封裝:

更新套件

這個命令會嘗試更新為最新版本的每個封裝。因此,如果您有個封裝的 1.0 版和 1.1 和 2.0 版都是在封裝來源的版本,這個命令會更新封裝成 2.0 版中,因為它是最新。

如果任何封裝包含最新的變更,這可能是一種較為激烈的動作。在許多情況下,您只是要更新至最新版的錯誤修正的每個封裝。這種稱為 「 安全 」 的更新,會假設有較大的組建或修訂編號 (但具有相同的主要和次要號碼) 的封裝與舊版相容。[安全的旗標,來執行安全的更新,就像這樣: 只要加入

更新套件的安全

如此一來,如果您有安裝,封裝的版本 1.0.0,1.1 和 1.0.1 都是在封裝來源套件安全地升級為 1.0.1 和不 1.1 版中。

更新套件的命令也會提供多個資料粒度,例如特定版本的套件,而不是最新的版本更新封裝。

延伸,以新命令的 Visual Studio

使用 Windows PowerShell 安裝封裝的能力很不錯,雖然不是選擇 Windows PowerShell 最具競爭力的理由。[封裝管理員] 其中最重要的理由是套件可以加入新的命令,以主控台。這些命令可以與 Visual Studio 的 DTE 互動,以執行各種工作。

例如,安裝 MvcScaffolding 套件,並且它將新的 Scaffold 控制器命令加入至主控台。提供實體架構 (EF) 程式碼第一個物件,這個命令產生一個控制器、 控制器的動作和相對於 EF 物件,基本的建立、 讀取、 更新和刪除 (CRUD) 作業中所見的檢視圖 5

[圖 5 MvcScaffolding 自訂 Scaffold 命令的實際操作

在您的組織中的 NuGet

所有此你如何 NuGet 讓公用程式開發人員社群,分享文件庫在企業中的 NuGet 的使用性很容易錯過。

畢竟,所以沒有特別,使它們能免於相同的挑戰軟體社群所共用程式碼時,所面臨整個企業。隨著公司成長經過一段時間,亂度設定。同一家公司的不同部門使用他們自己的私用版本的公司 「 標準 」 程式庫。一些群組可能請移到目前為止,完全略過這些程式庫,然後撰寫他們自己從頭。

通常,問題不是自己的程式庫,但是在與其他小組共用這些程式庫,並將它們變更的通知保留麻煩。聽起來很熟悉嗎?

封裝來源

到目前為止,我已經討論了如何安裝套件,但還沒有回答的問題: 所在位置,找到這些封裝?它們位在 nuget.org 上正式的 NuGet 套件圖庫。這個組件庫公開 (expose) 的 OData 摘要: 封裝。nuget.org/v1/FeedService.svc。

OData 格式會允許 NuGet 用戶端產生臨機操作查詢來搜尋套件來源在用戶端,但讓它們在伺服器上執行。

若要新增更多的套件來源 NuGet,以滑鼠游標指向 [工具 |程式庫封裝管理員 |封裝管理員設定 [功能表] 選項,如所示的套件來源節點上按一下圖 6

[圖 6 封裝管理員設定

預設的封裝來源又是 OData 結束點的網頁,但範例螢幕擷取畫面也會顯示為套件來源的本機資料夾。NuGet 將視為套件來源資料夾 (無論是本機或網路共用上) 的 [線上],並列出在窗格的資料夾中的每個封裝。這會與其他人共用的程式碼,只要把它放在資料夾中,同時也是很有幫助測試您自行建立的封裝時。

裝載您自己的 NuGet 伺服器

除了裝載在網路共用上的封裝,您可以也設定為封裝來源的網站,並用來封裝與其他人共用您的組織內。

有許多工作,如沒有封裝,此處可幫助。首先,建立空的 ASP。Net 應用程式,在 Visual Studio (針對 ASP。NET 4)。使用 NuGet 來安裝套件 NuGet.Server。此套件會將簡單的 OData 端點加入至空的 Web 應用程式。

接下來,將封裝檔案新增至發行這些變更,並將網站部署的網頁應用程式的套件資料夾中。如需如何設定這個切換,詳細內容請參閱 NuGet 文件站台,bit.ly/jirmLO。

對於那些想要部署完整的組件庫經驗,像是 nuget.org,NuGet 組件庫的程式碼也會出現為開放原始碼專案透過 nugetgallery.codeplex.com 專案。

裝載私人的 NuGet 伺服器或組件庫的實作是簡單的方法,而不必將其發佈到公用共用一個公司內專屬的程式碼。

建立套件

NuGet 就不會很有用,而不需在第一時間內安裝的任何封裝。在 NuGet 中,您可以使用更有用處封裝,更有價值的 NuGet 就會變得愈每位開發人員。NuGet 團隊要大費周章辛苦的原因,請建立封裝一樣簡單且最輕鬆。雖然很容易建立封裝,NuGet 小組持續投入功能,使其更加簡單。它們建立了數種工具來建立 NuGet 套件。例如,封裝總管是提供視覺化的方式,來建立,或檢查封裝 NuGet 小組的開發人員所撰寫的 ClickOnce 應用程式。它的 npe.codeplex.com。

NuGet.exe

因為大多數的套件作者想要將封裝建立整合到他們的建置處理序,讓我們看看使用 NuGet 命令列公用程式的另一種方法。您必須從 bit.ly/gmw54b,就可以一次下載此公用程式。在下載 NuGet.exe 之後,請確定將資料夾加入至您的路徑環境變數中。我有一個名為"utils",就像這樣的公用程式的資料夾。

也就表示您只需要下載一次 (一次每台電腦其實) NuGet.exe 的原因是因為它是自我更新的可執行檔。只要執行下列命令,若要讓線上檢查,並自行更新的最新版本,如果有一份較新的 NuGet:

nuget 更新 –self

[封裝管理員] 命令列工具可以查詢將線上的摘要,如主控台。例如,如果要搜尋以"MVC"的所有套件,請使用下列命令:

nuget 清單 Mvc

NuGet.exe 甚至可以在下載封裝及相依性,並解壓縮,但它不能修改的專案參考已下載的封裝組件,或是執行任何包含在封裝中的 Windows PowerShell 指令碼。

從專案中建立套件

封裝包含的單一組件 90%的時間 (我所組成的統計資料)。本章節內容包括簡單的工作流程,建立與專案檔案 (例如.csproj 或.vbproj 檔) 中使用 NuGet.exe 這類封裝。

如需建立更複雜之封裝的詳細資訊,例如單一封裝是要以不同。NET framework 中,請參閱 NuGet 文件網站,以在文件。nuget.org。

建立封裝的基本步驟如下:

  1. 建立類別庫專案。
  2. 從專案中產生的 NuSpec 資訊清單。
  3. 更新專案的組件中繼資料。
  4. 您可以使用 NuGet.exe 來建立套件。

建立類別庫專案的共用組件,開頭的類別庫專案。NuGet 可包多種專案類型,但共用程式碼時,最常見的案例是使用類別庫。建立套件之後,請確定開啟 AssemblyInfo.cs 檔案,以更新組件的中繼資料。

建立資訊清單 NuSpec NuSpec 檔案是封裝,例如作者、 描述和封裝相依性的相關重要的中繼資料的套件資訊清單。NuSpec 格式很容易就能以手動方式建立,但會比較方便,讓您產生的檔案規格的命令。請確定在與專案檔相同的目錄中執行的命令:

nuget 規格

在這個案例中,因為專案檔中,從產生的 NuSpec 規格的命令包含版面配置區的某些中繼資料,如所示圖 7

圖 7 所產生的 NuSpec 檔案

<?xml version="1.0"?>
<package xmlns=
  "https://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <copyright>Copyright 2011</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>
</package>

不使用替代符號,編輯的欄位,但不要填入正確的值,例如 licenseUrl、 projectUrl、 iconUrl 及標籤其他欄位。

更新專案的組件中繼資料每一個組件具有組件相關的中繼資料。 NuGet 可以讀取這個組件中繼資料,並合併至 NuSpec 資訊清單時,它會建立封裝,以確保這項資訊絕對不會是您的封裝和組件之間同步處理。

如先前所述,這項資訊通常位於名為 AssemblyInfo.cs 的檔案。 在資料表圖 8 會顯示組件中繼資料和 NuSpec 的預留位置值之間的對應。

[圖 8 組件中繼資料對應至 NuSpec

語彙基元 來源
$識別碼 $ 組件名稱。
$標題 $ AssemblyTitleAttribute 中所指定的組件標題。
$版 $ 組件的 AssemblyVersionAttribute 中所指定的組件版本。
$作者 $ AssemblyCompanyAttribute 中所指定的公司。
$描述 $ AssemblyDescriptionAttribute 中所指定的描述。

[組件名稱。 的不同於其他欄位,$ $ 商不會從組件的屬性,擷取出來,但是設定為

建立套件在專案檔和 NuSpec 檔案相同目錄中,執行下列命令來建立套件:

nuget 封包 ProjectName.csproj

如果您有一個專案檔相同的目錄中,您可以省略專案檔的名稱,當您執行命令。

如果您沒有編譯專案,您可以使用組建旗標來編譯專案第一之前將它封裝。 這將會編譯專案先執行封包命令:

nuget 封包 ProjectName.csproj 建置

這個命令會產生一個名為 ProjectName 檔案。{版本}。 {版本} nupkg,其中的是相同的 AssemblyVersionAttribute 中所指定的值。 比方說,如果版本是 1.0.0,您的封裝名稱會是 ProjectName.1.0.0。 nupkg。 [封裝檔案總管] 您可以使用來檢查以確定它已正確地建立事實之後的封裝。

開發人員將會安裝套件僅,考慮使用符號旗標來建立套件,以偵錯工具符號:

nuget 封包 ProjectName.csproj-建置-符號

此命令建立的符號套件中,除了主要封裝。 這可讓其他人安裝您自己的應用程式偵錯時逐步執行套件代碼的包裝。

發佈封裝

建立套件之後,您可能需要與全世界分享它。 NuGet.exe 有為了這個用途的 [發行] 命令。 發佈之前,您必須在 nuget.org 上建立一個帳戶。

當您已註冊帳戶時,按一下連結至您的帳號,請參閱便捷鍵。 [Nuget.exe] 此機碼是很重要,找出組件庫的命令和已被廢止的密碼。

一旦您的機碼之後,請將它儲存在安全的地方,使用下列命令:

nuget setApiKey b688a925-0956-40a0-8327-ff2251cf5f9a

[發送] 使用這個之後,使用指令來發佈您的封裝組件庫:

nuget 推入 ProjectName.1.0.0。 nupkg

它將上載封裝之前,指令會驗證您的組件庫的 API 金鑰。 如果我們先前所述,您可以建立一個符號封裝,您應該在推入您的封裝時,指定符號旗標:

nuget 推入 ProjectName.1.0.0。 nupkg-符號

請務必指定主要封裝名稱,而不是符號的封裝名稱。 指令會依慣例,尋找適當的符號封裝。 命令會將 NuGet 組件庫的主要封裝和符號封裝至協力廠商 symbolsource.org 儲存機制推入。

還有什麼精采陣容

在本文中我示範了 NuGet 中有用的程式庫,從 [NuGet] 圖庫,很快地開始新的專案開發的提取。 在企業中,NuGet 適合用來組織中的各種開發人員之間共用程式碼。

但還有一個持續性迷思我需要處理的 NuGet-僅對 Web 開發人員的 NuGet。 這誤認為可能是因為此 asp 的的符號。NET MVC 3 發行版本中,但它的只是沒有,則為 true。 NuGet 不是只針對 Web 程式開發人員-它是所有的開發人員。 NuGet 支援 Windows Phone、 Silverlight 與 Windows 簡報 Foundation,在其他專案類型,且將在未來支援新的專案類型。

NuGet 是社群導向開放原始碼專案授權的 Apache 2 的授權。 專案所屬的 Outercurve 基礎,但會結合至 Microsoft 產品和計數核心參與者的數個 Microsoft 開發人員。

為了協助在 NuGet 的開發過程中,請瀏覽要深入了解如何參與以及或許甚至投稿至 NuGet 的 nuget.codeplex.com。

這份文件只觸及了什麼是採用 NuGet。 若要瞭解詳細資訊,請造訪 NuGet 文件網站,以在文件。 nuget.org (小組努力想要維護這個及接受及其文件所佔的比重)。 小組 CodePlex 討論論壇,NuGet 專案處於作用中並且歡迎您的問題。

費歐 Haack 適用於 Microsoft 身為資深程式經理 asp。NET 團隊須建置很棒的產品開發.雖然他是探究 ASP 的的許多部分。NET 中,其主要的專案都有 ASP。Net 和 NuGet 封裝管理員,這兩者發行與 OS 授權之下。時,他將他的部落格、 haacked.com,以及次文字的開放原始碼的部落格引擎上才有效軟體的相關。

因為有到下列的技術專家來檢閱這份文件: David Fowler