使用NuGet.Server搭建公司内部的Nuget(包)管理器

参考学习博客地址:https://www.cnblogs.com/hunternet/p/9233241.html

一. NuGet.Server 搭建和配置

1. 创建一个 “NuGetServer” 解决方案,然后新增 “NuGetServer” Asp.Net 网站。结构如下图

2. 在 “NuGetServer” 项目上,右键选择 “管理NuGet程序包” ,选择 “联机” ,右上角搜索框中输入“NuGet.Server”  Enter,在搜索结果中选择 NuGet.Server 项,进行安装,如下图

如果安装最后,提示 替换 Web.config ,请选择 全是。

Packages文件夹是安装NuGet.Server时自动生成的,它就是存放上传的程序包包的仓库。

3. 编译“NuGetServer”项目,如果没有出异常,这里就创建项目完成,NuGetServer 就这么简单建成,稍后部署到IIS上面,看看是不是真的可以了,

先来讲一下这个网站Web.config 要配置地方。

在web.config > appSettings 中设置PackagesPath 这个Key是存放包包的仓库的路径。默认存放在部署的网站根目录Packages文件夹。PackagesPath可不赋值。

在web.config > appSettings 中设置requireApiKey 这个key 如果设置成 true,后面 apiKey 是必须要设置的,这个就像密码一样。可以阻止不知道这个apiKey人访问到程序包。

在web.config > appSettings 中设置apiKey,上传包包时,需要通过这个apiKey进行验证。

    <!--
    Determines if an Api Key is required to push\delete packages from the server. 
    -->
    <add key="requireApiKey" value="true" />

    <!-- 
    Set the value here to allow people to push/delete packages from the server.
    NOTE: This is a shared key (password) for all users.
    -->
    <add key="apiKey" value="123456" />

    <!--
    Change the path to the packages folder. Default is ~/Packages.
    This can be a virtual or physical path.
    -->
    <add key="packagesPath" value="" />

4. 部署到IIS, 打开IIS,右键选择  “网站” ,添加网站,填写 网站名称(NuGetServer),选择物理路径,设置IP和端口号 确定。

5. 运行 NuGetServer 网站 "http://192.168.3.99:6969/",  出现下图效果,则说明NuGet 服务器 已经建立完成。

 6. 接着打开VS的Nuget管理器,新建我们自己的nuget服务器,点击 “+”,在界面下方 设置 名称 “MyNuGet” ,名称随便取,设置 源 “http://192.168.3.99:6969/nuget” (是不是上图有说),确定 关闭界面,回到项目。如下图

之后就可以连上我们自己搭建的服务器了,在项目右键,选择“管理NuGet程序包”,联机,下面是不是多出了一个 “MyNuGet” 程序源呢,虽然下面还没有发布公司内部的程序包。如下图

到此 NuGetServer 服务器就搭建并配置完成。接一下来就是如何创建程序包,以及上传程序包了。

二. 制作包包,上传发布程序包

一种是通过图形界面工具NuGet Package Explorer实现。

优点:操作方便

缺点:不能一次处理多个项目,不能自动化

具体操作方法,请阅读NuGet学习笔记(2) 使用图形化界面打包自己的类库

另外一种方式是通过nuget命令操作。

下面介绍通过命令操作(.net framework),注意要将NuGet.exe放到要打包的文件目录下面

1. 打包,也就是生成 .nupkg 文件

有三种方式:

a) 通过nuget spec命令 和 nuget pack命令

步骤1:通过nuget.exe打包程序集,在.csproj文件目录下执行命令spec,生成初始清单 -> 项目A.nuspec文件

nuget spec 项目A.csproj    //spec 在.csproj文件目录下执行命令
或者 nuget spec 

如果提示 already exists,use -Force to overwrite it,则说明这份清单已经存在了,那你执行命令得加上配置选项,用-Force 这样就可以改写它了,第一次是不存在这种问题,执行命令后,直接出如下图的清单

 

如果尝试在 .nuspec 文件中创建包含默认值的包,NuGet 会产生错误,因此在继续操作之前必须修改其中的xml属性以下字段,比如id,  version,  licenseUrl , projectUrl , iconUrl 等等

步骤2:生成包包 -> 项目A.1.1.0.nupkg

直接执行 nuget pack 命令,或者用下面命令(-Prop 或者 -Properties 都可以),比如:

nuget pack 项目A.csproj -Version 版本号 -Build -Prop Configuration=Release
或者 nuget pack 项目A.csproj -Build -Prop Configuration=Release
或者 nuget pack 项目A.csproj -Prop Configuration=Release
或者 nuget pack
或者 nuget pack 项目A.nuspec -Version 版本号

运行该命令后,nuget会自动调用msbuild以Release方式编译该项目并在当前文件夹中生成 “项目A.1.1.0.nupkg” 。

b) 在Visual Studio编译时自动打包

先要在VS中启用Eable NuGet Package Restore,然后修改发布项目的.csproj文件,在PropertyGroup中添加<BuildPackage>true</BuildPackage>,这样设置后,Visual Studio编译该项目时会自动在bin文件夹中生成对应的.nupkg文件。

c) 通过msbuild命令在编译时进行打包。比如在命令行中运行下面的命令:

msbuild 项目A.csproj /p:BuildPackage=true

注:通过msbuild传参数不需要修改任何配置文件,这样可以很方便地进行自动化。

