BaGet服務(wù)之基礎(chǔ)搭建

A lightweight NuGet and Symbol server.
一個輕量級 Nuget 和 Symbol 服務(wù)器。
一、環(huán)境
.Net Core SDK-個人本的是 .Net Core 3.1+
Windows10
Nuget.exe
二、下載和安裝
下載鏈接,根據(jù)需要下載對應(yīng)版本的壓縮包。

選擇合適目錄,解壓文件,解壓目錄如下:

三、修改配置
修改目錄下的配置文件appsettings.json,根據(jù)官方文檔,按需進(jìn)行調(diào)整。
?{
? ?"ApiKey": "",//系統(tǒng)作為nuget推送時,用于驗(yàn)證的apikey,默認(rèn)為空,為保證保密性,可自行添加
? ?//"Urls": "http://*:5000",//對外公開的rest訪問地址
? ?"PackageDeletionBehavior": "Unlist",//包刪除行為,默認(rèn)為不在列表中顯示,為軟刪除
? ?"AllowPackageOverwrites": false,//是否允許覆蓋原有包,默認(rèn)為不允許
?
? ?"Database": {//數(shù)據(jù)庫配置默認(rèn)為sqlite
? ? ?"Type": "Sqlite",
? ? ?"ConnectionString": "Data Source=baget.db"
? },
?
? ?"Storage": {//文件持久化路徑
? ? ?"Type": "FileSystem",
? ? ?"Path": ""//文件夾路徑,建議絕對路徑使用/做路徑分隔,默認(rèn)為解壓目錄的packages文件夾
? },
?
? ?"Search": {
? ? ?"Type": "Database"
? },
?
? ?"Mirror": {
? ? ?"Enabled": true,//是否開啟上游鏡像,默認(rèn)為不啟用false
? ? ?"PackageSource": "https://api.nuget.org/v3/index.json"
? },
?
? ?"Logging": {
? ? ?"IncludeScopes": false,
? ? ?"Debug": {
? ? ? ?"LogLevel": {
? ? ? ? ?"Default": "Warning"
? ? ? }
? ? },
? ? ?"Console": {
? ? ? ?"LogLevel": {
? ? ? ? ?"Microsoft.Hosting.Lifetime": "Information",
? ? ? ? ?"Default": "Warning"
? ? ? }
? ? }
? }
?}配置完成以后,切換到解壓路徑下,執(zhí)行啟動指令。
?dotnet Baget.dll輸出如下,默認(rèn)運(yùn)行端口為 5000。
?>dotnet BaGet.dll
?info: Microsoft.Hosting.Lifetime[0]
? ? ? Now listening on: http://localhost:5000
?info: Microsoft.Hosting.Lifetime[0]
? ? ? Now listening on: https://localhost:5001
?info: Microsoft.Hosting.Lifetime[0]
? ? ? Application started. Press Ctrl+C to shut down.
?info: Microsoft.Hosting.Lifetime[0]
? ? ? Hosting environment: Production
?info: Microsoft.Hosting.Lifetime[0]
? ? ? Content root path: 解壓目錄絕對路徑
瀏覽器中訪問http://localhost:5000,出現(xiàn)如下頁面表示服務(wù)啟動成功。

四、配置Nuget
查看對應(yīng)的上傳頁簽時,可以看到對應(yīng)的服務(wù)鏡像源訪問地址為 http://localhost:5000/v3/index.json,接下來就可以進(jìn)行 vs 的包源配置了。

1、添加推送秘鑰憑證
配置上述配置文檔appsettings.json中的 ApiKey,此處設(shè)置為 ggcyadmin@@,用于演示操作。
?{
? ? ?"ApiKey":"ggcyadmin@@"
?}2、生成nuget包
創(chuàng)建一個項目 NugetTool,并切換到項目目錄下,通過執(zhí)行指令dotnet pack生成庫對應(yīng)的Nuget包。
?>dotnet pack
?用于 .NET 的 Microsoft (R) 生成引擎版本 17.0.0+c9eb9dd64
?版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。
?
? 正在確定要還原的項目…
? 所有項目均是最新的,無法還原。
? 已成功創(chuàng)建包“物理路徑\NugetTool\bin\Debug\NugetTool.1.0.0.nupkg”。該路徑下生成對應(yīng)版本的nuget包。
?NugetTool.1.0.0.nupkg3、發(fā)布nuget包
不帶apikey配置時,執(zhí)行如下指令
?>dotnet nuget push -s http://localhost:5000/v3/index.json NugetTool.1.0.0.nupkg輸出:
?>dotnet nuget push -s http://localhost:5000/v3/index.json NugetTool.1.0.0.nupkg
?warn : 未提供 API 密鑰,找不到 'http://localhost:5000/api/v2/package' 的 API 密鑰。要保存源的 API 密鑰,請使用 "setApiKey" 密鑰。
?正在將 NugetTool.1.0.0.nupkg 推送到 'http://localhost:5000/api/v2/package'...
? PUT http://localhost:5000/api/v2/package/
? Unauthorized http://localhost:5000/api/v2/package/ 322 毫秒
?error: Response status code does not indicate success: 401 (Unauthorized).
帶apikey配置時,需要攜帶apikey進(jìn)行發(fā)布
?>dotnet nuget push -s http://localhost:5000/v3/index.json NugetTool.1.0.0.nupkg -k "ggcyadmin@@"輸出:
?>dotnet nuget push -s http://localhost:5000/v3/index.json NugetTool.1.0.0.nupkg -k "ggcyadmin@@"
?正在將 NugetTool.1.0.0.nupkg 推送到 'http://localhost:5000/api/v2/package'...
? PUT http://localhost:5000/api/v2/package/
? Created http://localhost:5000/api/v2/package/ 460 毫秒
?已推送包。
5、查看發(fā)布結(jié)果
發(fā)布成功后,刷新頁面出現(xiàn)如下結(jié)果:

