Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dotnet 配合 Gitlab 做自动推 Tag 时打包 NuGet 包

dotnet 配合 Gitlab 做自动推 Tag 时打包 NuGet 包

作者头像
林德熙
发布于 2020-04-08 07:48:32
发布于 2020-04-08 07:48:32
1.8K00
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

我现在的团队内部用的是 Gitlab 工具,在此工具上提供了 Gitlab CI CD 用于做自动化测试和构建。对于 CBB 来说,发布就是打出 NuGet 包然后上传到内部 NuGet 服务器。此时遇到的问题是,如何在 Gitlab 上执行打包,打包的时候如何指定 NuGet 包的版本号。因为 CBB 的特殊性,我要求每个 NuGet 正式发布的包都应该有一个对应的 Tag 号,这样将 NuGet 库安装到项目里面,之后发现问题了还能找到对应版本的代码 本文告诉大家如何配合 Gitlab 做自动推 Tag 时打包 NuGet 包。也就是本地打一个 Tag 号,推送到 Gitlab 上,就会出发 Gitlab 的自动构建,自动构建里面将会获取 Tag 版本号,然后打出 NuGet 包推送到服务器

在阅读本文之前,期望大家了解什么是 Gitlab 的 Runner 以及如何开启,详细请看 dotnet 配置 Gitlab 的 Runner 做 CI 自动构建

本文以一个 WPF 的库为例子,其他的 dotnet 库也是相同的方法

在 dotnet 里面打包的方法可以通过以下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet pack -c release

在 Gitlab 里面通过 Tag 出发构建命令可以在 .gitlab-ci.yml 添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tagpublish:
  stage: publish
  script:
    - "chcp 65001" # 这里的 chcp 65001 是支持中文 GBK 解决命令行输出

  only:
    - tags

通过 only 里面设置 tags 就可以在推送 Tag 到 Gitlab 上自动触发构建

现在的问题是如何让推送的 Tag 的版本号作为 NuGet 包的版本号

在 Gitlab 里面将会在执行构建的时候注入环境变量,使用 Tag 打包的时候将可以找到 CI_COMMIT_TAG 这个环境变量,这个变量的内容就是对应的 Tag 的内容。如我推送到 1.0.0 的 Tag 那么这个 CI_COMMIT_TAG 的值就是 1.0.0 可以通过这个原理拿到推送的内容

在编译里面的设置,可以在 csproj 或 targets 等文件里面通过 $(环境变量) 的方式拿到对应的环境变量,而设置输出的 NuGet 的版本号可以通过 Version 属性,也就是可以在 csproj 里面添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Version>$(CI_COMMIT_TAG)</Version>

此时将会从环境变量获取 CI_COMMIT_TAG 设置为 Version 属性,这样就能让打出来的 NuGet 包和对应的 Tag 相同

此时的 .gitlab-ci.yml 大概代码如下,请根据你的实际需求更改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stages:
  - publish

# 推Tag打包
tagpublish:
  stage: publish
  script:
    - "chcp 65001"
    - 'dotnet pack -c release'
    - 'nuget push bin\Release\*.nupkg'
  only:
    - tags

以上方法有缺陷是如果打的 Tag 是包含 v 开头的,如 v1.0.0 此时就不好玩了。另一个问题是如果想要本地打一个 NuGet 包,那才是糟心

于是我开源了一个工具 dotnetCampus.TagToVersion 这个工具能根据传入的值更改 Version.props 文件的内容,更改为传入的值的版本号

使用这个工具的步骤就相对多了一点了,我在内部做了一个 dotnet 模版,减少了这些步骤。因为是内部用的模版我也没有打算开源

通过三个步骤能使用 dotnetCampus.TagToVersion 这个工具,这个工具能解决在本地打出 NuGet 包的版本号问题,能解决带 v 的特殊的 Tag 的问题

步骤1是添加 Directory.Build.props 文件

什么是 Directory.Build.props 文件请看 Roslyn 使用 Directory.Build.props 文件定义编译

