使用 NuGet 管理项目库
无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库。 虽然 如何共享如此多的库是一个令人头痛的问题。 共享和重用代码是一个很大的挑战。 不相信? 请随便走进一间中型或大型工作室,问问他们有多少日志记录库。 访问多家公司后,您将发现他们拥有比例非常高的内部日志记录库,而这些库中有一些非常不错,例如,Log4Net、NLog 当一位开发人员开始新项目时,他将面对一张空白的画布。 他如何去发现这些有用的库? 如何将库集成到当前项目中并管理库的依赖项和更新呢? ELMAH 就是一个非常有用的库,是由开发人员自己编写的。 ELMAH 您可能会采取下列步骤:
真是很麻烦! 现在,假设您必须为 “非我发明”(NIH) 过去常常遭到非议,而在现在听起来却是不错的主意。 NuGet 应运而生NuGet 是一种 Visual Studio 扩展,它能够简化在 Visual Studio 项目中添加、更新和删除库(部署为程序包)的操作。 NuGet OPC 仅仅是具有某些元数据的 zip 文件的首字母缩写词。 事实上,您可能早已熟悉 NuGet 产品同样随附能够轻松创建和发布程序包的实用工具。 现在,我先重点介绍如何使用 安装 NuGet要安装 NuGet,从“Tools”(工具)|“Extension Manager”(扩展管理器)菜单选项启动 Visual Studio Extension Manager。 单击“Online 如果您已经安装了 ASP.NET MVC 3,则您已经安装 NuGet。 ASP.NET 安装程序包我们启动用户友好的 NuGet 对话框以安装程序包。 NuGet 要启动 NuGet,请右键单击项目的引用节点,然后选择“Manage NuGet Packages”(管理 NuGet 程序包)选项(NuGet 1.4 之前的该选项具有不同的标签)。 这将启动“Manage 请确保选中“Online”(联机)选项卡,并在右上角输入搜索词(例如,搜索来自 StackOverflow.com 的实用库 MiniProfiler)。 找到程序包后,单击“Install”(安装)按钮安装该程序包。 NuGet NuGet 执行下列步骤安装程序包:
当 NuGet 执行所有这些步骤后,库将准备就绪。 很多程序包使用 您可以卸载程序包,这将使项目回到安装程序包之前的状态。 更新程序包在《软件工程的事实和谬误》(Addison-Wesley Professional,2002 年)一书中,Robert L. Glass 安装程序包仅仅是故事的开始。 在今后维护这些库时,您必须及时更新应用程序,为库安装最新的 如前所述,回答此问题一直是一项耗时的工作。 然而,有了 更新命令卸载旧程序包,然后安装新程序包,确保所有依赖项都根据需要得到更新。 NuGet 在程序包管理器控制台中提供便于控制更新的命令,例如,用以更新解决方案中的所有程序包或执行“安全”更新。 面向高级用户的 NuGet虽然我对美观的 GUI 对话框非常痴迷,但我知道很多开发人员非常鄙视像我一样的鼠标操作者。 这些开发人员将命令行 NuGet 能够满足这种需求,它提供基于 Windows PowerShell 的控制台窗口(称作程序包管理器控制台)以及一组 Windows PowerShell 命令与 NuGet 要启动程序包管理器控制台,请导航至“Tools”(工具)|“Library Package Manager”(库程序包管理器)|“Package Manager Console”(程序包管理器控制台)菜单选项。 列出和安装程序包要列出和搜索程序包,请使用 Get-Package 命令。 默认情况下,该命令列出当前项目中的已安装程序包。您可以通过指定 Get-Package -ListAvailable -Filter Mvc 找到要安装的程序包后,使用 Install-Package 命令。 例如,要将 Install-Package Elmah 由于 Windows PowerShell 是动态语言,它能够提供 Tab 扩展功能,从而帮助您正确输入命令行参数。 Tab 例如,如果您输入 Install-Package Mvc{tab},您将看见一个列表,包含可能来自程序包源的程序包名称,如图 更新程序包程序包管理器控制台还包含一个命令,与对话框相比,它提供更多的更新控制。 例如,无需参数即可调用此命令以更新解决方案的每个项目中的各程序包: Update-Package 此命令尝试将每个程序包都更新到最新版本。 因此,如果您有 如果任何程序包包含重大改变,这会是一项非常重大的操作。 在多数情况下,您仅希望将各程序包更新至最新的修补程序版本。 这叫“安全”更新,前提是具有较大内部版本号或修订号(但具有相同的主版本号和次版本号)的程序包能够向后兼容。 仅添加 Update-Package -Safe 在这种情况下,如果您安装了 1.0.0 版本的程序包,而 1.0.1 和 1.1 版本在该程序包源中可用,则该程序包将安全地升级至 1.0.1 而非 1.1。 Update-Package 命令还提供更精细的控制,例如,将程序包更新至特定版本而非最新版本。 用新命令扩展 Visual Studio虽然使用 Windows PowerShell 安装程序包的功能很不错,但这不是我们选择 Windows PowerShell 的最主要原因。 最主要原因之一是程序包能够将新命令添加至程序包管理器控制台。 这些命令能够与 例如,安装 MvcScaffolding 程序包时,它会将新 Scaffold Controller 命令添加至控制台。 给定一个 您的组织中的 NuGet由于用户仅关注 NuGet 如何简化与公共开发人员社区共享库,用户通常很容易忽视 NuGet 在企业中的作用。 毕竟,企业也没有特殊手段能够避免整个社区所面临的代码共享难题。 随着公司的成长,平均信息量也在增加。 在同一间公司,不同的组使用各自专有版本的公司“标准”库。 有些组可能会完全无视这些库,而是从头自己编写。 问题往往不在于库本身,而在于与其他团队共享这些库并通知他们更改时的麻烦。 听起来是不是很熟悉? 程序包来源至此,我已讲完如何安装程序包,但尚未回答这样一个明显的问题:这些程序包在哪? 它们位于 OData 格式使 NuGet 客户端能够在客户端上生成搜索程序包源的特定查询,但是会在服务器上执行这些查询。 要向 NuGet 添加更多程序包源,请导航至“Tools”(工具)|“Library Package Manager”(库程序包管理器)|“Package Manager Settings”(程序包管理器设置)菜单选项,单击“Package 默认的程序包源位于 Web 上的 OData 端点,但示例屏幕快照同样将本地文件夹显示为程序包源。 NuGet 托管您自己的 NuGet 服务器除了在网络共享上托管程序包之外,您还可以将网站设置为程序包源,使用网站与组织中的其他人共享程序包。 如果有很多任务,还有一个程序包可以在此处帮到您。 首先,在 接着,将程序包文件添加到 Web 应用程序的 Packages 文件夹,以便发布它们并部署网站。 有关如何设置的详细信息,请参阅 如果您希望部署类似 nuget.org 的完整库体验,NuGet 库代码还可通过 nugetgallery.codeplex.com 项目作为开放源项目提供。 通过托管专用 NuGet 服务器或库实施,您可以方便地在公司内部共享专有代码,无需公开发布。 创建程序包NuGet 发挥作用的前提是有程序包可供安装。 NuGet NuGet.exe由于大多数程序包作者都希望将程序包的创建集成到生成流程,让我们看看使用 NuGet 命令行实用工具的其他方法。 您仅需从 我之所以说只需下载 NuGet.exe once 一次(每台计算机一次),是因为它是自行更新的可执行程序。 如果出现更新的版本,仅需运行以下命令,NuGet nuget update –self 该命令行工具能够查询类似程序包管理器控制台的联机源。 例如,要搜索带“MVC”的所有程序包,可使用以下命令: nuget list Mvc NuGet.exe 甚至能够下载程序包和依赖项并解压缩它们,但它不能将项目修改为引用已下载的程序包程序集或运行程序包中包含的任何 Windows PowerShell 脚本。 从项目创建程序包程序包在 90% 的情况下仅包含一个程序集(据本人统计)。 此部分讲述使用 有关创建较复杂程序包(例如,针对不同 .NET Framework 版本的单个程序包)的详细信息,请参阅 docs.nuget.org 创建程序包的基本步骤:
创建类库项目。要共享程序集,首先要创建类库项目。 NuGet 创建 nuget spec 在此特定情况下,由于 spec 命令从项目文件生成 NuSpec,它会包含某些元数据的占位符,如图 图 7:生成的 NuSpec 文件
请勿编辑包含占位符的字段,但应在其他字段(例如,licenseUrl、projectUrl、iconUrl 和 tags)中填入正确的值。 更新项目的程序集元数据。每个程序集都有与其关联的元数据。 NuGet 如此前所述,此信息通常位于名为 AssemblyInfo.cs 的文件中。 图 图 8:映射到 NuSpec 的程序集元数据
与其他字段不同,$id$ 字段并非从程序集属性提取,而是设置为程序集名称。 创建程序包。在项目文件和 nuget pack ProjectName.csproj 如果同一个目录中只有一个项目文件,则在运行命令时可以省略项目文件名称。 如果尚未编译项目,可先用 Build 标记编译项目,然后压缩它。 这将在运行 nuget pack ProjectName.csproj -Build 此命令将生成名为 ProjectName.{version}. nupkg 为了方便开发人员安装您的程序包,请考虑使用 Symbols 标记创建带调试器符号的程序包: nuget pack ProjectName.csproj -Build -Symbols 除了主程序包之外,此命令还创建符号程序包。 这使安装您的程序包的其他人在调试其应用程序时能够单步执行程序包代码。 发布程序包创建程序包后,您可能希望与全世界共享。 NuGet.exe 注册帐户后,单击指向您的帐户的链接以查看您的访问密钥。 此密钥非常重要,因为向 一旦拥有自己的密钥后,请使用以下命令将其存储在安全的位置: nuget setApiKey b688a925-0956-40a0-8327-ff2251cf5f9a 存储密钥后,使用 push 命令将您的程序包发布到库: nuget 在库上载程序包之前,该命令将验证库的 API 密钥。 如果您创建了前述符号程序包,则应在对程序包执行 nuget 确保指定主程序包名称而非符号程序包名称。 依照惯例,此命令查找特定的符号程序包。 此命令将主程序包推送到 后序在本文中,我演示了 NuGet 如何从 NuGet 库提取有用的库以助推新项目开发的启动。 在企业内部,NuGet 但是我需要指出,大家对 NuGet 存在一种固有的误解:NuGet 仅适合 Web 开发人员。 该误解可能源于它随附在 NuGet 是社区驱动的开放源码项目,通过 Apache 2 许可注册。 该项目属于 若希望帮助 NuGet 的开发,请访问 nuget.codeplex.com 以了解如何参与其中以及如何对 NuGet 做出贡献。 本文章仅对 NuGet 的功能进行了初步探讨。 要了解更多信息,请访问 Phil 衷心感谢以下技术专家对本文的审阅: David |
使用 NuGet 管理项目库的更多相关文章
- 【VS开发】使用 NuGet 管理项目库
NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Microsoft 在全球的员工人数接近 90,000, ...
- Nuget 命令 NuGet 管理项目库
因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成. 以下技巧均需要在"程序包管理器控制台"中使用命令来完成. 一.改变项目目标框架后,更新程序包 当改变项目的目标 ...
- 【转】使用 NuGet 管理项目库-Phil Haack
原文地址:https://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 ...
- [转载]使用 NuGet 管理项目库
原文:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx 无论多么努力,Microsoft 也没办法提供开发人员所需要的每一个库. 虽然 Mi ...
- 在Visual Studio中使用NuGet管理项目库
NuGet是用来管理项目中引用的各个组件插件什么什么东西的东西,最近使用以后发现对于项目引用的维护非常方便. 暂时转一篇MSDN的文章,其实这个文章的内容就够了: http://msdn.micros ...
- 使用NuGet管理项目类库引用
NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2012 ,VS2013中默认集成了N ...
- 转一篇dudu大人的文章:程序员,用NuGet管理好你的包包
每个女人都有很多包包:其实男人也有,但只有会写程序的男人才有 —— 代码世界中的大“包”小“包”.这些大包小包,有花钱买的,有从开源市场淘的,也有自己或同事亲手制作的. 包包有个特点:容易坏,更新快, ...
- Nuget~管理自己的包包~丢了的包包快速恢复
之前写过一篇Nuget~管理自己的包包的文章,今天来讲Nuget的另一个东西,就是找回丢失的DLL,我们在引用包包后,在当前解决方案根目录就生成一个packages的目前,里面有我们从nuget下载的 ...
- NuGet管理
使用NuGet管理项目类库引用 NuGet 是微软开发平台(包括.NET平台)的一个包管理器,这里只介绍和.NET相关的NuGet Visual Studio扩展客户端, 在VS2010 ,VS2 ...
随机推荐
- 将Linux下编译的warning警告信息输出到文件中[整理笔记]
Linux中,脚本语言环境中,即你用make xxx即其他一些普通linux命令,比如ls,find等,不同的数字,代表不同的含义: 数字 含义 标准叫法0 标准输入 stdin = standar ...
- mysql 存储过程 动态sql例子
proc:BEGIN ; ; ; ) DEFAULT ''; ) DEFAULT ''; ) DEFAULT '';#插入日志的表,一个活动一张表 #将局部变量转换成会话变量 #动态sql语言只接受会 ...
- 2014上半年acm总结(1)(入门+校赛)
大一下学期才开始了acm,不得不说有一点迟,但是acm确实使我的生活充实了很多,,不至于像以前一样经常没事干= = 上学期的颓废使我的c语言学的渣的一笔..靠考前突击才基本掌握了语法 寒假突然醒悟, ...
- LFM 隐语义模型
隐语义模型: 物品 表示为长度为k的向量q(每个分量都表示 物品具有某个特征的程度) 用户兴趣 表示为长度为k的向量p(每个分量都表示 用户对某个特征的喜好程度) 用户u对物品i的兴趣 ...
- java操作mysql的增删改查
prepareStatement(sql)是statement的子类,比statement好用. 如果数据库中定义的是int值,那么sql语句中要把int单独提出来.如".....value ...
- javascript第三课underfind和类型获取
1.underfind一般发生于变量定义之后未赋值,因此变量的值就为underfind 2.var obj=new object(); 此时使用obj点,可以获取到obj对象的一些方法,使用alert ...
- AngularJs(七) 模块的创建
module 目前我选编写的都是在AngularJs-1.5版本,如有疑问可以联系我. 理解模块的生命周期. config 和 run 方法是模块调用时加载的方法.那么module的执行顺序是怎么样呢 ...
- JVM学习之堆和栈
Java栈与堆 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快, ...
- this指针与function变量--this究竟指向哪里?
参考文章:<深入浅出 JavaScript 中的 this> http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/ Ja ...
- keyDown keyPress keyUp 事件的区别
keyDown keyPress keyUp 事件的区别 一 触发顺序 显而易见,事件发生的顺序是: keydown --> keypress --> keyup 当按住一个键一段时间后 ...