無論多麼努力,Microsoft 也沒辦法提供開發人員所需要的每一個庫。 雖然 Microsoft 在全球的員工人數接近 90,000,但全球的開發人員數以百萬計。 指望 Microsoft 滿足每一個人的需求是不現實的,也不可想像。因此,開發人員通常得自己動手解決問題,他們目前已經編寫了成千上萬的實用庫,並將其發佈到 Web 上。 如何共享如此多的庫是一個令人頭痛的問題。 共享和重用代碼是一個很大的挑戰。 不相信? 請隨便走進一間中型或大型工作室,問問他們有多少日誌記錄庫。 訪問多家公司後,您將發現他們擁有比例非常高的內部日誌記錄庫,而這些庫中有一些非常不錯,例如,Log4Net、NLog 和 Error Logging Modules and Handlers(即 ELMAH)。 當一位開發人員開始新項目時,他將面對一張空白的畫布。 他如何去發現這些有用的庫? 如何將庫集成到當前項目中並管理庫的依賴項和更新呢? ELMAH 就是一個非常有用的庫,是由開發人員自己編寫的。 ELMAH 能夠在出現異常時記錄 Web 應用程序中所有未經處理的異常以及所有請求信息,例如,標頭、服務器變量等。 假設您剛剛聽說 ELMAH 並希望在下一個項目中使用它。 您可能會採取下列步驟:
真是很麻煩! 現在,假設您必須爲 10 至 15 個依賴項執行這些操作。 當您的應用程序要發佈新版本時,您需要花費大量時間爲應用程序的依賴項搜索更新。 “非我發明”(NIH) 過去常常遭到非議,而在現在聽起來卻是不錯的主意。 NuGet 應運而生NuGet 是一種 Visual Studio 擴展,它能夠簡化在 Visual Studio 項目中添加、更新和刪除庫(部署爲程序包)的操作。 NuGet 程序包是打包成一個文件的文件集,擴展名是 . nupkg,使用開放打包約定 (OPC) 格式。 OPC 僅僅是具有某些元數據的 zip 文件的首字母縮寫詞。 事實上,您可能早已熟悉 OPC,因爲 Word 和 Excel 文檔正是使用此格式。 如果您取一個 .docx 文件並將文件擴展名改爲 .zip,您實際可以打開它並瀏覽裏面的內容。 . nupkg 文件同樣如此。 NuGet 產品同樣隨附能夠輕鬆創建和發佈程序包的實用工具。 現在,我先重點介紹如何使用 NuGet 發現和安裝程序包。 之後,我將講述如何創建和發佈程序包。 安裝 NuGet要安裝 NuGet,從“Tools”(工具)|“Extension Manager”(擴展管理器)菜單選項啓動 Visual Studio Extension Manager。 單擊“Online Gallery”(聯機庫)選項卡查看可用的 Visual Studio 擴展名,如圖 1 中所示。 如您所見,NuGet 位於第一個屏幕,是排名最高的程序包。 如果情況不是如此,您可以使用右上角的搜索框找到它。 單擊“Download”(下載)按鈕安裝 NuGet。
如果您已經安裝了 ASP.NET MVC 3,則您已經安裝 NuGet。 ASP.NET MVC 3 包含 NuGet,並且 Microsoft 計劃在下一版本的 Visual Studio 中包含 NuGet。 安裝程序包我們啓動用戶友好的 NuGet 對話框以安裝程序包。 NuGet 同樣內置基於 Windows PowerShell 的控制檯,此控制檯面向高級用戶(將在下文提及)。 要啓動 NuGet,請右鍵單擊項目的引用節點,然後選擇“Manage NuGet Packages”(管理 NuGet 程序包)選項(NuGet 1.4 之前的該選項具有不同的標籤)。 這將啓動“Manage NuGet Packages”(管理 NuGet 程序包)對話框,如圖 2 中所示。
請確保選中“Online”(聯機)選項卡,並在右上角輸入搜索詞(例如,搜索來自 StackOverflow.com 的實用庫 MiniProfiler)。 找到程序包後,單擊“Install”(安裝)按鈕安裝該程序包。 NuGet 隨後下載該程序包和它的依賴項,並將任何必要更改應用到程序包指定的項目中。 NuGet 執行下列步驟安裝程序包:
當 NuGet 執行所有這些步驟後,庫將準備就緒。 很多程序包使用 WebActivator 程序包自行激活,從而最小化安裝後所需的任何配置。 您可以卸載程序包,這將使項目回到安裝程序包之前的狀態。 更新程序包在《軟件工程的事實和謬誤》(Addison-Wesley Professional,2002 年)一書中,Robert L. Glass 說:“維護工作通常約佔軟件成本的 40-80%(平均是 60%)。 因此,維護可能是軟件生命週期中最重要的階段。” 安裝程序包僅僅是故事的開始。 在今後維護這些庫時,您必須及時更新應用程序,爲庫安裝最新的 Bug 修補程序。 這需要您回答一個問題:“此項目中的哪些依賴項有可用的最新更新?” 如前所述,回答此問題一直是一項耗時的工作。 然而,有了 NuGet,您只需啓動對話框並單擊“Updates”(更新)選項卡即可看到有可用更新的程序包列表,如圖 3 所示。 單擊“Update”(更新)按鈕可將程序包更新到最新版本。
更新命令卸載舊程序包,然後安裝新程序包,確保所有依賴項都根據需要得到更新。 NuGet 在程序包管理器控制檯中提供便於控制更新的命令,例如,用以更新解決方案中的所有程序包或執行“安全”更新。 面向高級用戶的 NuGet雖然我對美觀的 GUI 對話框非常癡迷,但我知道很多開發人員非常鄙視像我一樣的鼠標操作者。 這些開發人員將命令行 shell 視作 UI,他們更願意通過這些 shell 組成命令集。 NuGet 能夠滿足這種需求,它提供基於 Windows PowerShell 的控制檯窗口(稱作程序包管理器控制檯)以及一組 Windows PowerShell 命令與 NuGet 進行交互。 Windows PowerShell 是基於 .NET 的腳本語言和命令行 shell,非常適合組成命令集,並能夠處理對象。 要啓動程序包管理器控制檯,請導航至“Tools”(工具)|“Library Package Manager”(庫程序包管理器)|“Package Manager Console”(程序包管理器控制檯)菜單選項。 列出和安裝程序包要列出和搜索程序包,請使用 Get-Package 命令。 默認情況下,該命令列出當前項目中的已安裝程序包。您可以通過指定 ListAvailable 標記和 Filter 標記聯機搜索程序包。 下列命令行搜索所有包含“MVC”的程序包: Get-Package -ListAvailable -Filter Mvc 找到要安裝的程序包後,使用 Install-Package 命令。 例如,要將 ELMAH 安裝到當前項目: Install-Package Elmah 由於 Windows PowerShell 是動態語言,它能夠提供 Tab 擴展功能,從而幫助您正確輸入命令行參數。 Tab 擴展等同於 C# 的 IntelliSense,但與基於編譯時信息的 IntelliSense 不同,您可以在運行時填充 Tab 擴展。 例如,如果您輸入 Install-Package Mvc{tab},您將看見一個列表,包含可能來自程序包源的程序包名稱,如圖 4 所示。
更新程序包程序包管理器控制檯還包含一個命令,與對話框相比,它提供更多的更新控制。 例如,無需參數即可調用此命令以更新解決方案的每個項目中的各程序包: Update-Package 此命令嘗試將每個程序包都更新到最新版本。 因此,如果您有 1.0 版本的程序包,而 1.1 和 2.0 版本在該程序包源中可用,則該命令將此程序包更新至最新的 2.0 版本。 如果任何程序包包含重大改變,這會是一項非常重大的操作。 在多數情況下,您僅希望將各程序包更新至最新的修補程序版本。 這叫“安全”更新,前提是具有較大內部版本號或修訂號(但具有相同的主版本號和次版本號)的程序包能夠向後兼容。 僅添加 Safe 標記以執行安全更新,例如: Update-Package -Safe 在這種情況下,如果您安裝了 1.0.0 版本的程序包,而 1.0.1 和 1.1 版本在該程序包源中可用,則該程序包將安全地升級至 1.0.1 而非 1.1。 Update-Package 命令還提供更精細的控制,例如,將程序包更新至特定版本而非最新版本。 用新命令擴展 Visual Studio雖然使用 Windows PowerShell 安裝程序包的功能很不錯,但這不是我們選擇 Windows PowerShell 的最主要原因。 最主要原因之一是程序包能夠將新命令添加至程序包管理器控制檯。 這些命令能夠與 Visual Studio DTE 交互以執行各種任務。 例如,安裝 MvcScaffolding 程序包時,它會將新 Scaffold Controller 命令添加至控制檯。 給定一個 Entity Framework (EF) Code First 對象,此命令生成一個控制器、控制器操作,以及 EF 對象的基本創建、讀取、更新和刪除 (CRUD) 操作對應的視圖,如圖 5 所示。
您的組織中的 NuGet由於用戶僅關注 NuGet 如何簡化與公共開發人員社區共享庫,用戶通常很容易忽視 NuGet 在企業中的作用。 畢竟,企業也沒有特殊手段能夠避免整個社區所面臨的代碼共享難題。 隨着公司的成長,平均信息量也在增加。 在同一間公司,不同的組使用各自專有版本的公司“標準”庫。 有些組可能會完全無視這些庫,而是從頭自己編寫。 問題往往不在於庫本身,而在於與其他團隊共享這些庫並通知他們更改時的麻煩。 聽起來是不是很熟悉? 程序包來源至此,我已講完如何安裝程序包,但尚未回答這樣一個明顯的問題:這些程序包在哪? 它們位於 nuget.org 的官方 NuGet 程序包庫中。 此庫公開了一個 OData 源:packages. nuget.org/v1/FeedService.svc。 OData 格式使 NuGet 客戶端能夠在客戶端上生成搜索程序包源的特定查詢,但是會在服務器上執行這些查詢。 要向 NuGet 添加更多程序包源,請導航至“Tools”(工具)|“Library Package Manager”(庫程序包管理器)|“Package Manager Settings”(程序包管理器設置)菜單選項,單擊“Package Sources”(程序包源)節點,如圖 6 所示。
默認的程序包源位於 Web 上的 OData 端點,但示例屏幕快照同樣將本地文件夾顯示爲程序包源。 NuGet 將文件夾(無論位於本地還是網絡共享位置)視爲程序包源,並在“Online”(聯機)窗格中列出文件夾中的每個程序包。 這樣一來,只需將代碼放入一個文件夾即可與他人共享,並且在測試您自己創建的程序包時同樣有用。 託管您自己的 NuGet 服務器除了在網絡共享上託管程序包之外,您還可以將網站設置爲程序包源,使用網站與組織中的其他人共享程序包。 如果有很多任務,還有一個程序包可以在此處幫到您。 首先,在 Visual Studio 中創建一個空的 ASP.NET Web 應用程序(面向 ASP.NET 4)。 使用 NuGet 安裝程序包 NuGet.Server。 此程序包將簡單的 OData 端點添加到空 Web 應用程序中。 接着,將程序包文件添加到 Web 應用程序的 Packages 文件夾,以便發佈它們並部署網站。 有關如何設置的詳細信息,請參閱 NuGet 的文檔站點 bit.ly/jirmLO。 如果您希望部署類似 nuget.org 的完整庫體驗,NuGet 庫代碼還可通過 nugetgallery.codeplex.com 項目作爲開放源項目提供。 通過託管專用 NuGet 服務器或庫實施,您可以方便地在公司內部共享專有代碼,無需公開發布。 創建程序包NuGet 發揮作用的前提是有程序包可供安裝。 NuGet 中的有用程序包越多,NuGet 對每一位開發人員的價值越大。 這就是 NuGet 團隊不辭勞苦儘可能創建使用方便的程序包的原因。 雖然程序包的創建不難,但 NuGet 團隊一直在對其功能進行投資,以使之更加簡單。 他們已開發若干用於創建 NuGet 程序包的工具。例如,Package Explorer 是 NuGet 團隊的開發人員編寫的一個 ClickOnce 應用程序,使用者可以憑藉它在創建或測試程序包時進行可視化操作。 您可以在 npe.codeplex.com 下載該應用程序。 NuGet.exe由於大多數程序包作者都希望將程序包的創建集成到生成流程,讓我們看看使用 NuGet 命令行實用工具的其他方法。 您僅需從 bit.ly/gmw54b 下載一次該實用工具。 下載 NuGet.exe 後,請確保將其放入已添加至 PATH 環境變量的文件夾。 我針對此類實用工具創建了一個名爲“utils”的文件夾。 我之所以說只需下載 NuGet.exe once 一次(每臺計算機一次),是因爲它是自行更新的可執行程序。 如果出現更新的版本,僅需運行以下命令,NuGet 即會聯機檢查並自行更新至最新版本: nuget update –self 該命令行工具能夠查詢類似程序包管理器控制檯的聯機源。 例如,要搜索帶“MVC”的所有程序包,可使用以下命令: nuget list Mvc NuGet.exe 甚至能夠下載程序包和依賴項並解壓縮它們,但它不能將項目修改爲引用已下載的程序包程序集或運行程序包中包含的任何 Windows PowerShell 腳本。 從項目創建程序包程序包在 90% 的情況下僅包含一個程序集(據本人統計)。 此部分講述使用 NuGet.exe 針對項目文件(例如,.csproj 或 .vbproj 文件)創建上述程序包的簡單流程。 有關創建較複雜程序包(例如,針對不同 .NET Framework 版本的單個程序包)的詳細信息,請參閱 docs.nuget.org 的 NuGet 文檔網站。 創建程序包的基本步驟:
創建類庫項目。要共享程序集,首先要創建類庫項目。 NuGet 可以壓縮多個項目類型,但共享代碼時最常見的情況是使用類庫。 創建程序包後,務必打開 AssemblyInfo.cs 文件以更新程序集的元數據。 創建 NuSpec 清單。NuSpec 文件是程序包清單,包含與程序包有關的重要元數據(例如,作者、描述和程序包依賴項)。 自己動手創建 NuSpec 格式很簡單,但使用 spec 命令創建此文件更加方便。 確保在項目文件所在目錄中運行命令: nuget spec 在此特定情況下,由於 spec 命令從項目文件生成 NuSpec,它會包含某些元數據的佔位符,如圖 7 中所示。 圖 7:生成的 NuSpec 文件
請勿編輯包含佔位符的字段,但應在其他字段(例如,licenseUrl、projectUrl、iconUrl 和 tags)中填入正確的值。 更新項目的程序集元數據。每個程序集都有與其關聯的元數據。 NuGet 能夠讀取這些程序集元數據並在創建程序包時將其合併到 NuSpec 清單,從而確保了此信息始終在您的程序包和程序集中保持同步。 如此前所述,此信息通常位於名爲 AssemblyInfo.cs 的文件中。 圖 8 中的表顯示了程序集元數據和 NuSpec 佔位符值之間的對應關係。 圖 8:映射到 NuSpec 的程序集元數據
與其他字段不同,$id$ 字段並非從程序集屬性提取,而是設置爲程序集名稱。 創建程序包。在項目文件和 NuSpec 文件所在目錄中,運行以下命令以創建程序包: nuget pack ProjectName.csproj 如果同一個目錄中只有一個項目文件,則在運行命令時可以省略項目文件名稱。 如果尚未編譯項目,可先用 Build 標記編譯項目,然後壓縮它。 這將在運行 pack 命令之前編譯項目: nuget pack ProjectName.csproj -Build 此命令將生成名爲 ProjectName.{version}. nupkg 的文件,其中,{version} 的值與 AssemblyVersionAttribute 中指定的值相同。 例如,如果版本是 1.0.0,您的程序包將命名爲 ProjectName.1.0.0. nupkg。 您可以在操作後使用 Package Explorer 檢查程序包,以確保創建正確。 爲了方便開發人員安裝您的程序包,請考慮使用 Symbols 標記創建帶調試器符號的程序包: nuget pack ProjectName.csproj -Build -Symbols 除了主程序包之外,此命令還創建符號程序包。 這使安裝您的程序包的其他人在調試其應用程序時能夠單步執行程序包代碼。 發佈程序包創建程序包後,您可能希望與全世界共享。 NuGet.exe 專門針對此目的提供一條發佈命令。 發佈之前,您需要在 nuget.org 上創建一個帳戶。 註冊帳戶後,單擊指向您的帳戶的鏈接以查看您的訪問密鑰。 此密鑰非常重要,因爲向 nuget.exe 命令標識庫,並且是可撤消的密碼。 一旦擁有自己的密鑰後,請使用以下命令將其存儲在安全的位置: nuget setApiKey b688a925-0956-40a0-8327-ff2251cf5f9a 存儲密鑰後,使用 push 命令將您的程序包發佈到庫: nuget push ProjectName.1.0.0. nupkg 在庫上載程序包之前,該命令將驗證庫的 API 密鑰。 如果您創建了前述符號程序包,則應在對程序包執行 push 命令時指定 Symbols 標記: nuget push ProjectName.1.0.0. nupkg -Symbols 確保指定主程序包名稱而非符號程序包名稱。 依照慣例,此命令查找特定的符號程序包。 此命令將主程序包推送到 NuGet 庫,並將符號程序包推送到合作伙伴的 symbolsource.org 存儲庫。 後序在本文中,我演示了 NuGet 如何從 NuGet 庫提取有用的庫以助推新項目開發的啓動。 在企業內部,NuGet 可用於在組織中的不同開發人員之間共享代碼。 但是我需要指出,大家對 NuGet 存在一種固有的誤解:NuGet 僅適合 Web 開發人員。 該誤解可能源於它隨附在 ASP.NET MVC 3 版本中,但這種觀點是錯誤的。 NuGet 並非僅針對 Web 開發人員,而是所有開發人員。 NuGet 支持 Windows Phone、Silverlight、Windows Presentation Foundation 以及其他項目類型,並將在今後支持新的項目類型。 NuGet 是社區驅動的開放源碼項目,通過 Apache 2 許可註冊。 該項目屬於 Outercurve Foundation,但已集成到 Microsoft 的產品,並且若干 Microsoft 開發人員已成爲它的核心參與者。 若希望幫助 NuGet 的開發,請訪問 nuget.codeplex.com 以瞭解如何參與其中以及如何對 NuGet 做出貢獻。 本文章僅對 NuGet 的功能進行了初步探討。 要了解更多信息,請訪問 docs. nuget.org 的 NuGet 文檔網站(開發團隊在對其進行精心維護,並接受對其文檔的貢獻)。 開發團隊積極參與 CodePlex 討論論壇中有關 NuGet 項目的討論,並歡迎您提出有關問題。 Phil Haack 是 Microsoft ASP.NET 團隊的高級項目經理,專注於爲開發人員創建優秀的產品。他參與 ASP.NET 很多領域的工作,他的主要項目是 ASP.NET MVC 和 NuGet 程序包管理器,這兩個產品均通過 OSS 許可證發佈。在工作之餘,他會在博客 (haacked.com) 上寫有關軟件的文章,並研究 Subtext 開放源碼博客引擎。 衷心感謝以下技術專家對本文的審閱: David Fowler |
使用 NuGet 管理項目庫
|
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
男人們看過來!如何讓妳的女人更性福
SteveSapp9
2022-10-14 17:15:10
nbvnvb nvb nvnb vnvnbvnbv vnb
wbsbydw
2022-06-20 08:54:27
將台灣列“主要非北約盟邦”!美議員提案“最大幅修訂”對台政策
SteveSapp9
2022-06-18 17:02:15
dsdsdsd
xpvjhudosp
2022-06-18 06:49:40
WTGE QFWGEWHR
lemonkawsar80
2022-06-18 05:43:58
dsdsdsdsd
xpvjhudosp
2022-06-18 03:04:41
jfjdxfhfhfh
tenoxop591
2022-06-17 22:27:02
asfghjfyhghfr
jeffreycklima
2022-06-17 06:12:23
WRGE DBTRB RT45
edsa46457
2022-06-17 04:15:08
EDHTN DTNEHE TRH
edsa46457
2022-06-17 03:54:00
台中約炮#台中舒壓賴w8433 或賴076644 《telegram聊色群:nnw8433 》
xc7794
2022-06-15 15:01:10
Panimula sa online na pagsusugal na matematika
funbc168.anna
2022-06-13 11:55:47
ftghgyrdtterytffgh
inforaiyan14
2022-06-13 06:53:05
TRUMP want to work again for us.
edsa46457
2022-06-12 20:54:34