2. 将生成的包包推送上传至自己的NuGet服务器上

通过nuget push命令进行上传,比如:

nuget push 项目A.1.1.0.nupkg -Source http://192.168.3.99:6969/nuget 123456
nuget push 项目A.1.1.0.nupkg -Source http://192.168.3.99:6969/nuget -ApiKey 123456
//push 程序包路径 选项 nuget服务器地址 apikey
//apikey 可以在服务器webconfig中配置

通过nuget delete命令从包源中删除或取消确切包(解决无法上传同名同版本的包),比如:

nuget delete 项目A 1.1.0 
nuget delete 项目A 1.1.0 -Source http://192.168.3.99:6969/nuget -Apikey 123456 -NonInteractive

到这里,一个入门的nuget包服务器搭建,创建包包,上传包包,引用包包的流程就大致完成了。

3. 打包/上传一条龙操作,通过批处理实现

优点:可自动化,可一次打包/上传多个项目。

批处理示例:执行nuget-push.bat文件自动化生成程序包并上传包包,注意要将NuGet.exe放到和.bat文件在同一目录下面,在.csproj文件目录下执行命令。

@echo off
::项目名称
set ProjectName=项目A
::nupkg包名称
set NupkgName=项目A
::nupkg包版本号
set Version=1.1.0
::发布模式 Release/Debug
set PublishMode=Release
::Nuget发布地址
set SourceUrl=http://192.168.3.99:6969/nuget
::Nuget发布的账号密码,中间用英文冒号隔开(account:password)
set ApiKey=123456

::这里开始禁止修改
::删除nuget包
::del %ProjectName%.*.nupkg /F /Q
del %NupkgName%.%Version%.nupkg /F /Q

::从包源中删除确切包(解决无法上传同名同版本的包)
nuget delete %NupkgName% %Version% -Source %SourceUrl% -ApiKey %ApiKey% -NonInteractive

::生成程序包
nuget pack %ProjectName%.csproj -Version %Version% -Build -Prop Configuration=%PublishMode%

::上传包
::nuget push "%ProjectName%.*.nupkg" -Source %SourceUrl% -ApiKey %ApiKey%
nuget push %NupkgName%.%Version%.nupkg -Source %SourceUrl% -ApiKey %ApiKey%

::删除nuget包
::del %ProjectName%.*.nupkg /F /Q 
del %NupkgName%.%Version%.nupkg /F /Q 
pause
nuget pack ..\CNBlogs.Domain.Core\CNBlogs.Domain.Core.csproj -Build -Prop Configuration=Release
nuget pack ..\CNBlogs.Bootstrap\CNBlogs.Bootstrap.csproj -Build -Prop Configuration=Release
nuget pack ..\CNBlogs.Presentation.Web\CNBlogs.Presentation.Web.csproj -Build -Prop Configuration=Release
nuget push *.nupkg -Source http://nuget.cnblogs.com -ApiKey 123456

4. 打包/上传自动化的进一步解决方案

可以通过持续集成工具Jenkins自动化构建编辑发布项目过程中实现自动化打包上传程序包,这里使用参数化构建选择是否打包上传程序包。

打开Jenkins项目配置,先进行参数配置,这里使用Boolen型参数,名称叫isAosDeploy 在后面构建步骤中执行命令中用,直接用%isAosDeploy%

打开Jenkins项目配置,切换到“构建”选项卡,“增加构建步骤”中选择“Execute Windows batch command”,文本框中输入bat命令如下:

@echo off
set ProjectName=DairyStar.Group.Data
set NupkgName=DairyStar.Group.Data
set Version=1.2.0
set PublishMode=Release
set SourceUrl=http://192.168.3.99:6969/nuget
set ApiKey=123456

if "%isAosDeploy%" == "true" (
del "%WORKSPACE%\%NupkgName%.%Version%.nupkg" /F /Q 

"D:\JenkinsOutput\NuGet.exe" delete "%NupkgName%" "%Version%" -Source "%SourceUrl%" -ApiKey "%ApiKey%" -NonInteractive

"D:\JenkinsOutput\NuGet.exe" pack "%WORKSPACE%\DairyStar.Wms.Data\%ProjectName%.csproj" -Version "%Version%" -Build -Properties Configuration=%PublishMode%

"D:\JenkinsOutput\NuGet.exe" push "%WORKSPACE%\%NupkgName%.%Version%.nupkg" -Source "%SourceUrl%" -ApiKey "%ApiKey%"

del "%WORKSPACE%\%NupkgName%.%Version%.nupkg" /F /Q 
pause
)
View Code

 注意命令脚本中不能出现中文字符,否则打包上传会出错,报错信息:$ cmd /c call C:\WINDOWS\TEMP\jenkins5890705094480711390.bat

 系统找不到指定的路径。

 打包上传程序包这步是构建环节中最后执行的,所以这个命令要放到构建环节最后面,下面图片展示了构建环节的几步顺序如下:

构建发布一次后去查看构建后的控制台输出的日志,发现构建成功且成功上传了程序包

三、nuget cli常用命令简介

 查看本地nuget包源

nuget sources list 

查看特定nuget库中包含的包

nuget list -Source "库名"

删除特定nuget库的包

nuget delete 包名 版本号 -Source "库名" -ApiKey 123456

清理本地nuget缓存

nuget locals all --clear

 

posted @ 2020-08-25 15:50  以德为先  阅读(101)  评论(0编辑  收藏  举报