Nuget 命令 NuGet 管理項目庫


因為可視化庫程序包管理器的局限性,有很多需要的功能在界面中無法完成。

以下技巧均需要在“程序包管理器控制台”中使用命令來完成。

一、改變項目目標框架后,更新程序包

當改變項目的目標框架后,無論是升級還是降級,都會導致項目中引用的組件不是最合適此框架下的版本,NuGet會自動出現一個警告提示重新更新一下組件,如何操作是指向了一個英文頁面,這里就直接把頁面中的關鍵部分拿過記錄下來:

 

更新命令:Update-Package –reinstall <程序包名>

 

二、強制卸載某程序包(不管是否有依賴項)

此條其實是和下面一條合起來構成“將指定程序包降級到指定版本”。因為降級首先要卸載程序包,但是由於有可能會被其他包依賴造成無法卸載,這時可以使用下面的命令來強制卸載某程序包,不會影響其他依賴項。

 

強制卸載:Uninstall-Package <程序包名> -Force

 

三、安裝指定程序包版本

默認通過圖形界面安裝的都是程序包的最新版本,但是有時候因為兼容性的問題,可能並不想要最新版本的程序包,這時候就可以通過以下命令來安裝指定版本的程序包。

 

安裝指定版本:Install-Package <程序包名> –Version <版本號>

 

其中的版本號可以通過程序包在NuGet上的頁面來獲取:/">http://www.nuget.org/packages/<程序包名>/

 

在控制台中操作時,請注意所操作的項目,以免發生莫名其妙的問題:

image

面向高級用戶的 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 所示。

 
圖 4:Tab 擴展的程序包列表

更新程序包

程序包管理器控制台還包含一個命令,與對話框相比,它提供更多的更新控制。 例如,無需參數即可調用此命令以更新解決方案的每個項目中的各程序包:

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 所示。

 
圖 5:運行中的 MvcScaffolding Custom Scaffold 命令

您的組織中的 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 所示。

 
圖 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 文檔網站。

創建程序包的基本步驟:

  1. 創建一個類庫項目。
  2. 從項目生成 NuSpec 清單。
  3. 更新項目的程序集元數據。
  4. 使用 NuGet.exe 創建程序包。

創建類庫項目。要共享程序集,首先要創建類庫項目。 NuGet 可以壓縮多個項目類型,但共享代碼時最常見的情況是使用類庫。 創建程序包后,務必打開 AssemblyInfo.cs 文件以更新程序集的元數據。

創建 NuSpec 清單。NuSpec 文件是程序包清單,包含與程序包有關的重要元數據(例如,作者、描述和程序包依賴項)。 自己動手創建 NuSpec 格式很簡單,但使用 spec 命令創建此文件更加方便。 確保在項目文件所在目錄中運行命令:

  nuget spec

在此特定情況下,由於 spec 命令從項目文件生成 NuSpec,它會包含某些元數據的占位符,如圖 7 中所示。

圖 7:生成的 NuSpec 文件

 
<?xml version="1.0"?>
<package xmlns=
  "http://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 和 tags)中填入正確的值。

更新項目的程序集元數據。每個程序集都有與其關聯的元數據。 NuGet 能夠讀取這些程序集元數據並在創建程序包時將其合並到 NuSpec 清單,從而確保了此信息始終在您的程序包和程序集中保持同步。

如此前所述,此信息通常位於名為 AssemblyInfo.cs 的文件中。 圖 8 中的表顯示了程序集元數據和 NuSpec 占位符值之間的對應關系。

圖 8:映射到 NuSpec 的程序集元數據

標記
$id$ 程序集名稱。
$title$ AssemblyTitleAttribute 中指定的程序集標題。
$version$ 程序集的 AssemblyVersionAttribute 中指定的程序集版本。
$author$ AssemblyCompanyAttribute 中指定的公司。
$description$ AssemblyDescriptionAttribute 中指定的描述。

與其他字段不同,$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 存儲庫。

暫時就是這些。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM