快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
创始人
2024-09-25 04:47:01
0

脚本自动化打包 .net 应用

    • 1. BaGet 介绍
      • 1.2 主要特点
      • 1.3 使用说明
      • 1.3.1 安装与部署
        • 1.3.1.1 Docker 部署
        • 1.3.1.2 手动部署
        • 1.3.1.3 配置
    • 2. 应用举例
      • 2.1 推送包
      • 2.2 下载包
    • 3. 配置信息
      • 3.1 基本配置
      • 3.2 其他配置选项
    • 4. 脚本编写
      • 4.1 编写 PowerShell 脚本
      • 4.2 编写 Bash 脚本
      • 4.3 运行脚本
    • 总结

本篇文章我们介绍了如何使用脚本,自动化构建 .net 应用的 nuget 包,并推送到指定的 nuget 服务仓库;

1. BaGet 介绍

BaGet 是一个开源的 NuGet 服务器,旨在提供轻量级、高性能且易于部署的 NuGet 包管理解决方案。它支持多种存储后端(如 Azure Blob StorageAmazon S3Local File Storage System/本地文件系统 等),并且具有高度可定制性和扩展性。

BaGet 源码托管地址为:https://github.com/loic-sharma/BaGet

1.2 主要特点

BaGet 是基于 .NET Core 开发的 NuGet 包服务器应用组件,因此需要运行环境安装 .NET Core SDKBaGet 具有以下特性:

  • 轻量级:BaGet 是一个轻量级的 NuGet 服务器,适合小型到中型项目。
  • 高性能:利用 ASP.NET CoreSQLite/PostgreSQL 提供高性能的服务。
  • 配置持久化:支持多种数据库类型,支持离线缓存。
  • 易于部署:支持 Docker 容器化部署,方便快速搭建。
  • 高度可定制:支持多种存储后端(包括云存储)和配置选项。
  • 安全:支持 HTTPSAPI 密钥认证。

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 文件为例;

  1. 保存脚本文件

将上述脚本保存为一个文件,例如 push_packages.bash

  1. 赋予执行权限

使用 chmod 命令给脚本文件添加执行权限:

chmod +x push_packages.bash 
  1. 运行脚本

linux 终端中运行脚本:

./push_packages.bash 

这样,你就可以在 Linux 环境下使用 Bash 脚本来推送 .nupkg 文件到 NuGet 服务器了。

总结

BaGet 是一个轻量级且高性能的 NuGet 服务器,支持多种存储后端和配置选项。通过简单的部署和配置,你可以轻松搭建自己的 NuGet 服务器,并进行包的推送和下载。希望这些信息对你有所帮助!

相关内容

热门资讯

安卓系统入门玄关隔断,探索玄关... 你家的玄关是不是也像个小迷你的小天地呢?今天,就让我带你一起探索一下安卓系统入门玄关隔断的奥秘吧!想...
安卓系统如何下载imovie,... 你有没有想过,在安卓手机上也能享受到iMovie的剪辑乐趣呢?没错,虽然iMovie是苹果家的宝贝,...
安卓系统记课时app,功能与体... 亲爱的手机控们,你们是不是也和我一样,对学习有着无尽的热情,却又总是被琐碎的课时记录搞得头昏脑胀?别...
学生戒网安卓系统,创新技术助力... 亲爱的同学们,你们是不是也和我一样,手机不离手,一有空就刷刷刷,不知不觉就沉迷其中了呢?别担心,今天...
js判断苹果安卓系统,Java... 你有没有想过,当你打开一个网页,它怎么就知道你是用苹果手机还是安卓手机呢?是不是觉得神奇?其实,这背...
安卓原生系统怎样更新,安卓原生... 你有没有发现,你的安卓手机最近是不是有点儿“慢吞吞”的?别急,这可不是你的错觉,手机就像人一样,也需...
安卓苹果系统转移游戏,畅享无缝... 亲爱的召唤师们,是不是最近换了个新手机,却愁眉苦脸地发现游戏数据无法转移呢?别急,今天小助手就来教你...
安卓系统电池耗电排行,解析常见... 手机电池耗电快,是不是你也和我一样,每天都要担心电量告急呢?别急,今天就来和你聊聊安卓系统电池耗电排...
小米手机MIUI系统和安卓系统... 你有没有发现,现在手机界里,小米手机可是个热门话题呢!尤其是它的MIUI系统和安卓系统,简直是让人又...
和平精英安卓系统互通,畅享跨平... 你有没有想过,在和平精英的世界里,安卓系统和苹果系统是不是能像好朋友一样,手拉手一起玩耍呢?今天,就...
安卓系统相片删不掉,安卓系统相... 你有没有遇到过这种情况:在安卓手机上,明明已经把照片删除了,可它就像顽皮的小精灵一样,死活不肯离开你...
安卓原生系统测试指令,全面掌握... 亲爱的手机控们,你是否曾好奇过,那些让安卓手机流畅运行的背后,究竟隐藏着怎样的秘密?今天,就让我带你...
手机系统是安卓8,智能生活新篇... 你有没有发现,现在的手机系统真是五花八门,让人挑花了眼?不过,要说最火热的,那还得数安卓8系统。它就...
安卓也分很多系统,安卓系统多样... 你有没有想过,我们平时用的安卓系统,其实也像是个大家庭,里面分了好多种“小家庭”呢?没错,安卓系统不...
wp系统手机可以刷安卓系统,探... 你有没有想过,你的WP系统手机其实也可以变身成为安卓小精灵呢?没错,就是那个应用丰富、功能强大的安卓...
安卓系统和iOS系统运行原理,... 你有没有想过,为什么你的手机可以轻松地打开各种应用,而你的朋友却只能用那几个固定的?这背后,其实是安...
安卓手机的车载系统,智能驾驶新... 你有没有想过,你的安卓手机除了打电话、发短信、刷抖音,还能变成一辆车的高级助手呢?没错,就是那种一上...
安卓系统手机刷任务,步骤、技巧... 亲爱的手机控们,你们是不是也和我一样,对安卓系统手机刷任务充满了好奇和期待呢?想象你的手机就像一辆老...
originos系统属于安卓系... 亲爱的读者们,你是否曾在手机系统的大海中迷失方向?今天,就让我带你一起探索一个神秘的新世界——Ori...
安卓手机如何系统退回,恢复流畅... 亲爱的安卓手机用户们,你是否在某个瞬间,突然对手机上那新换的系统产生了“水土不服”的感觉?别急,今天...