@TOC
本篇文章我们介绍了如何使用脚本,自动化构建
.net
应用的nuget
包,并推送到指定的nuget
服务仓库;
1. BaGet 介绍
BaGet
是一个开源的 NuGet
服务器,旨在提供轻量级、高性能且易于部署的 NuGet
包管理解决方案。它支持多种存储后端(如 Azure Blob Storage
、Amazon S3
、Local File Storage System/本地文件系统
等),并且具有高度可定制性和扩展性。
BaGet
源码托管地址为:https://github.com/loic-sharma/BaGet
1.2 主要特点
BaGet
是基于 .NET Core
开发的 NuGet
包服务器应用组件,因此需要运行环境安装 .NET Core SDK
,BaGet
具有以下特性:
- 轻量级:
BaGet
是一个轻量级的NuGet
服务器,适合小型到中型项目。 - 高性能:利用
ASP.NET Core
和SQLite/PostgreSQL
提供高性能的服务。 - 配置持久化:支持多种数据库类型,支持离线缓存。
- 易于部署:支持
Docker
容器化部署,方便快速搭建。 - 高度可定制:支持多种存储后端(包括云存储)和配置选项。
- 安全:支持
HTTPS
和API
密钥认证。
1.3 使用说明
1.3.1 安装与部署
1.3.1.1 Docker 部署
# 拉取镜像
docker pull jkempf/baget
# 运行容器
docker run -p 5000:5000 --name baget -d jkempf/baget
这将启动一个默认配置的 BaGet
实例,并映射端口 5000
到宿主机。
1.3.1.2 手动部署
# 下载源码
git clone https://github.com/jkempf/baget.git
# 进入代码目录
cd baget
# 安装依赖
dotnet restore
# 构建项目
dotnet publish -c Release -o ./publish
# 运行应用
dotnet ./publish/BaGet.dll
1.3.1.3 配置
- 使用环境变量配置
# 设置环境变量
export BAGET__STORAGE__TYPE=FileSystem
export BAGET__STORAGE__PATH=/path/to/packages
export BAGET__DATABASE__CONNECTION_STRING="Data Source=/path/to/baget.db"
export BAGET__API_KEY=your-api-key
# 运行应用
dotnet ./publish/BaGet.dll
- 使用
JSON
配置文件
# 创建 json 配置文件
{
"Storage": {
"Type": "FileSystem",
"Path": "/path/to/packages"
},
"Database": {
"ConnectionString": "Data Source=/path/to/database.db"
},
"ApiKey": "your-api-key" // 此处配置 API 安全密钥
}
# 指定配置文件路径
dotnet ./publish/BaGet.dll --configuration /path/to/config.json
2. 应用举例
2.1 推送包
# 生成 .nupkg 文件
dotnet pack MyProject.csproj
# 推送 .nupkg 文件
dotnet nuget push MyProject.1.0.0.nupkg --source http://localhost:5000/v3/index.json --api-key your-api-key
2.2 下载包
# 安装包
dotnet add package MyProject --source http://localhost:5000/v3/index.json --version 1.0.0
# 恢复包(还原包)
dotnet restore --source http://localhost:5000/v3/index.json
3. 配置信息
3.1 基本配置
- 基本配置说明
1. 存储类型:
- `FileSystem`:使用本地文件系统作为存储后端。
- `AzureBlobStorage`:使用 `Azure Blob Storage` 作为存储后端。
- `AmazonS3`:使用 `Amazon S3` 作为存储后端。
2. 数据库连接字符串:
- 默认使用 `SQLite` 数据库。
- 可以使用 `PostgreSQL` 数据库。
3. `API` 密钥:
- 用于鉴权的 `API` 密钥。
说明:示例配置文件同上。
3.2 其他配置选项
Log
日志配置
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
HTTPS
配置
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://*:5000"
},
"Https": {
"Url": "https://*:5001",
"Certificate": {
"Path": "/path/to/certificate.pfx",
"Password": "certificate-password"
}
}
}
}
}
关于
BaGet
更多配置信息,请查看:https://loic-sharma.github.io/BaGet/configuration/
4. 脚本编写
下面我们实现两种方式的脚本编写,并给出详细的解释说明。
4.1 编写 PowerShell 脚本
- 文件
push_packages.ps1
内容编写如下:
# 定义要推送的目录和 NuGet 服务器 URL
$directoryPath = "./output/packages"
$nugetServerUrl = "https://localhost:5000/v3/index.json"
$apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 获取目录中的所有 .nupkg 文件
$nupkgFiles = Get-ChildItem -Path $directoryPath -Filter *.nupkg
# 推送每个 .nupkg 文件到 NuGet 服务器
foreach ($nupkgFile in $nupkgFiles) {
Write-Host "Pushing $($nupkgFile.FullName) to $nugetServerUrl"
try {
dotnet nuget push $nupkgFile.FullName --source $nugetServerUrl --api-key $apiKey --skip-duplicate
} catch {
Write-Host "Failed to push $($nupkgFile.FullName): $_"
}
}
- 脚本解释说明
这段 PowerShell
脚本用于将指定目录中的所有 .nupkg
文件推送到指定的 NuGet
服务器。
以下是脚本的详细解释:
1. 变量定义
$directoryPath:
- 定义要推送的 .nupkg 文件所在的目录路径。
- 示例值:"./packages"。
$nugetServerUrl:
- 定义目标 NuGet 服务器的 URL。
- 示例值:"https://localhost:5000/v3/index.json"。
$apiKey:
- 定义用于访问 NuGet 服务器的 API 密钥。
- 示例值:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"。
2. 获取 `.nupkg` 文件
Get-ChildItem:
- 使用 Get-ChildItem 命令获取 $directoryPath 目录下的所有 .nupkg 文件。
- 参数 -Path 指定目录路径。
- 参数 -Filter 指定文件过滤器(.nupkg)。
$nupkgFiles = Get-ChildItem -Path $directoryPath -Filter *.nupkg
3. 遍历 `.nupkg` 文件
foreach 循环:
- 遍历 $nupkgFiles 中的每个 .nupkg 文件。
4. 推送 `.nupkg` 文件
Write-Host:
- 输出正在推送的文件名和目标 URL。
- Write-Host "Pushing $($nupkgFile.FullName) to $nugetServerUrl"
5. 错误处理
try-catch 块:
- 尝试使用 dotnet nuget push 命令将 .nupkg 文件推送到 NuGet 服务器。
- 参数 --source 指定 NuGet 服务器的 URL。
- 参数 --api-key 指定 API 密钥。
- 参数 --skip-duplicate 表示如果文件已经存在,则跳过推送。
catch 错误处理:
- 如果推送过程中发生错误,使用 catch 块捕获异常并输出错误信息。
catch {
Write-Host "Failed to push $($nupkgFile.FullName): $_"
}
通过这种方式,你可以自动化地将多个 .nupkg
文件推送到 NuGet
服务器,提高工作效率。
4.2 编写 Bash 脚本
- 文件
push_packages.bash
内容编写如下:
#!/bin/bash
# 定义要推送的目录和NuGet服务器URL
directory_path="./output/packages"
nuget_server_url="https://localhost:5000/v3/index.json"
api_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# 获取目录中的所有 .nupkg 文件
nupkg_files=$(find "$directory_path" -type f -name "*.nupkg")
# 推送每个 .nupkg 文件到 NuGet 服务器
for nupkg_file in $nupkg_files; do
echo "Pushing $nupkg_file to $nuget_server_url"
if dotnet nuget push "$nupkg_file" --source "$nuget_server_url" --api-key "$api_key" --skip-duplicate; then
echo "Successfully pushed $nupkg_file"
else
echo "Failed to push $nupkg_file"
fi
done
- 脚本解释说明
1. 脚本声明:
#!/bin/bash:指定使用 Bash 解释器。
2. 变量定义:
directory_path:定义要推送的 .nupkg 文件所在的目录路径。
nuget_server_url:定义目标 NuGet 服务器的 URL。
api_key:定义用于访问 NuGet 服务器的 API 密钥。
3. 获取 `.nupkg` 文件:
使用 find 命令获取 $directory_path 目录下的所有 .nupkg 文件。
-type f:指定只查找文件。
-name "*.nupkg":指定文件名匹配模式。
nupkg_files=$(find "$directory_path" -type f -name "*.nupkg")
4. 遍历 `.nupkg` 文件
使用 for 循环遍历 $nupkg_files 中的每个 .nupkg 文件。
5. 推送 `.nupkg` 文件
使用 dotnet nuget push 命令将 .nupkg 文件推送到 NuGet 服务器。
参数 --source 指定 NuGet 服务器的 URL。
参数 --api-key 指定 API 密钥。
参数 --skip-duplicate 表示如果文件已经存在,则跳过推送。
6. 错误处理
使用 if 语句检查 dotnet nuget push 命令的返回值。
如果命令成功执行,输出成功信息。
如果命令失败,输出失败信息。
4.3 运行脚本
说明:此处以运行
push_packages.bash
文件为例;
- 保存脚本文件
将上述脚本保存为一个文件,例如 push_packages.bash
。
- 赋予执行权限
使用 chmod
命令给脚本文件添加执行权限:
chmod +x push_packages.bash
- 运行脚本
在 linux
终端中运行脚本:
./push_nupkg.sh
这样,你就可以在 Linux
环境下使用 Bash
脚本来推送 .nupkg
文件到 NuGet
服务器了。
总结
BaGet
是一个轻量级且高性能的 NuGet
服务器,支持多种存储后端和配置选项。通过简单的部署和配置,你可以轻松搭建自己的 NuGet
服务器,并进行包的推送和下载。希望这些信息对你有所帮助!