使用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 )
注意命令脚本中不能出现中文字符,否则打包上传会出错,报错信息:$ 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现