用NuGet.Server管好自家的包包
每一个成功产品的背后至少有一个伟大的类库,每一个伟大的类库都归属于一个优秀的包包(package),每一个优秀的包包都离不开一个顺手的包包管理器。而NuGet是.NET程序员首选的包包管理器。
这篇文章分享的是如何用NuGet.Server搭建自己的NuGet服务器,如何上传包包,以及我们使用中遇到的问题与自动化打包/上传方案。
一、NuGet服务端的搭建
准备材料:IIS + ASP.NET 4.0 + VS2010 + NuGet.Server
1. 打开VS2010,新建一个ASP.NET Empty Web Application项目
2. 通过NuGet安装NuGet.Server
上图中的Packages文件夹是安装NuGet.Server时自动生成的,它就是存放包包的仓库。
3. 在web.config > appSettings 中设置存放包包的仓库的路径
<appSettings> <add key="packagesPath" value="~/Packages" /> </appSettings>
4. 在web.config > appSettings 中设置apiKey,上传包包时,需要通过这个apiKey进行验证。
<appSettings> <add key="apiKey" value="12345trewq" /> </appSettings>
5. 在IIS中为这个项目创建一个Web站点,然后通过浏览器访问,如果设置正确,会出现如下的页面:
二、客户端打包/上传包包
1. 打包,也就是生成.nupkg文件
有三种方式:
a) 通过nuget pack命令
比如,我们对一个名称为“项目A”的VS2010项目进行打包,对应的命令行是:
nuget pack 项目A.csproj -Build -Properties Configuration=Release
运行该命令后,nuget会自动调用msbuild以Release方式编译该项目并在当前文件夹中生成“项目A.nupkg”。
b) 在Visual Studio编译时自动打包
先要在VS2010中启用Eable NuGet Package Restore,然后修改发布项目的.csproj文件,在PropertyGroup中添加<BuildPackage>true</BuildPackage>,如下图:
这样设置后,Visual Studio编译该项目时会自动在bin文件夹中生成对应的.nupkg文件。
c) 通过msbuild命令在编译时进行打包
比如,在命令行中运行下面的命令:
msbuild CNBlogs.Infrastructure.Logging.csproj /p:BuildPackage=true
注:通过msbuild传参数不需要修改任何配置文件,这样可以很方便地进行自动化。
2. 上传至NuGet服务器
通过nuget push命令进行上传,比如:
nuget push 项目A.nupkg -s http://nuget.cnblogs.com 12345trewq
注:项目A.nupkg是包包的名称,http://nuget.cnblogs.com是NuGet Server网址,12345trewq是之前在web.config中设置的apiKey。
【遇到的问题】
开始时,我们执行这个命令后,出现错误:
Failed to process request. 'Method Not Allowed'. The remote server returned an error: (405) Method Not Allowed..
产生这个错误是由于IIS安装了WebDAV模块:
删除WebDAV Module与WebDAV Hanlder,上传时会返回404错误,通过浏览器访问路径nuget/Packages也是404错误。
查看IIS日志发现nuget push实际执行的是HTTP PUT操作 —— PUT /api/v2/package/,WebDAV不允许这个操作。
根据网上的说法,必须要卸载WebDAV,可是这台服务器上有一个站点需要它,后来将NuGet Server安装到另外一台服务器解决了这个问题。
3. 打包/上传一条龙
a) 通过批处理实现
优点:可自动化,可一次打包/上传多个项目。
批处理示例:
nuget pack ..\CNBlogs.Domain.Core\CNBlogs.Domain.Core.csproj -Build -Properties Configuration=Release nuget pack ..\CNBlogs.Bootstrap\CNBlogs.Bootstrap.csproj -Build -Properties Configuration=Release nuget pack ..\CNBlogs.Presentation.Web\CNBlogs.Presentation.Web.csproj -Build -Properties Configuration=Release nuget push *.nupkg -s http://nuget.cnblogs.com 12345trewq
目前我们采用的就是这个方法。
b) 通过图形界面工具NuGetPackageExplorer实现
优点:操作方便
缺点:不能一次处理多个项目,不能自动化
具体操作方法,请阅读NuGet学习笔记(2) 使用图形化界面打包自己的类库
三、打包/上传自动化的进一步解决方案
该解决方案还没实现,这里只是分享一下我们的思路。
通过一个ASP.NET MVC程序实现,名称叫“一键发包”。
操作流程:
在浏览器中选择要发布至NuGet服务器的项目名称并点击“Push” -> 服务端自动运行Git命令从代码库中获取该项目的代码 -> 自动运行msbuild命令编译该项目并生成.nupkg文件(msbuild projectname.csproj /p:BuildPackage=true)-> 自动运行nuget push命令发布至NuGet服务器(nuget push)。
相关链接: