使用Github Action实现构建、发布到 nuget.org

GitHub Actions是GitHub提供的持续集成和持续部署(CI/CD)工具,它能够自动化构建、测试和部署你的项目。在这篇教程中,我们将探讨如何使用GitHub Actions来构建一个.NET项目,并将它发布到 NuGet.org。

配置 NuGet API 密钥

  • 首先进入nuget.org,登录你的microsoft账号
  • 点击右上角账户,API Keys

  • 点击Create
    • 填写KeyName
    • 如需设置此Key可管理的程序包权限,填写Global Pattern(如Wlkr.*),或者在对应程序包名前打钩

  • 生成后,你有一次机会查看此Key的值

    如果希望将此Key用于多个库,记得保管好此Key,否则只能重新生成或再新建一个Key。

设置Github Action

  • 登录Github,打开你的remote 代码库 -> Setting -> Secrets and variables -> Actions -> New repository secret,输入刚才复制的Key保存到这里,key名称改为NUGET_API_KEY,后面会用到。

  • 然后打开你的local 代码库,新建文件.github\workflows\nuget-publish.yml
mkdir .github\workflows
echo ^ > .github\workflows\nuget-publish.yml
  • 将以下内容复制进去nuget-publish.yml内保存
name: Publish NuGet Package # Action名称

# 设置触发器
# 以下示例为master分支,Directory.Build.props文件发生变动后,
# 触发本action
on:
push:
branches:
- master # 监听的分支
paths: # 监听的文件
- 'Directory.Build.props' # 设置运行环境及执行步骤
# 作用见step name
jobs:
build-and-publish:
runs-on: windows-latest steps:
- name: Checkout code
uses: actions/checkout@v2 - name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '6.x' # 修改为你的.NET版本 - name: Restore NuGet packages
run: dotnet restore - name: Build
run: dotnet build --configuration Release - name: Pack NuGet package
run: |
cd Wlkr.Core.Logger
dotnet pack Wlkr.Core.Logger.csproj --configuration Release --no-build # 需在github库中设置${{ secrets.NUGET_API_KEY }}
- name: Publish NuGet package
run: dotnet nuget push **/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json --skip-duplicate
  • 新建文件Directory.Build.props,此文件作用是统一设置所有csproj的nuget包信息,如作者、版权、版本号等信息

实际上nuget以外的信息也能设置

<Project>
<PropertyGroup>
<Authors>Walker Chan</Authors>
<Company>广州市增城区黯影信息科技部</Company>
<Copyright>Copyright 2023 DimWalker</Copyright>
</PropertyGroup> <!-- Calculate the build and revision numbers based on the current date -->
<PropertyGroup>
<MajorVersion>1</MajorVersion>
<MinorVersion>0</MinorVersion>
<BuildDate>2310</BuildDate>
<RevisionTime>1200</RevisionTime>
<!--<MinorVersion>$([System.DateTime]::Now.ToString("yy"))</MinorVersion>-->
<!--<BuildDate>$([System.DateTime]::Now.ToString("MMdd"))</BuildDate>-->
<!--<RevisionTime>$([System.DateTime]::Now.ToString("HHmm"))</RevisionTime>-->
<BuildNumber>$(MajorVersion).$(MinorVersion).$(BuildDate).$(RevisionTime)</BuildNumber>
</PropertyGroup>
<!-- Use the calculated version for the NuGet package -->
<PropertyGroup>
<VersionPrefix>$(BuildNumber)</VersionPrefix>
<Version>$(VersionPrefix)</Version>
</PropertyGroup> <PropertyGroup>
<!-- 设置 SolutionDir 属性为解决方案文件的绝对路径 -->
<SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
</PropertyGroup>
<ItemGroup>
<!-- Nuget的Icon文件 -->
<None Include="$(SolutionDir)vx_images\DimTechStudio-Icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
<!-- Nuget的自述文件 -->
<None Include="$(SolutionDir)README.md">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<PropertyGroup>
<PackageIcon>DimTechStudio-Icon.png</PackageIcon>
<!--<PackageReadmeFile>README.md</PackageReadmeFile>-->
</PropertyGroup>
</Project>
  • 文件中版本号是以1.0.YYMM.DDsn的格式编写,当需要发布时,修改年月日或流水号,git commit并push到remote 代码库即可触发action
  • 效果查看



