用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)。

 

相关链接:

程序员,用NuGet管理好你的包包

NuGet学习笔记(2) 使用图形化界面打包自己的类库

NuGet学习笔记(3) 搭建属于自己的NuGet服务器

Hosting Your Own NuGet Feeds 

posted @ 2012-06-05 12:15  dudu  阅读(14959)  评论(20编辑  收藏  举报