程序員,用NuGet管理好你的包包
每個女人都有很多包包;其實男人也有,但只有會寫程序的男人才有 —— 代碼世界中的大“包”小“包”。這些大包小包,有花錢買的,有從開源市場淘的,也有自己或同事親手制作的。
包包有個特點:容易壞,更新快,新品多。于是,市場上有了包包專賣店,家里有了專門放包包的衣櫥。于是,女人經(jīng)常逛街買包包,經(jīng)常整理衣櫥里的包包。而男人呢,不喜歡逛街,不喜歡整理。。。面對越來越多的包包,很多人發(fā)出感嘆:做“會寫程序的男人”難!
終于有人無法忍受這些大包小包的困擾,一款專門存放包包的“儲包柜”橫空出世 —— NuGet(http://nuget.codeplex.com/)。讀音-“New-Get”,中文翻譯-“新買的(包包)”,意指不管有多少包包,想扔就扔,想買就買,有NuGet幫您打理。
會寫程序員的您,被包包困擾了嗎?用NuGet吧。不僅免費(fèi),而且開源 —— 可以隨心所欲地改裝成自己喜歡的儲包柜。
使用NuGet有兩種方式
一種是大家熟知的在線免費(fèi)包包專賣店 —— http://nuget.org/List/Packages,通過VS2010插件NuGet Package Manager可以方便地選用自己的包包。
一種是在公司或自己家里安裝一個儲包柜 —— 架設(shè)自己的NuGet服務(wù)器。如何架設(shè)自己的NuGet服務(wù)器,可以參考園子的兩篇文章:
1. 在內(nèi)部架設(shè)NuGet服務(wù)器
秀一下博客園開發(fā)團(tuán)隊的儲包柜
2011年6月的某一天,博客園開發(fā)團(tuán)隊也有了自己的儲包柜。
目前儲包柜中主要存放的是一個很重要的包包 —— CNBlogsDomain,它包含我們的領(lǐng)域驅(qū)動開發(fā)(DDD)架構(gòu)中的公共部分,被各個應(yīng)用開發(fā)項目引用。
在沒有NuGet的日子里。。。
- 我們要將CNBlogsDomain編譯出的多個dll文件復(fù)制到各個項目的引用文件夾中。每次更新CNBlogsDomain,都要這樣。
有了NuGet,生活從此改變。。。
1. 向自家的NuGet服務(wù)器發(fā)布CNBlogsDomain包包:
- 在CNBlogsDomain中建立一個publish文件夾。
- 下載NuGet打包器至publish文件夾(NuGet.exe, 立即下載)。
- 下載NuGetPackageUploader.exe包包上傳器(立即下載)至publish文件夾,該“包包上傳器”由園子里的lovecindywang開發(fā)(源代碼下載)。
- 修改NuGetPackageUploader.exe.config,將endpoint address改為你的NuGet服務(wù)器地址。
- 在publish文件夾中創(chuàng)建一個NuGetRelease.bat批處理文件,完成包包的制作與上傳。示例代碼如下:
nuget pack ..\CNBlogs.Domain.Core\CNBlogs.Domain.Core.csproj
NuGetPackageUploader . - 發(fā)布包包時,只需運(yùn)行NuGetRelease.bat,nuget命令會根據(jù).csproj文件自動完成打包,NuGetPackageUploader會將當(dāng)前文件夾中的所有包包(.nupkg文件)上傳至NuGet服務(wù)器。
2. 在項目中選用自家NuGet服務(wù)器上的包包:
- 安裝VS2010插件NuGet Package Manager,并在Package Manager的Package Sources添加自家NuGet服務(wù)器存放“包包”的網(wǎng)址。
- 在相應(yīng)的項目中選用所需的“包包”并安裝。
- 安裝完成之后,NuGet會在當(dāng)前項目的文件夾中生成一個packages.config(表示當(dāng)前項目用了哪些包包),文件格式如下:
-
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CNBlogs.Domain.Core" version="1.0.0.1"/>
</packages>并在當(dāng)前解決方案的根目錄下生成packages文件夾,選用的包包會被下載到這里,還會生成一個repositories.config文件(存儲的是每個packages.config的位置),文件格式如下:
<?xml version="1.0" encoding="utf-8"?>
<repositories>
<repository path="..\CNBlogs.Applicaion.Demo\packages.config"/>
</repositories>這樣就用起了自家的包包。
3. 包包的升級
這里繼續(xù)假設(shè)我們的包包名叫CNBlogsDomain。
- 首先,我們在CNBlogsDomain中修改相應(yīng)的Assembly的版本號并編譯,表明這是一個新款包包。
- 然后,運(yùn)行上面提到的NuGetRelease.bat批處理文件,將新款包包發(fā)布至NuGet服務(wù)器。
- 接著,在使用這個包包的項目中通過VS2010打開Package Manage Console運(yùn)行Update-Package命令更新為新款包包。NuGet會自動刪除packages文件夾中的舊版包包,并下載新版包包。
?在使用中遇到的問題
-a. 根據(jù)配置文件repositories.config自動下載包包
問題場景:
一個人在一個項目中添加好所有包包之后,只想把NuGet相關(guān)配置文件(repositories.config與packages.config文件)放到代碼版本庫中,packages文件夾中的包包不放進(jìn)去。另一個人簽出代碼后,需要重新下載這些包包,而NuGet命令只提供根據(jù)packages.config下載包包的功能(repositories.config分散在各個子項目文件夾中),并沒有提供根據(jù)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的執(zhí)行限制, 不然要先執(zhí)行一下Set-ExecutionPolicy RemoteSigned)
-b. 不改版本號,也能更新包包
問題場景:
NuGet每次更新包包,必須要發(fā)布一個不同版本號的包包。有時我們只進(jìn)行了很少的改動,不想修改版本號。
臨時解決方法:
繼續(xù)使用上一個問題中的批處理文件,執(zhí)行前刪除packages文件夾中所有的包包,然后重新下載所有包包。
--進(jìn)一步的解決方法需要去修改NuGet的源代碼。
小結(jié)
程序員可以通過NuGet管理好自己的包包,那女人該如何管理好自己的包包呢?
程序員的天性是喜歡解決問題,不僅僅是通過代碼解決問題。如果你是會寫程序的男人,把你在代碼世界中的智慧帶回現(xiàn)實世界,幫助你喜歡的女人解決問題。
浙公網(wǎng)安備 33010602011771號