转一篇dudu大人的文章:程序员,用NuGet管理好你的包包

每个女人都有很多包包;其实男人也有,但只有会写程序的男人才有 ——
代码世界中的大“包”小“包”。这些大包小包,有花钱买的,有从开源市场淘的,也有自己或同事亲手制作的。

包包有个特点:容易坏,更新快,新品多。于是,市场上有了包包专卖店,家里有了专门放包包的衣橱。于是,女人经常逛街买包包,经常整理衣橱里的包包。而男人呢,不喜欢逛街,不喜欢整理。。。面对越来越多的包包,很多人发出感叹:做“会写程序的男人”难!

终于有人无法忍受这些大包小包的困扰,一款专门存放包包的“储包柜”横空出世 —— NuGet(http://nuget.codeplex.com/)。读音-“New-Get”,中文翻译-“新买的(包包)”,意指不管有多少包包,想扔就扔,想买就买,有NuGet帮您打理。

会写程序员的您,被包包困扰了吗?用NuGet吧。不仅免费,而且开源 —— 可以随心所欲地改装成自己喜欢的储包柜。

使用NuGet有两种方式

一种是大家熟知的在线免费包包专卖店 —— http://nuget.org/List/Packages,通过VS2010插件NuGet Package Manager可以方便地选用自己的包包。

一种是在公司或自己家里安装一个储包柜 —— 架设自己的NuGet服务器。如何架设自己的NuGet服务器,可以参考园子的两篇文章:

1. 在内部架设NuGet服务器

秀一下博客园开发团队的储包柜

2011年6月的某一天,博客园开发团队也有了自己的储包柜。

目前储包柜中主要存放的是一个很重要的包包 ——
CNBlogsDomain,它包含我们的领域驱动开发(DDD)架构中的公共部分,被各个应用开发项目引用。

在没有NuGet的日子里。。。

  • 我们要将CNBlogsDomain编译出的多个dll文件复制到各个项目的引用文件夹中。每次更新CNBlogsDomain,都要这样。

有了NuGet,生活从此改变。。。 

1. 向自家的NuGet服务器发布CNBlogsDomain包包

  • 在CNBlogsDomain中建立一个publish文件夹。

  • 下载NuGet打包器至publish文件夹(NuGet.exe, 立即下载)。

  • 下载NuGetPackageUploader.exe包包上传器(立即下载)至publish文件夹,该“包包上传器”由园子里的lovecindywang开发(源代码下载)。

  • 修改NuGetPackageUploader.exe.config,将endpoint address改为你的NuGet服务器地址。

  • 在publish文件夹中创建一个NuGetRelease.bat批处理文件,完成包包的制作与上传。示例代码如下:

    nuget pack ..\CNBlogs.Domain.Core\CNBlogs.Domain.Core.csproj
    NuGetPackageUploader .

  • 发布包包时,只需运行NuGetRelease.bat,nuget命令会根据.csproj文件自动完成打包,NuGetPackageUploader会将当前文件夹中的所有包包(.nupkg文件)上传至NuGet服务器。

2. 在项目中选用自家NuGet服务器上的包包

  • 安装VS2010插件NuGet Package Manager,并在Package Manager的Package
    Sources添加自家NuGet服务器存放“包包”的网址。

  • 在相应的项目中选用所需的“包包”并安装。

  • 安装完成之后,NuGet会在当前项目的文件夹中生成一个packages.config(表示当前项目用了哪些包包),文件格式如下:

  • <?xml version="1.0" encoding="utf-8"?>
    <packages>
    <package id="CNBlogs.Domain.Core" version="1.0.0.1"/>
    </packages>

    并在当前解决方案的根目录下生成packages文件夹,选用的包包会被下载到这里,还会生成一个repositories.config文件(存储的是每个packages.config的位置),文件格式如下:

    <?xml version="1.0" encoding="utf-8"?>
    <repositories>
    <repository path="..\CNBlogs.Applicaion.Demo\packages.config"/>
    </repositories>

    这样就用起了自家的包包。

3. 包包的升级

这里继续假设我们的包包名叫CNBlogsDomain。

  • 首先,我们在CNBlogsDomain中修改相应的Assembly的版本号并编译,表明这是一个新款包包。

  • 然后,运行上面提到的NuGetRelease.bat批处理文件,将新款包包发布至NuGet服务器。

  • 接着,在使用这个包包的项目中通过VS2010打开Package Manage
    Console运行Update-Package命令更新为新款包包。NuGet会自动删除packages文件夹中的旧版包包,并下载新版包包。

?在使用中遇到的问题

-a. 根据配置文件repositories.config自动下载包包

问题场景:

一个人在一个项目中添加好所有包包之后,只想把NuGet相关配置文件(repositories.config与packages.config文件)放到代码版本库中,packages文件夹中的包包不放进去。另一个人签出代码后,需要重新下载这些包包,而NuGet命令只提供根据packages.config下载包包的功能(repositories.config分散在各个子项目文件夹中),并没有提供根据repositories.config下载包包的功能(repositories.config存储的就是packages.config文件的位置)。

解决方法:

写了一个批处理文件(install.bat)放在packages文件夹中,通过PowerShell脚本读取repositories.config,得到各个packages.config的位置,然后传给NuGet命令。代码如下:

powershell.exe -command"[xml]$config = Get-Content repositories.config;
foreach( $repository in $config.repositories.repository){ .\NuGet install $repository.path} "

(为什么不直接写在.ps1文件中?是为了跳过PowerShell的执行限制, 不然要先执行一下Set-ExecutionPolicy
RemoteSigned)

-b. 不改版本号,也能更新包包

问题场景:

NuGet每次更新包包,必须要发布一个不同版本号的包包。有时我们只进行了很少的改动,不想修改版本号。

临时解决方法:

继续使用上一个问题中的批处理文件,执行前删除packages文件夹中所有的包包,然后重新下载所有包包。

--进一步的解决方法需要去修改NuGet的源代码。

小结

程序员可以通过NuGet管理好自己的包包,那女人该如何管理好自己的包包呢?

程序员的天性是喜欢解决问题,不仅仅是通过代码解决问题。如果你是会写程序的男人,把你在代码世界中的智慧带回现实世界,帮助你喜欢的女人解决问题。

原文地址:http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html

时间: 2025-01-07 11:13:01

转一篇dudu大人的文章:程序员,用NuGet管理好你的包包的相关文章

负能量程序员杂谈(2)- 管理中的情和义

本系列文章仅从个人有限的对事物的认知出发,如有不同意见,请温和提出态度,毕竟都是成年人,别那么幼稚. 情和义,值千金. 今天和很久没见的朋友L喝酒,L目前是一家不错公司的开发管理,手下10几号开发.中途他给我聊了一个很有意思的话题:公司正在转型,那么由于成本压缩控制会裁掉一些人,由于担心裁人会引发和公司矛盾,所以这种事交于开发小组的小组长负责沟通,有的小组长碍于情面,觉得不好意思落下脸面,他就出马负责和即将被裁掉的程序员沟通.我问他为什么不是HR去搞定这个事呢?他告诉我,之前发生过因为HR去沟通

一个程序员的时间管理

原文地址:http://www.myexception.cn/other/1391133.html 如果每天都有86400元进入你的银行户头,而你必须当天用光,你会如何运用这笔钱? 天下真有这样的好事吗? 是的,而且这种好事每天都在发生着,你真的有这样一个户头,那就是“时间”.每天每一个人都会有新的86400秒进账,而这86400秒的价值要远远的大于86400元.那么,面对这样的一大笔财富.你打算怎样利用它们呢? 其实吧,我并不知道你是如何利用它们,但我知道我自己是如何利用的,下面把我的一些时间

黑马程序员-OC内存管理 @property的增强

涉及到内存管理,只读,多线程等很多功能时,setter和getter方法也就没那么简单了:当然@property依然强大,很好用: 1:内存管理相关参数: *:retain:  (如果是oc对象类型),生成的setter会自动release旧值,retain新值: *:assign:(适用于非oc对象)  这个是默认的值 *:copy:release旧值,copy新值: @property (retain) NSString *name; // 同类型的参数不能同时写 // @property

谈谈程序员的自我管理

 讲到管理,很多人会莫名的涌起一股崇敬感,这大概源于公司的高层,都被称为管理层,高高在上,拿着天文薪水,一天开没完没了的会议,个个看来都很高深的样子. 其实这些只是表面现象,羡慕的来源其实是围城外的人向往围城内的人,围城里面不一定好,举个例子来说,我有些做经理的朋友,不止一次感叹,什么时候能痛痛快快的再编码一次,那可怜的样子真不是装的. 职位越高,责任越大,责任越大压力越大,我们可以举一个例子来说,什么叫责任和压力.比如说今天中午组内成员想去聚会吃饭,大家一致推举你做决策人,你来找地方. 这

《从程序员到项目经理》读后感-程序员的自我管理

(总是会遇到各种各样的事情来牵绊我,周一回家,周二忘记拿电脑,周三有个<GOOGLE测试之道>需要研究,有很多外力要阻拦我继续写博客,捣乱的事天天有,道心要坚定呀,小伙子) 讲到管理,很多人会莫名的涌起一股崇敬感,这大概源于公司的高层,都被称为管理层,高高在上,拿着天文薪水,一天开没完没了的会议,个个看来都很高深的样子. 其实这些只是表面现象,羡慕的来源其实是围城外的人向往围城内的人,围城里面不一定好,举个例子来说,我有些做经理的朋友,不止一次感叹,什么时候能痛痛快快的再编码一次,那可怜的样子

程序员生存定律--管理向左,技术向右

程序员生存定律这系列的目录在这里:程序员生存定律--目录 喜欢从头瞄的,可以移步. ------------------------------------------------------------------------------- 一个程序员在考虑增值时无法回避的一个根本问题是到底是做技术还是做管理.当然也有些职位会介于两者之间比如架构师,但我们暂时不去做细分,而是用简单的二分法. 这种基本方向上的选择对后续很多细节上的取舍有关键影响,所以在考虑其他之前,最好先回答一下这个问题.这就

黑马程序员——交通灯管理

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 ... 信号灯忽略黄灯,只考虑红灯和绿灯. 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制. 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑. 注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆. 每辆车通过路口时间为1秒(提示:可通过线程Sleep

程序员如何修炼管理思维

程序员如何修炼管理思维 1.从个人到团队转变,包容同事,出问题不是指责而是引导:培养人,给每个同事锻炼的机会.以人为中心而不是机器. 2.从专心做好一件事到同时处理多个任务转变,拥抱混乱但不要陷入其中,做好个人的时间管理,把杂乱的任务理清楚才是进步. 3.从关注点到关注面转变,先设计再开发. 4.从说是什么到为什么转变,追根溯源,发现本质. 5.从追求完美到掌握平衡转变.放弃完美是走向完美的路.项目经理最需要平衡,追求完美成本不可控,保持平衡的同时保持迭代,完美是迭代优化出来的. 原文地址:ht

这篇文章程序员一定要看!

作为程序员我们应该知道什么,这是很重要的.不知不觉做软件已经做了十年,从来没有想过要换行业,即使在看到郴州求职信息上有那么多待遇更好的工作,但是也没有想过退缩.有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远.世界上并没有成为高手的捷径,但一些基本原则是可以遵循的.以下分享的这篇文章希望能给大家一点帮助. 1.扎实的基础 数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序.据我的观察,学计算机专业的人比学