C#/.NET-如何自动生成和增加软件包版本,尤其是通过CI?

C#/.NET-如何自动生成和增加软件包版本,尤其是通过CI?,c#,.net,visual-studio,.net-core,nuget,C#,.net,Visual Studio,.net Core,Nuget,我有一个VisualStudio项目,它是作为NuGet lib包构建的。但每次发布包时,我都必须手动更改版本号。这是一个容易出错的工作。 我想自动生成并增加软件包版本号 我找到了解决这个问题的方法。我还找到了一些语义版本博客来解释连续交付的包版本 但不幸的是,这个软件包对我来说并不正确 它给我一个错误,AssemblyVersionAttribute重复 如果我将false添加到csproj文件中,它将不起任何作用,包版本将为0.0.0.0 可能是因为我使用了新的cspr

我有一个VisualStudio项目,它是作为NuGet lib包构建的。但每次发布包时,我都必须手动更改版本号。这是一个容易出错的工作。 我想自动生成并增加软件包版本号


我找到了解决这个问题的方法。我还找到了一些语义版本博客来解释连续交付的包版本


但不幸的是,这个软件包对我来说并不正确

  • 它给我一个错误,AssemblyVersionAttribute重复
  • 如果我将
    false
    添加到csproj文件中,它将不起任何作用,包版本将为0.0.0.0
可能是因为我使用了新的csproj格式。请参阅以查看csproj文件,该文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net45;net47;netstandard2.0</TargetFrameworks>
  </PropertyGroup>
</Project>

net45;net47;netstandard2.0
如蒙答复,不胜感激


更新


我发现有一个问题需要提及我的问题:。我正在尝试新的解决方案。

不确定Jenkins的情况,但它应该能够自行生成一个增量数字或时间戳,可以通过构建管道上的环境变量进行访问

我认为最灵活的方法是在csproj中添加一个带有占位符的
PackageVersion
标记,然后构建管道可以更改该标记:

  <PropertyGroup>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <PackageVersion>$(PackageVersion)</PackageVersion>
  </PropertyGroup>

实际上,
GitVersionTask
并不难使用。您只需做以下几件事:

  • 从安装GitVersionTask
  • 添加一个名为
    GitVersion.yml
    的配置文件,其中包含一些键值
  • 将标记添加到分支
  • 建造
  • 完成此操作后,您可以发现输出dll文件包含语义版本


    我在回答我自己的问题,因为我刚刚写错了配置文件名。所以它不能正常工作


    这是我的配置文件:

    mode: ContinuousDelivery
    increment: Inherit
    tag-prefix: '[vV]'
    source-branches: ['master', 'develop', 'hotfix']
    branches:
        master:
            regex: master$
            mode: ContinuousDelivery
            tag: ''
            increment: Patch
            prevent-increment-of-merged-branch-version: true
            track-merge-target: false
            tracks-release-branches: false
            is-release-branch: true
        release:
            regex: r(elease$|(eleases)?[-/])
            mode: ContinuousDelivery
            tag: beta
            increment: Patch
            prevent-increment-of-merged-branch-version: true
            track-merge-target: false
            tracks-release-branches: false
            is-release-branch: true
        feature:
            regex: f(eatures)?[-/]
            mode: ContinuousDeployment
            tag: alpha
            increment: Minor
            prevent-increment-of-merged-branch-version: false
            track-merge-target: false
            tracks-release-branches: false
            is-release-branch: false
    

    我在这里发布了这个配置文件的内容:

    我们可以通过推送Git标记触发GitHub操作,我们可以读取Git标记名称作为版本。然后我们可以用这个版本生成NuGet包

    有一个dotnet工具可以将Git标记作为版本读取并写入版本文件

    在使用它之前,我们应该创建版本文件并导入版本文件

    我们应该使用dotnet安装dotnetCampus.TagToVersion工具,并使用该工具将Git标记写入版本文件

    步骤1:

    目录.Build.props
    文件添加到repo文件夹

    将代码写入
    目录.Build.props
    文件

    
    
    步骤2:

    创建名为
    build
    的文件夹,并将
    Version.props
    文件添加到此文件夹

    将代码写入
    build\Version.props
    文件

    
    1.0.5
    
    步骤3:

    .GitHub\workflows
    文件夹中编写GitHub操作配置文件,例如创建
    .GitHub\workflows\push标记和pack nuget.yml
    文件

    通过标签推送触发动作

    关于:
    推送:
    标签:
    - '*' 
    
    通过dotnet工具以版本形式写入标记

    -名称:安装dotnet工具
    运行:dotnet工具安装-g dotnetCampus.TagToVersion
    -名称:将标记设置为版本
    运行:dotnettagtoversion-t${{github.ref}
    
    构建包

    #构建和发布
    -名称:使用dotnet构建
    运行:dotnet构建--配置发布
    -名称:安装Nuget
    用法:nuget/setup-nuget@v1
    与:
    nuget版本:“5.x”
    -名称:将私有GitHub注册表添加到NuGet
    运行:|
    nuget sources添加-name github-Sourcehttps://nuget.pkg.github.com/ORGANIZATION_NAME/index.json -用户名组织名称-密码${{secrets.GITHUB\u令牌}
    -名称:将生成的包推送到GitHub注册表
    运行:|
    nuget push。\bin\release\*.nupkg-Source github-SkipDuplicate
    nuget push。\bin\release\*.nupkg-源https://api.nuget.org/v3/index.json -SkipDuplicate-ApiKey${{secrets.NugetKey}}-NoSymbols
    

    请参见

    这是否仅供本地使用?一般来说,这应该是远程构建器(Jenkins/Travis等)的工作it@information_interchange它主要是通过Jenkins使用的,有一个叫做GitVersion的有用工具,可以基于git计算版本控制tags@AluanHaddad正如我在问题中提到的,我尝试过GitVersion,但它不能正常工作。我猜它可能不支持.NET Core的新的*.csproj文件格式。@AluanHaddad GitVersion成功了!很抱歉,我使用了不正确的配置文件。(我将在官方文档中提到它。)如果所有版本值都来自构建管道,那么如何在每个开发人员的PC上正确构建它?@walterlv它可以工作,因为当标记为空时,nupkg的版本默认为标记。在dev PC上显示为空,默认为数字,如果没有标记,则默认为1.0.0
    mode: ContinuousDelivery
    increment: Inherit
    tag-prefix: '[vV]'
    source-branches: ['master', 'develop', 'hotfix']
    branches:
        master:
            regex: master$
            mode: ContinuousDelivery
            tag: ''
            increment: Patch
            prevent-increment-of-merged-branch-version: true
            track-merge-target: false
            tracks-release-branches: false
            is-release-branch: true
        release:
            regex: r(elease$|(eleases)?[-/])
            mode: ContinuousDelivery
            tag: beta
            increment: Patch
            prevent-increment-of-merged-branch-version: true
            track-merge-target: false
            tracks-release-branches: false
            is-release-branch: true
        feature:
            regex: f(eatures)?[-/]
            mode: ContinuousDeployment
            tag: alpha
            increment: Minor
            prevent-increment-of-merged-branch-version: false
            track-merge-target: false
            tracks-release-branches: false
            is-release-branch: false