更新Nuget README

  • 方法一,如上图,如果在项目文件中设置了README文件,那么只能通过再次发布nuget包来更新README信息

如上图的图片文件是使用了文件件路径,则没法显示在 nuget.org,则需要修改README的图片路径为github url,再次发布才能看得见图片

  • 方法二,取消绑定README,登录nuget.org,进入Manage Package,编辑README信息

缺点是每次发布都需要重复一遍此操作

  • 2023-10-13新增方法三,此方法仅适用于vnote编写的md文件

    • 工具下载地址1:VNoteTools Github
    • 工具下载地址2:VNoteTools Gitee
    • 将下面代码的github_image_prefix_url,替换为你的代码库,执行命令将README.md转换为README_Nuget.md
    VNoteTools.exe -Method NugetMd -InputMdPath "F:\Project_Private\Wlkr.Core.SDK\Wlkr.Core.Logger\README.md" -github_image_prefix_url "https://raw.githubusercontent.com/DimWalker/Wlkr.Core.Logger/master/vx_images/"
    • 修改Directory.Build.props,将整个solution内的项目统一README_Nuget.md
        <PropertyGroup>
    <!-- 设置 SolutionDir 属性为解决方案文件的绝对路径 -->
    <SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
    </PropertyGroup>
    <ItemGroup>
    <!-- Nuget的Icon文件 -->
    <None Include="$(SolutionDir)vx_images\DimTechStudio-Icon.png">
    <Pack>True</Pack>
    <PackagePath>\</PackagePath>
    </None>
    <!-- Nuget的自述文件 -->
    <None Include="$(SolutionDir)README_Nuget.md">
    <Pack>True</Pack>
    <PackagePath>\</PackagePath>
    </None>
    </ItemGroup>
    <PropertyGroup>
    <PackageIcon>DimTechStudio-Icon.png</PackageIcon>
    <PackageReadmeFile>README_Nuget.md</PackageReadmeFile>
    </PropertyGroup>

Author Info

DimWalker

2023 广州市增城区黯影信息科技部

https://www.dimtechstudio.com/

