转一篇dudu大人的文章:程序员,用NuGet管理好你的包包
每个女人都有很多包包;其实男人也有,但只有会写程序的男人才有 —— 代码世界中的大“包”小“包”。这些大包小包,有花钱买的,有从开源市场淘的,也有自己或同事亲手制作的。
包包有个特点:容易坏,更新快,新品多。于是,市场上有了包包专卖店,家里有了专门放包包的衣橱。于是,女人经常逛街买包包,经常整理衣橱里的包包。而男人呢,不喜欢逛街,不喜欢整理。。。面对越来越多的包包,很多人发出感叹:做“会写程序的男人”难!
终于有人无法忍受这些大包小包的困扰,一款专门存放包包的“储包柜”横空出世 —— NuGet(http://nuget.codeplex.com/)。读音-“New-Get”,中文翻译-“新买的(包包)”,意指不管有多少包包,想扔就扔,想买就买,有NuGet帮您打理。
会写程序员的您,被包包困扰了吗?用NuGet吧。不仅免费,而且开源 —— 可以随心所欲地改装成自己喜欢的储包柜。
使用NuGet有两种方式
一种是大家熟知的在线免费包包专卖店 —— http://nuget.org/List/Packages,通过VS2010插件NuGet Package Manager可以方便地选用自己的包包。
一种是在公司或自己家里安装一个储包柜 —— 架设自己的NuGet服务器。如何架设自己的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
转一篇dudu大人的文章:程序员,用NuGet管理好你的包包的更多相关文章
- 程序员,用NuGet管理好你的包包(转)
每个女人都有很多包包:其实男人也有,但只有会写程序的男人才有 —— 代码世界中的大“包”小“包”.这些大包小包,有花钱买的,有从开源市场淘的,也有自己或同事亲手制作的. 包包有个特点:容易坏,更新快, ...
- Jeecg心得篇--这个世界不缺程序员,而是缺少匠人和架构师
真正的快乐,是用自己喜欢的方式过完这一生.来人间一趟,不能只为了活着. 这个世界不缺程序员,而是缺少匠人精神的架构师与产品经理. 因为他们通过自己的行为与理念默默地改变着世界,一个更好的世界. 这是我 ...
- 评CSDN上一篇讲述数据迁移的文章“程序员 12 小时惊魂记:凌晨迁移数据出大事故!”
原文地址:https://blog.csdn.net/csdnnews/article/details/98476886 我的评论:热数据迁移,本不该搞突击,这样一旦出现问题后果不堪设想,多少DBA和 ...
- .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件
系列目录 [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ...
- [Mac A]为什么国外程序员爱用 Mac?
from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜 ...
- 从程序员角度看ELF
原文:http://xcd.blog.techweb.com.cn/archives/222.html 特殊说明(by jfo) 对于static-linked或shared-linked的ELF可执 ...
- 我的新书——《PHP程序员面试笔试宝典》
你好,是我琉忆. 一个文艺的PHP开发工程师. 很荣幸能够在这里带来我的第一本新书--<PHP程序员面试笔试宝典>. 一.创作过程 <PHP程序员面试笔试宝典>是我的第一本书, ...
- 程序员写的东西出了bug,造成了损失谁来承担?
这是个持续多年的话题了,很多大公司,尤其是牛逼的独立分包公司(开发公司)都会有代码审核和严格QA程序,一般的公司就很难说咯,在法律上目前还没有完全支持处罚程序员bug经济损失的判例(国内如此),国外也 ...
- Java程序员的发展前景
不知道什么时候开始,IT业初级程序员的工作性质与进城打工的"农民工"变得如此惊人的相似.很多IT公司的高管认为"人便宜,就是要用到坏掉,然后再找更便宜.更年轻的" ...
随机推荐
- C# webservice 编写、发布、调用
采用的工具VS2010生成工程 1. 生成webservice工程:建 ASP.NET 空WEB 应用程序. 2. 在建好的ASP.NET 空WEB应用程序中新建项“web 服务”. 完成上述内容工程 ...
- spring + myBatis 常见错误:注解事务不回滚
最近项目在用springMVC+spring+myBatis框架,在配置事务的时候发现一个事务不能回滚的问题. 刚开始配置如下:springMVC.xml配置内容: spring.xml配置内容 从上 ...
- NGUI图片闪光
先上效果 Shader Shader "Unlit/Transparent Colored Flow Texture" { Properties { _MainTex (" ...
- Effective C++ -----条款25:考虑写出一个不抛异常的swap函数
当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常. 如果你提供一个member swap,也该提供一个non-member swap用来调用前者.对于cla ...
- 【leetcode】Reverse Words in a String(hard)☆
Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...
- 关于Javascript splice方法的一个坑。
w3c相关文档:http://www.w3school.com.cn/jsref/jsref_splice.asp bug:购物车计算价格的时候.加商品没问题,减商品的时候价格总是计算错误. 经排查发 ...
- Quatre 2D的绘图功能的三个步骤(上下文,绘图,渲染)
一.qurza2d是怎么将绘图信息和绘图的属性绘制到图形上下文中去的? 说明: 新建一个项目,自定义一个view类和storyboard关联后,重写该类中的drowrect方法. 画线的三个步骤: ( ...
- September 8th 2016 Week 37th Thursday
The secret of high-impact business is early preparation. 高效商务,赢在未雨绸缪. Early and best preparation is ...
- endnote设置文献第二行悬挂缩进办法
参考:http://blog.sina.com.cn/s/blog_62b13cf201014lfr.html 使用[endnote]插入文献后,如果文献稍长些,有第二行,第二行会顶格开始.并且这个 ...
- 矿场搭建(codevs 1996)
题目描述 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使 ...