这个文件的大概作用就是定义此文件夹,以及此文件夹的子文件夹的编译步骤。在 Directory.Build.props 文件里面制定 Version.prop 文件的路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project>
  <Import Project="build\Version.props" />
  <PropertyGroup>
    <PackageOutputPath>$(MSBuildThisFileDirectory)bin\$(Configuration)</PackageOutputPath>
    <Authors>dotnet-campus</Authors>
    <Company>dotnet-campus</Company>
    <LangVersion>latest</LangVersion>
    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
    <Description>描述信息</Description>
    <Copyright>Copyright (c) 2020 dotnet-campus</Copyright>
    <PackageProjectUrl>https://github.com/dotnet-campus/dotnetCampus.SourceYard</PackageProjectUrl>
    <RepositoryUrl>https://github.com/dotnet-campus/dotnetCampus.SourceYard.git</RepositoryUrl>
    <RepositoryType>git</RepositoryType>
    <PackageTags>source;dotnet;nuget;msbuild</PackageTags>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
  </PropertyGroup>
</Project>

请根据你的实际项目添加更改上面代码

核心的代码是设置 Version.props 的路径,放在build文件夹里面

在 Version.props 文件添加下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project>
  <PropertyGroup>
    <Version>1.0.0</Version>
  </PropertyGroup>
</Project>

此时的版本号可以自由填写,这样就能解决本地打 NuGet 包指定版本号的问题。同时解决了非配置管理员的其他开发者也需要了解学习什么是 CI_COMMIT_TAG 的问题

对于其他开发者,只有看到这个 Version.props 文件,同时这个文件里面没有其他需要学习的知识,只是知道在这里更改版本号就可以。这个方式对于配置管理员来说很重要,甚至能决定这项技术能否推进。对于大部分开发者是不需要关心,也不愿意了解这部分技术,更多的是想要提升开发的效率,而太多的杂项的配置知识将会降低开发的效率

我用一个例子说明上面的问题,我在 csproj 里面放下面这段代码。然后我告诉你,每次新建文件的时候都需要向 NafojaneKakoweebi 添加一个 o 不然新建的文件没有作用。假设你在我的团队里面,你要不要打我

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<NafojaneKakoweebi>WhaljeahalqaboBembibocaooo</NafojaneKakoweebi>

当然,这个例子大家看看就好,虽然我真的写了这样的逻辑。通过仔细看还是能了解下面代码的含义,但是对于开发者的效率降低也确实存在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <PropertyGroup>
    <Build>$([System.DateTime]::op_Subtraction($([System.DateTime]::get_Now().get_Date()),$([System.DateTime]::new(2000,1,1))).get_TotalDays())</Build>
    <Revision>$([MSBuild]::Divide($([System.DateTime]::get_Now().get_TimeOfDay().get_TotalSeconds()), 2).ToString('F0'))</Revision>
    <Version>1.0.0.$(Revision)</Version>
  </PropertyGroup>

通过本文的第二个方法,可以让开发者在开发的时候不会碰到配置管理的代码,开发者只是看到 Version.props 文件,这个文件有版本号。而开发者最多也就是改版本号做本地打包

那么对于配置管理来说,如何在推送 Tag 打包的时候自动设置版本号?通过 dotnetCampus.TagToVersion 这个工具根据 CI_COMMIT_TAG 更改 Version 文件的内容就可以做到

修改 .gitlab-ci.yml 为下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stages:
  - publish

# 推Tag打包
tagpublish:
  stage: publish
  script:
    - "chcp 65001"
    - "dotnet new tool-manifest"
    - "dotnet tool install dotnetCampus.TagToVersion"
    - "dotnet tool run dotnet-TagToVersion -t $CI_COMMIT_TAG"
    - 'dotnet pack -c release'
    - 'nuget push bin\Release\*.nupkg'
  only:
    - tags

对比开始的 .gitlab-ci.yml 文件可以看到添加了下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - "dotnet new tool-manifest"
    - "dotnet tool install dotnetCampus.TagToVersion"
    - "dotnet tool run dotnet-TagToVersion -t $CI_COMMIT_TAG"

