一、什么时候需要用到NuGet私有服务器

  很多公司中架构师会搭建一个统一的项目基础架构模板,然后全部新项目都会拿这个基础架构来开发新的项目,那架构中就会有很多的中间件,比喻公司内部的封装好的Redis中间件,访问数据库的中间件,MQ中间件,小程序中间件等等。

  现在很多项目都用这个模板开发了,然后其中一个中间件有问题了或要加功能,那么全部项目都要把这个中间件修改一遍。可能不同项目在不同的组不同的负责人,通知起来也麻烦。这时候就可以把这些中间件做成一个NuGet包了,然后全部项目都可以通过NuGet包安装,有更新就更新NuGet包,各个项目更新NuGet包就行了。但这些NuGet包不能上传到公开的NuGet服务器上,因为这些NugGet包只能公司内部用的,为了安全性考虑,就需要搭建自己的私有NuGet服务了。

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 二、ProGet搭建

  Nexus:支持NuGet,有点重。

  MyGet:Nuget云服务,不适合企业内私有部署。

  BaGet:简单易用,但还没有实现身份认证,上传的包谁都能Down下来,界面也不需要登录就能访问,因为安全原因只能放弃。

  ProGet:商业软件,支持nuget、npm、docker等,但它是.NET生态应用,而且还提供了免费版本,身份认证、权限方面控的很好,功能也多。

  这里各种对比下选用ProGet 用Docker方式搭建一个内部的NuGet服务器。

2.1、ProGet搭建

创建网络

这里是创建一个和SQL Server共同的网络,如果已经装有SQL Server了,则不需要这步

docker network create inedo

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 

创建一个SQL Server

如果有SQLServer数据库,跳过这一步。文档里只说了需要SQL Server,是否兼容其它数据库还没尝试,旧版本的时候是可以用PgSQL的。

#docker 部署免费版本sqlserver
docker run --name inedo-sql \
  -v /etc/localtime:/etc/localtime:ro \
  -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=sa123456' \
  -e 'MSSQL_PID=Express' --net=inedo --restart=unless-stopped \
  -d mcr.microsoft.com/mssql/server:2019-latest
-v /etc/localtime:/etc/localtime:ro:让容器用本机的日期

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

创建一个名叫ProGet的数据库,为了避免问题,请确保将其排序规则指定为SQL_Latin1_General_CP1_CI_as

#sqlserver 创建一个数据库ProGet
docker exec -it inedo-sql /opt/mssql-tools/bin/sqlcmd \
  -S localhost -U SA -P 'sa123456' \
  -Q 'CREATE DATABASE [ProGet] COLLATE SQL_Latin1_General_CP1_CI_AS'

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 启动ProGet容器

先创建一个文件夹挂载上传的包,这里创建在

#创建目录挂载上传的包
mkdir -p /home/proget/packages

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 启动ProGet容器

  #启动ProGet容器
docker run -d --name=inedo --restart=unless-stopped \
  -v /etc/localtime:/etc/localtime:ro \
  -v /home/proget/packages:/var/proget/packages -p 8180:80 --net=inedo \
  -e SQL_CONNECTION_STRING='Data Source=inedo-sql; Initial Catalog=ProGet; User ID=sa; Password=sa123456' \
  proget.inedo.com/productimages/inedo/proget:latest
SQL_CONNECTION_STRING:SQL Server数据库连接字符串

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 这时候打开ip:8180端口,就能成功访问NuGet服务器界面了。

NuGet私有服务器ProGet Docker搭建和公司中实战用法

2.2、设置ProGet 

设置ProGet包括创建源,设置用户,设置用户组,设置功能权限。

上面部署好后这里还需要一个license key

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 这时ProGet也会帮把 License Key信息保存到部署的站点里面了,不需要再把key填一次了。

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 然后登录

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 修改完密码设置权限

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 创建api key

NuGet私有服务器ProGet Docker搭建和公司中实战用法

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

设置权限

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 修改完后,想查看NuGet服务器上的包就需要登录了。

创建源

要上传Nuget包,需要创建一个源,就是Nuget包的源,ProGet能够创建多个源,分别存不同的包

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

选源的种类为NuGet NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 三、Nuget包发布和下载

3.1、Nuget包打包和发布

visual studio 建一个类库,这里为了演示只写一个帮助类。

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 右键属性填写包的信息

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 项目右键,加包。

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 打包成功后会在bin/debug下生成一个nuget包

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 把NuGet包推送到NuGet服务的源上

#nuget包推送命令
dotnet nuget push wxl.tool.1.0.0.nupkg --api-key c39bf1f00893dc07123508d281305e9735xxxxxx --source http://1.15.63.120:8180/nuget/mynuget/v3/index.json

 --api-key:上面创建的用于推送的apikey

--source :上面创建的源feed

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 推送完成就可以在NuGet服务器上在到这个包了,这里的时间比服务器少了一个时区8小时,是因为容器时区问题,在启动Docker时加上-v /etc/localtime:/etc/localtime:ro即可解决,前面的启动命令已经加上了。

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

3.2、NuGet包下载使用

visual studio 另起一个项目,然后右键打开Nuget管理,把NugGet的源添加进去

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 输入账号信息后就能安装啦。NuGet私有服务器ProGet Docker搭建和公司中实战用法

3.3、(推荐)通过NuGet.config的方式来添加源

上面3.2的方式能通过vs来添加源和NuGet包了,那有什么问题呢?

1、每个开发人员都要在自己的vs添加一遍这个NuGet源。

2、(重点)发布到服务器之后,服务器识别不到NuGet源,需要在服务器设置一下NuGet源,如果服务器很多的情况,添加修改起来会比较麻烦。

这时就可以用NuGet.config的方式来添加源了。

在项目根目录添加NuGet.config文件,内容为

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 NuGet私有服务器ProGet Docker搭建和公司中实战用法

NuGet私有服务器ProGet Docker搭建和公司中实战用法

 

 

 这样打开项目后,项目会自动从nuget.config加载nuget的源,就不需要从vs添加了。发布的时候项目也能从nuget.config还原所需的NuGet包,就不需要每个服务器设置NuGet源了。

到这里Nuget私有服务使用就完成了!

 

NuGet发布包命令地址:https://learn.microsoft.com/zh-cn/nuget/nuget-org/publish-a-package?source=recommendations

NuGet.confg微软官方文档地址:https://learn.microsoft.com/zh-cn/nuget/reference/nuget-config-file?cid=kerryherger

ProGet官网地址:https://proget.inedo.com/