快速上手基于 BaGet 的脚本自动化构建 .net 应用打包

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
函数计算FC,每月15万CU 3个月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。

@TOC

本篇文章我们介绍了如何使用脚本,自动化构建 .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_nupkg.sh

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

总结

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

目录
相关文章
|
14天前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
34 1
|
15天前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
20天前
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
2天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
19 9
|
10天前
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
19天前
|
机器学习/深度学习 传感器 算法
智能机器人在工业自动化中的应用与前景###
本文探讨了智能机器人在工业自动化领域的最新应用,包括其在制造业中的集成、操作灵活性和成本效益等方面的优势。通过分析当前技术趋势和案例研究,预测了智能机器人未来的发展方向及其对工业生产模式的潜在影响。 ###
73 9
|
16天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
48 2
|
18天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
41 4
|
19天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
17天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible在配置管理中的应用
【10月更文挑战第37天】本文将深入探讨如何利用Ansible简化和自动化复杂的IT基础设施管理任务。我们将通过实际案例,展示如何用Ansible编写可重用的配置代码,以及这些代码如何帮助运维团队提高效率和减少人为错误。文章还将讨论如何构建Ansible playbook来自动部署应用、管理系统更新和执行常规维护任务。准备好深入了解这个强大的工具,让你的运维工作更加轻松吧!
32 2