因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成。
以下技巧均需要在“程序包管理器控制台”中使用命令来完成。
一、改变项目目标框架后,更新程序包
当改变项目的目标框架后,无论是升级还是降级,都会导致项目中引用的组件不是最合适此框架下的版本,NuGet会自动出现一个警告提示重新更新一下组件,如何操作是指向了一个英文页面,这里就直接把页面中的关键部分拿过记录下来:
更新命令:Update-Package –reinstall <程序包名>
二、强制卸载某程序包(不管是否有依赖项)
此条其实是和下面一条合起来构成“将指定程序包降级到指定版本”。因为降级首先要卸载程序包,但是由于有可能会被其他包依赖造成无法卸载,这时可以使用下面的命令来强制卸载某程序包,不会影响其他依赖项。
强制卸载:Uninstall-Package <程序包名> -Force
三、安装指定程序包版本
默认通过图形界面安装的都是程序包的最新版本,但是有时候因为兼容性的问题,可能并不想要最新版本的程序包,这时候就可以通过以下命令来安装指定版本的程序包。
安装指定版本:Install-Package <程序包名> –Version <版本号>
其中的版本号可以通过程序包在NuGet上的页面来获取:/">http://www.nuget.org/packages/<程序包名>/
在控制台中操作时,请注意所操作的项目,以免发生莫名其妙的问题:
面向高级用户的 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 文档网站。
创建程序包的基本步骤:
- 创建一个类库项目。
- 从项目生成 NuSpec 清单。
- 更新项目的程序集元数据。
- 使用 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 存储库。
暂时就是这些。。。