使用Github Action实现构建、发布到 nuget.org的更多相关文章

  1. hexo配合github action 自动构建(多种形式)

    已经使用HEXO正常构建GitHub页面 根据github action 给hexo配置自动部署github page 前往墨抒颖的个人网站查看纯净版 1. 为仓库设置访问密钥 第一步先生成密钥,打开 ...

  2. 用 GitHub Action 构建一套 CI/CD 系统

    ​ 缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...

  3. 使用CI/CD工具Github Action发布jar到Maven中央仓库

    之前发布开源项目Payment Spring Boot到Maven中央仓库我都是手动执行mvn deploy,在CI/CD大行其道的今天使用这种方式有点"原始".于是我一直在寻求一 ...

  4. 使用github action发布hexo博客到云服务器

    目录 搭建Hexo博客 安装主题hexo-theme-bamboo 修改博客名称等信息 添加github action发布 1. 在github中创建自己的博客仓库 2. 设置Secrets 3. 在 ...

  5. 记录使用 Cake 进行构建并制作 nuget 包

    书接上一回(https://www.cnblogs.com/h82258652/p/4898983.html)?[手动狗头] 前段时间折腾了一下,总算是把我自己的图片缓存控件(https://gith ...

  6. GitHub Action一键部署配置,值得拥有

    最近由于自己的个人应用增加,每次都需要在服务器手动发布,觉得特别麻烦,所以想通过代码控制自动发布,直接选择了GitHub Action. GitHub Action持续集成服务,目前已经免费开放使用, ...

  7. 如何将一个.NET Core类库发布到NuGet

    包治百病 | 如何将一个.NET Core类库发布到NuGet 写文章 包治百病 | 如何将一个.NET Core类库发布到NuGet Edi Wang发表于汪宇杰博客订阅 77 NuGet是.NET ...

  8. 你知道什么是 GitHub Action 么?

    本文是 GitHub Action 的入门教程,如您已有相关使用经验可以直接关掉. GitHub Action 是 GitHub 于 2018 年 10 月推出的一个 CI\CD 服务. 之前一直都是 ...

  9. Github自动打包并推送Nuget版本

    如何将自己的类库,自动打包并自动发布到Nuget? 1. 项目csproject属性修改 新建一个项目GitToNugetPackageTest 不用添加任何类,我们修改csproject属性. 替换 ...

  10. Github Action 快速上手指南

    前言 各位读者,新年快乐,我是过了年匆忙赶回上海努力搬砖的蛮三刀. Github之前更新了一个Action功能(应该是很久以前了),可以实现很多自动化操作.用来替代用户自己设置的自动化脚本(比如:钩子 ...

随机推荐

  1. 高可用只读,让RDS for MySQL更稳定

    摘要:业务应用对数据库的数据请求分写请求(增删改)和读请求(查).当存在大量读请求时,为避免读请求阻塞写请求,数据库会提供只读实例方案.通过主实例+N只读实例的方式,实现读写分离,满足大量的数据库读取 ...

  2. .Net8的AOT引导程序BootStrap

    前言 .Net8的本地预编机器码AOT,它几乎进行了100%的自举.微软为了摆脱C++的钳制,做了很多努力.也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等.而需要C++做的,也就仅仅是引 ...

  3. 用字符串表达式执行引擎消除掉if else if

    背景 最近我搞了个微信机器人,@机器人 xxx 这样来发送命令 能拿到的信息有,消息内容,消息发送人,消息所在的群id等 需要根据消息内容或者消息发送群id等不同的条件组合来决定走哪个处理逻辑. 简单 ...

  4. linux内核Makefile中的变量build--- 过渡篇(五)

    一. kbuild系统主要涉及的几个文件 文件名 作用 Makefile 内核源代码顶层目录的Makefile文件 scripts/Makefile.build 通常在进行递归make时会用到的Mak ...

  5. linux基础命令及常用命令总结

    1.ls命令 ls命令是最基础的命令之一,作用是列出当前目录下所有的文件和目录.ls命令有很多选项可以使用,比较常用的是-l选项,可以以详细信息的形式列出所有文件和目录的信息. 示例:列出当前目录下的 ...

  6. SEO相关配置 HTML meta标签总结与属性使用介绍

    HTML meta标签总结与属性使用介绍 <!-- 声明文档使用的字符编码 --> <meta charset='utf-8'> <!-- 优先使用 IE 最新版本和 C ...

  7. 用 Tensorflow.js 做了一个动漫分类的功能(一)

    前言: 浏览某乎网站时发现了一个分享各种图片的博主,于是我顺手就保存了一些.但是一张一张的保存实在太麻烦了,于是我就想要某虫的手段来处理.这样保存的确是很快,但是他不识图片内容,最近又看了 mobil ...

  8. C#.NET 国密SM2 加密解密 与JAVA互通 ver:20230805

    C#.NET 国密SM2 加密解密 与JAVA互通 ver:20230805 .NET 环境:.NET6 控制台程序(.net core). JAVA 环境:JAVA8,带maven 的JAVA控制台 ...

  9. Jmeter线程组间传递变量

    做接口测试,上一个线程组(A线程组)提取的变量,需要传递给下一个线程组(B线程组)使用.故需要将A线程组内提取的变量设置为全局变量.实现如下: 1. json提取变量(A线程组) 通过json提取器, ...

  10. 一键部署 Umami 统计个人网站访问数据

    谈到网站统计,大家第一时间想到的肯定是 Google Analytics.然而,我们都知道 Google Analytics 会收集所有用户的信息,对数据没有任何控制和隐私保护. Google Ana ...