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

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

终于有人无法忍受这些大包小包的困扰,一款专门存放包包的“储包柜”横空出世 —— 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管理好自己的包包,那女人该如何管理好自己的包包呢?

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

 
 
标签: NuGet

程序员,用NuGet管理好你的包包(转)的更多相关文章

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

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

  2. .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件

    系列目录     [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ...

  3. 程序员写的东西出了bug,造成了损失谁来承担?

    这是个持续多年的话题了,很多大公司,尤其是牛逼的独立分包公司(开发公司)都会有代码审核和严格QA程序,一般的公司就很难说咯,在法律上目前还没有完全支持处罚程序员bug经济损失的判例(国内如此),国外也 ...

  4. Java程序员的发展前景

    不知道什么时候开始,IT业初级程序员的工作性质与进城打工的"农民工"变得如此惊人的相似.很多IT公司的高管认为"人便宜,就是要用到坏掉,然后再找更便宜.更年轻的" ...

  5. DOS程序员手册(三)

    56页     第4章DOS和BIOS接口     本章介绍了用户程序访问DOS内核和BIOS所提供的各种服务的方法.为了访问这 些服务,我们可以从任何编程语言中调用各个软件中断,这些中断便是我们在本 ...

  6. Nuget,程序员的功能包

    导读:随着信息技术的发展,资源的共享已经成为一种文化.对于程序设计来说,我们在编写软件的时候,总有那么一些公共使用的东西,或者说需啊哟使用到别人可能已经做得很好的东西.这个时候,再去重写,并不是一个明 ...

  7. 程序员必读:Linux内存管理剖析

    现在的服务器大部分都是运行在Linux上面的,所以作为一个程序员有必要简单地了解一下系统是如何运行的. 对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...

  8. 程序员的职业方向: 是-->技术?还是-->管理?

    岁之后还能不能再做程序员....... 绝大多数程序员最终的职业目标可能都是CTO,但能做到CEO的人估计会比较少,也有一少部分人自己去创业去当老板,也有部分人转行了,当老板的人毕竟是少数,转行的人都 ...

  9. 程序员的自我修养系列(一):优雅的代码管理工具之GitHub

    1.导言 代码管理是程序员经常遇到一个问题,很多童鞋将代码保存到本地硬盘,此种方法管理混乱,也存在代码丢失的风险,且版本无法控制,因此养成良好的代码管理习惯是程序员的必修课.在众多代码管理工具中笔者在 ...

随机推荐

  1. java回调函数这样说,应该明确了吧!

    有哥们问我回调怎么用,回调怎么理解? 怎么说好呢,仅仅可意会不可言传呐,非也,回调在实际开发中使用频率事实上是非常高的,恰好我小时候也被回调函数欺负过,居然问了,那么肯定要好好分享一下我的一些经验. ...

  2. [Scss Flex] Reuse Flexbox Styles With A Sass Mixin

    This lesson covers flexbox in a reusable mixin that should cover most layout situations on your site ...

  3. 对spring控制反转以及依赖注入的理解

    一.说到依赖注入(控制反转),先要理解什么是依赖. Spring 把相互协作的关系称为依赖关系.假如 A组件调用了 B组件的方法,我们可称A组件依赖于 B组件. 二.什么是依赖注入. 在传统的程序设计 ...

  4. Linux系统编程_8_进程控制之fork_wait_waitpid函数

    fork函数: #include <unistd.h>        pid_t fork(void); fork用来创建一个子进程: 特点: fork调用后会返回两次,子进程返回0,父进 ...

  5. printk()函数的总结

    我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出,更加容易地掌握系统当前的状况.对程序的调试起到了很重要的作用.(下文中的日志级别和控制台日志控制级别是一 ...

  6. js循环json数组

    例如数据库里面的json字符串是这样的 var str = '[{"name":"宗2瓜","num":"1",&quo ...

  7. 【10.58%】【codeforces 721C】Journey

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. PatentTips - Sprite Graphics Rendering System

    BACKGROUND This disclosure relates generally to the field of computer graphics. More particularly, b ...

  9. Android MediaScanner使用简单介绍

    1. 运行扫描 仅仅有系统开机的时候才会运行MediaScanner,其他情景下须要手动运行扫描(拍摄,下载等). 手动运行扫描的方法是发送MediaScanner广播: 1.1 扫描指定文件: In ...

  10. 二、Reids基础命令--字符串

    11.一个字符串类型的KEY同意存储的数据的最大容量是 512MB 12.INCR 使key加1,key不存在时默认是0 . 返回递增后的值. 127.0.0.1:6379> incr num ...