一、什麼時候需要用到NuGet私有伺服器
很多公司中架構師會搭建一個統一的專案基礎架構模板,然後全部新專案都會拿這個基礎架構來開發新的專案,那架構中就會有很多的中介軟體,比喻公司內部的封裝好的Redis中介軟體,訪問資料庫的中介軟體,MQ中介軟體,小程式中介軟體等等。
現在很多專案都用這個模板開發了,然後其中一箇中介軟體有問題了或要加功能,那麼全部專案都要把這個中介軟體修改一遍。可能不同專案在不同的組不同的負責人,通知起來也麻煩。這時候就可以把這些中介軟體做成一個NuGet包了,然後全部專案都可以透過NuGet包安裝,有更新就更新NuGet包,各個專案更新NuGet包就行了。但這些NuGet包不能上傳到公開的NuGet伺服器上,因為這些NugGet包只能公司內部用的,為了安全性考慮,就需要搭建自己的私有NuGet服務了。
二、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
建立一個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:讓容器用本機的日期
建立一個名叫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'
啟動ProGet容器
先建立一個資料夾掛載上傳的包,這裡建立在
#建立目錄掛載上傳的包 mkdir -p /home/proget/packages
啟動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資料庫連線字串
這時候開啟ip:8180埠,就能成功訪問NuGet伺服器介面了。
2.2、設定ProGet
設定ProGet包括建立源,設定使用者,設定使用者組,設定功能許可權。
上面部署好後這裡還需要一個license key
這時ProGet也會幫把 License Key資訊儲存到部署的站點裡面了,不需要再把key填一次了。
然後登入
修改完密碼設定許可權
建立api key
設定許可權
修改完後,想檢視NuGet伺服器上的包就需要登入了。
建立源
要上傳Nuget包,需要建立一個源,就是Nuget包的源,ProGet能夠建立多個源,分別存不同的包
選源的種類為NuGet
三、Nuget包釋出和下載
3.1、Nuget包打包和釋出
visual studio 建一個類庫,這裡為了演示只寫一個幫助類。
右鍵屬性填寫包的資訊
專案右鍵,加包。
打包成功後會在bin/debug下生成一個nuget包
把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伺服器上在到這個包了,這裡的時間比伺服器少了一個時區8小時,是因為容器時區問題,在啟動Docker時加上-v /etc/localtime:/etc/localtime:ro即可解決,前面的啟動命令已經加上了。
3.2、NuGet包下載使用
visual studio 另起一個專案,然後右鍵開啟Nuget管理,把NugGet的源新增進去
輸入賬號資訊後就能安裝啦。
3.3、(推薦)透過NuGet.config的方式來新增源
上面3.2的方式能透過vs來新增源和NuGet包了,那有什麼問題呢?
1、每個開發人員都要在自己的vs新增一遍這個NuGet源。
2、(重點)釋出到伺服器之後,伺服器識別不到NuGet源,需要在伺服器設定一下NuGet源,如果伺服器很多的情況,新增修改起來會比較麻煩。
這時就可以用NuGet.config的方式來新增源了。
在專案根目錄新增NuGet.config檔案,內容為
這樣開啟專案後,專案會自動從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/