引言
- 私域NuGet包的重要性:代码复用和团队协同。通过将公共组件、库或工具打包成NuGet包,并在私域中共享,团队成员可以更方便地引用和使用这些资源。其次私域NuGet包有助于依赖管理。通过私域NuGet包,团队可以集中管理这些依赖,确保项目引用的版本一致,并减少因依赖冲突或版本不兼容导致的问题。
- 一键打包上传:通过简单的命令或脚本,自动完成代码打包、版本控制以及上传到私域NuGet服务器的过程。
BaGet私仓搭建
- BaGet: 是GitHub上开源的一个项目,是一个轻量级NuGet和符号服务器,是
NuGet V3 服务器
的开源实现。 - 系统环境: Windows11 + IIS10
下载BaGet和部署
- Github地址:https://github.com/loic-sharma/BaGet
下载BaGet
下载Relese包地址`:https://github.com/loic-sharma/BaGet/releases(选择最新的版本)
解压创建IIS站点绑定BaGet
记得要安装ASP.NET Core 托管捆绑包
打包及推送
编译/发布环境构建
.Net Framework
打包和推送使用Nuget Cli 命令完成
- 下载
nuget.exe
文件,并设置环境变量
- 下载地址:
https://learn.microsoft.com/zh-cn/nuget/install-nuget-client-tools?tabs=windows#nugetexe-cli
下载完成后放到指定目录
- 然后添加nuget
系统环境变量
MSbuild 工具编译发布代码
-
这里我使用最新的VS2022(
同时支持.NET Framework和.NET Core
)安装好的MSbuild 工具
来进行代码编译和发布
,单独安装MSbuild 工具下载地址:https://aka.ms/vs/17/release/vs_BuildTools.exe
-
添加MSbuild 工具 到环境变量,VS2022 路径:
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin
测试实践
- 利用VS2022创建一个.Net Framework 4.7.2 项目,然后再增加一个类库,解决方案目录如下
编写脚本保存为.bat文件
@echo off
REM 开启变量延迟环境
setlocal enabledelayedexpansionREM 定义全局变量
REM 当前项目路径
set "buildFolder=%cd%"
set "rootFolder=%buildFolder%\"
REM 推送key 和Nuget 地址 ,这里都可以定义成变量
set "apiKey=%1"
set "sourceUrl=http://localhost:8081/v3/index.json" REM 打印项目路径和项目根路径
echo buildFolder: %buildFolder%
echo rootFolder: %rootFolder%
echo apiKey: %apiKey%REM 编译解决方案,如编译不通过则不进行打包
set "solutionPath=.\WebTestApi.sln"
@pause
echo msbuild build -- start
REM 还原引用包
nuget restore
msbuild -m %solutionPath% /t:Rebuild /p:Configuration=Release /p:DeployOnBuild=true
echo msbuild build -- end
if %errorlevel% neq 0 ( echo Build sln Error! exit /b 1
) REM 打包之前先删除nuget包
set "nuGetOutputFolder=%buildFolder%\nuGetPackages"
echo NuGetOutputFolder: %nuGetOutputFolder% REM 判断
if exist "%nuGetOutputFolder%*" ( rmdir /s /q "%nuGetOutputFolder%" mkdir "%nuGetOutputFolder%"
) REM 指定项目打包,这里可以写成变量
set "projects=ClassTestLibrary WebTestApi" echo nuget pack -- start
for %%p in (%projects%) do ( echo item:%%pset "projectFolder=%rootFolder%\%%p" echo projectFolder: !projectFolder! nuget pack "!projectFolder!" -SolutionDirectory %rootFolder% -OutputDirectory !nuGetOutputFolder!
)
echo nuget pack -- end REM 推送NuGet包
set "nupkgs=!nuGetOutputFolder!\*.nupkg"
echo nuget push -- start if "!apiKey!"=="" ( REM 批量推送 两者都可以REM nuget push -Source %sourceUrl% "!nupkgs!" REM 循环推送for %%f in (%nupkgs%) do ( nuget push "%%f" -Source %sourceUrl% ))else (REM nuget push -Source %sourceUrl% "!nupkgs!" -ApiKey %apiKey%
REM 循环推送 for %%f in (%nupkgs%) do ( nuget push "%%f" -Source %sourceUrl% -ApiKey %apiKey% )
)
cho nuget push -- end @pause
上述脚本执行效果如下图:
.NetCore
- 打包和推送使用 .NET Cli 命令完成
编写脚本并保存为.bat文件
@echo off
REM 开启变量延迟环境
setlocal enabledelayedexpansion REM 定义全局变量
REM 当前项目路径
set "buildFolder=%cd%"
set "rootFolder=%buildFolder%\"
echo rootFolder
set "apiKey=%1"
set "sourceUrl=http://localhost:8081/v3/index.json" echo buildFolder: %buildFolder%
echo rootFolder: %rootFolder% set "nuGetOutputFolder=%buildFolder%\packages"
echo NuGetOutputFolder: %nuGetOutputFolder% REM 编译解决方案
set "solutionPath=.\Reborn.Starter.sln"
@pause
echo dotnet build -- start
dotnet build "%solutionPath%" -c Release
echo dotnet build -- end
@pause
if %errorlevel% neq 0 ( echo Build Error! exit /b 1
) REM 打包之前先删除nuget包
if exist "%nuGetOutputFolder%*" ( rmdir /s /q "%nuGetOutputFolder%" mkdir "%nuGetOutputFolder%"
) REM 指定项目打包
set "projects=Reborn.Api Reborn.Core" echo dotnet pack -- start
for %%p in (%projects%) do ( echo item:%%pset "projectFolder=%rootFolder%\%%p" echo projectFolder: !projectFolder! dotnet pack "!projectFolder!" --no-build -c Release /p:SourceLinkCreate=true /p:SolutionDir=%rootFolder% -o !nuGetOutputFolder!
)
echo dotnet pack -- end REM 推送NuGet包
set "nupkgs=%nuGetOutputFolder%\*.nupkg"
echo dotnet nuget push -- start if "!apiKey!"=="" ( REM 批量推送 两者都可以REM dotnet nuget push "!nupkgs!" -s %sourceUrl%--skip-duplicate REM 循环推送for %%f in (%nupkgs%) do ( dotnet nuget push "%%f" -s %sourceUrl% --skip-duplicate ))else (REM dotnet nuget push "!nupkgs!" -s %sourceUrl% -k %apiKey% --skip-duplicate
REM 循环推送 for %%f in (%nupkgs%) do ( dotnet nuget push "%%f" -s %sourceUrl% -k %apiKey% --skip-duplicate )
)
echo dotnet nuget push -- end @pause
上述脚本执行效果如下:
最后安装私有Nuget 包
-
在VS2022中添加私有包源地址
-
在nuget 包管理器中搜索发布的私有包并安装
-
引用私有管理器包中的方法
参考
- [链接] https://loic-sharma.github.io/BaGet/
- [链接] https://learn.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-push
- [链接] https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-push