这三句话就是创建一个 dotnet tool 清单,安装 dotnet tool 工具,然后运行工具而已。如果提前在 gitlab runner 的设备上安装了 dotnetCampus.TagToVersion 那么可以将上面代码压缩为一句代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - "dotnet TagToVersion -t $CI_COMMIT_TAG"

执行上面代码将会自动根据传入的参数修改 Version.props 的值,这样就能做到推送 Tag 打包对应版本号

用推 Tag 打包的好处是解决回滚代码的时候,需要用到某个 NuGet 包进行调试,可以找到对应版本的代码。同时解决了手动叫开发者打 NuGet 包的时候需要记得添加 Tag 号

在调试对应版本的 NuGet 的代码的时候,我推荐使用以下方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
HTML5拖拽
图片自带拖拽功能 其他元素可设置draggable属性:draggable :true 拖拽元素(被拖拽的元素)事件 :
踏浪
2019/07/31
3.9K0
掌握原生拖拽,类似拖拽需求,一网打尽
拖拽在业务里经常有遇见,一般都是弹框,然后我们用鼠标点击,鼠标移动,根据鼠标移动,控制弹框的位置,这也是我们业务中的拖拽,但是原生实际上已经支持了拖拽事件,最近业务有接触拖拽,今天一起去回顾总结下原生拖拽,希望看完对项目有所思考和帮助。
Maic
2022/12/21
9610
掌握原生拖拽,类似拖拽需求,一网打尽
Electron拖拽下载能力
dragdrop 是H5标准的新特性之一,针对每个HTML元素,可以设置一个draggable属性,true表示这个元素能够拖拽,false反之。对于能拖拽的元素,其能够响应‘dragstart’,‘dragover’,‘dragenter’,‘dragleave’,‘dragend’事件,通过addEventListener可以获取相应的拖拽操作。每个事件提供event参数,在dragdrop场景下,多了dataTransfer属性,dataTransfer包含了拖拽相关的数据信息,例如:
ranky
2020/01/01
3.6K4
Electron拖拽下载能力
vue 拖拽hooks ts版
import { ref, } from 'vue' import { useBool } from './useBool' export interface AnyFunction { (...args: any): any } // 数据获取标识 const DATA_SIGN = 'DRAG' export function getDragDataSign() { return DATA_SIGN } /** * DOM 绑定拖拽事件 * @returns { { elems,
copy_left
2021/01/27
9770
drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践
对列表进行拖动排序,尺寸改变。之前一般会使用jQuery-UI(interactjs更加纯粹)。其通过mousedown、mousemove、mouseup这三个事件来实现页面元素被鼠标拖拽的效果。vue-drag-resize vuedraggable等包也大抵如此:https://codepen.io/lujun-zhou/pen/LYybXNx。
周陆军博客
2023/05/07
6.6K1
前端拾零02—H5拖放总结
前端拾零收录日常开发中一些很常见很基础的前端操作,省去每次google甚至答案错误的烦恼
CS逍遥剑仙
2018/08/17
4.3K1
前端拾零02—H5拖放总结
【HTML5】逐步分析如何实现拖放功能
拖放就是通过鼠标放在一个物体上,按住鼠标不放就可以把一个物体托动到另一个位置。其实我们平时一直都有接触,如图
@零一
2021/01/29
1.6K0
前端拾零02—H5原生拖放总结 【原创】
前端拾零收录日常开发中一些很常见很基础的前端操作,省去每次google甚至答案错误的烦恼
CS逍遥剑仙
2018/09/26
1.9K0
HTML5魔法堂:全面理解Drag & Drop API
一、前言                                      在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面目吧! 二、由于篇幅较长,特设目录一陀                       三、HTML4下实现简单拖拽 四、HTML5下实现简单拖拽 五、如何启用DnD效果 六、draggable属性详解 七、DnD的生命周期 八、DnD中最重要的数
^_^肥仔John
2018/01/18
4.1K0
HTML5魔法堂:全面理解Drag & Drop API
可视化拖拽组件库一些技术要点原理分析
为了让本文更加容易理解,我将以上技术要点结合在一起写了一个可视化拖拽组件库 DEMO:
谭光志
2020/12/22
1.9K0
可视化拖拽组件库一些技术要点原理分析
HTML5 进阶系列:拖放 API 实现拖放排序
本文介绍了如何使用 HTML5 的拖放 API 实现一个简单的拖放排序功能。首先介绍了如何为元素设置拖放 API,然后通过一个示例展示了如何实现拖放排序。在示例中,使用了 dataTransfer 对象来存储数据,并通过 setDragImage() 方法来设置拖放图标。最后,指出了在 IE 和 iOS 上需要使用特定的插件来支持拖放排序。
IMWeb前端团队
2017/12/29
2K0
js原生拖拽的两种方法
1.onmousedown:鼠标按下事件 2.onmousemove:鼠标移动事件 3.onmouseup:鼠标抬起事件
全栈程序员站长
2022/09/14
4.3K0
js原生拖拽的两种方法
使用原生方式开发Vue项目的一次体验
凌波不过横塘路,但目送,芳尘去,锦瑟年华谁与度? 如果放弃使用webpack及脚手架进行基于Vue的项目开发,效果会怎样?如何进行组件化?如何进行状态管理? 背景 上周末原本打算去找朋友玩,但是另外一
terrence386
2022/07/14
9950
html5鼠标拖动排序及resize实现方案分析及实践
对列表进行拖动排序,尺寸改变。之前一般会使用jQuery-UI。其通过mousedown、mousemove、mouseup这三个事件来实现页面元素被鼠标拖拽的效果。vue-drag-resize vuedraggable等包也大抵如此:https://codepen.io/lujun-zhou/pen/LYybXNx。
周陆军
2021/07/13
3.2K0
vue 中基于html5 drag drap的拖放
开始的我,so easy! 通过绑定元素的mousedown 事件,监听鼠标的mousemove,和mouseup 事件,于是我轻松实现了同一区域内元素可以拖着跑,上代码!
青梅煮码
2023/03/02
1.5K0
vue 中基于html5 drag drap的拖放
【实战技巧】VUE3.0实现简易的可拖放列表排序
---- 项目地址 项目地址👉👉点击进入,可以直接设置为浏览器主页或者桌面快捷方式进行使用,本人在用,长期维护。 源码地址 完全开源,大家可以随意研究,二次开发。当然还是十分欢迎大家点个Star⭐⭐⭐ 👉👉源码链接(gitee) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;👉👉源码链接(github) 需求介绍 上面是我一个开源的用来收藏网站的小项目,但是现阶段只能一个一个的按顺序添加网址,这样就产生了一个问题,那就是后添加的一定在下面,而我如果新添加了一个比较常用的网站,而列表
一尾流莺
2022/12/10
2.1K0
【实战技巧】VUE3.0实现简易的可拖放列表排序
html5 drag API 实现列表拖拽
在拖拽过程中蓝色的线条是一个边框,利用拖拽事件添加class 并设置css就能有“响应”式的效果。
上山打老虎了
2022/06/14
1.2K0
html5 drag API 实现列表拖拽
vue-grid-layout数据可视化图表面板优化过程所遇问题汇总
对于drag事件不熟悉的,请先阅读:《drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践》
周陆军博客
2023/01/25
1.7K0
HTML5 拖放API与Vue.js实战
拖放 API 将可拖动元素添加到 HTML,使我们可以构建包含可以拖动的具有丰富 UI 元素的 Web 应用。
疯狂的技术宅
2021/01/13
4.4K0
手写原生代码专题 | 图片拖拽效果(一)
前端的小伙伴们,我想大多数都是颜值控吧,看到一个漂亮或新奇的效果,都想搞明白是怎么实现的吧。但是前端发展的实在太快,各种框架和组件五花八门,由于项目业务时间的问题,我们都习惯了使用各种框架和组件去实现,以至于离开这些东西,我们有可能连个最基础的动效都不清楚怎么实现,这就是我想写这个系列文章的原因,除了这个原因,也是方便小编自己总结和梳理,日后用到时方便查阅。总之练习这些基础的项目并不low,放低姿态,从最基础的原生代码开始复习实践,帮助我们梳理基础知识,日积月累,一定会有不少收获。
前端达人
2021/06/16
2.3K0
相关推荐
HTML5拖拽
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验