• 用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 

     
     
    标签: NuGet
  • 相关阅读:
    BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表
    CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度
    BZOJ5298 [CQOI2018] 交错序列 | 矩阵乘法和一个trick
    # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT
    [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP
    【2018九省联考】后的瞎扯
    BZOJ 4671 异或图 | 线性基 容斥 DFS
    Luogu 4294 [WC2008]游览计划 | 斯坦纳树
    BZOJ 2434 阿狸的打字机 | AC自动机
    UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2537055.html
Copyright © 2020-2023  润新知