Vs中配置Nuget包源,包源地址,為Baget對應(yīng)地址http://localhost:5000和/v3/index.json
?http://localhost:5000/v3/index.json相關(guān)配置如下:

配置后,打開任意解決方案,查看Vs中頂部菜單中的【工具】-【Nuget包管理器】-【管理解決方案的Nuget包】,切換數(shù)據(jù)源,可以看到當(dāng)前Baget對應(yīng)的包,代表服務(wù)搭建成功。

五、刪除特定包
卸載默認(rèn)情況下,不會直接刪除對應(yīng)版本的包,只是在Nuget列表中不顯示,實(shí)際的包文件還存在,同樣,刪除也分為未配置apikey和配置apikey兩類,此處僅僅演示配置 apikey 之后的操作。
未攜帶apikey
?dotnet nuget delete -s http://localhost:5000/v3/index.json NugetTool 1.0.0輸出:
?>dotnet nuget delete -s http://localhost:5000/v3/index.json NugetTool 1.0.0
?warn : 未提供 API 密鑰,找不到 'http://localhost:5000/api/v2/package' 的 API 密鑰。要保存源的 API 密鑰,請使用 "setApiKey" 密鑰。
?NugetTool 將從 'http://localhost:5000/api/v2/package' 刪除 1.0.0。是否繼續(xù)? (y/N)
?y
?warn : 正在從 'http://localhost:5000/api/v2/package' 刪除 NugetTool 1.0.0。
? DELETE http://localhost:5000/api/v2/package/NugetTool/1.0.0
? Unauthorized http://localhost:5000/api/v2/package/NugetTool/1.0.0 81 毫秒
?error: Response status code does not indicate success: 401 (Unauthorized).攜帶apikey
?>dotnet nuget delete -s http://localhost:5000/v3/index.json NugetTool 1.0.0 -k "ggcyadmin@@"輸出:
?>dotnet nuget delete -s http://localhost:5000/v3/index.json NugetTool 1.0.0 -k "ggcyadmin@@"
?NugetTool 將從 'http://localhost:5000/api/v2/package' 刪除 1.0.0。是否繼續(xù)? (y/N)
?y
?warn : 正在從 'http://localhost:5000/api/v2/package' 刪除 NugetTool 1.0.0。
? DELETE http://localhost:5000/api/v2/package/NugetTool/1.0.0
? NoContent http://localhost:5000/api/v2/package/NugetTool/1.0.0 101 毫秒
?NugetTool 已成功刪除 1.0.0。查看服務(wù)端,對應(yīng)已經(jīng)沒有該版本包顯示

如果需要徹底清除該版本,刪除本地數(shù)據(jù)庫中,對應(yīng)歷史記錄以及,默認(rèn)的nuget包文件服務(wù)端存儲文件,也可以采用修改配置文件,允許包文件版本覆蓋操作,用于更新同版本包,默認(rèn)服務(wù)對應(yīng)的 Nuget 包存儲路徑為解壓路徑的根目錄packages。
六、常見問題
刪除 nuget包后,同版本號 nuget 包無法進(jìn)行安裝。
?>dotnet nuget push -s http://localhost:5000/v3/index.json NugetTool.1.0.0.nupkg -k "ggcyadmin@@"
?正在將 NugetTool.1.0.0.nupkg 推送到 'http://localhost:5000/api/v2/package'...
? PUT http://localhost:5000/api/v2/package/
? Conflict http://localhost:5000/api/v2/package/ 400 毫秒
?要跳過已發(fā)布的包,請使用 --skip-duplicate 選項
?error: Response status code does not indicate success: 409 (Conflict).
對應(yīng) nuget 默認(rèn)目錄中 packages,文件仍然存在。
Enable package hard deletions
To prevent the "left pad" problem, BaGet's default configuration doesn't allow package deletions. Whenever BaGet receives a package deletion request, it will instead "unlist" the package. An unlisted package is undiscoverable but can still be downloaded if you know the package's id and version. You can override this behavior by setting the
PackageDeletionBehavior
?{
? ? ?"PackageDeletionBehavior": "HardDelete",
?}Enable package overwrites
Normally, BaGet will reject a package upload if the id and version are already taken. You can configure BaGet to overwrite the already existing package by setting
AllowPackageOverwrites
?{
? ? ?"AllowPackageOverwrites": true,
?}重啟服務(wù)后,再次進(jìn)行上傳操作,提示成功。
七、參考鏈接
[1]基礎(chǔ)配置:https://loic-sharma.github.io/BaGet/configuration/
往期推薦

