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

时间:2018-04-11 02:55:21

标签: c# .net visual-studio .net-core nuget

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

我找到GitVersion tool来解决这个问题。我还发现了一些语义版本博客来解释持续交付的包版本。

但遗憾的是,GitVersion包对我来说无效。

  • 它给出了一个错误,即AssemblyVersionAttribute是重复的。
  • 如果我将<GenerateAssemblyInfo>false</GenerateAssemblyInfo>添加到csproj文件中,它将不执行任何操作,包版本将为0.0.0.0。

也许原因是我正在使用新的csproj格式。请参阅here以查看csproj文件,文件如下所示:

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

感谢任何回复。

更新

我发现有一个问题需要提及我的问题:Gitversion Task for VS2017-style csproj · Issue #1349 · GitTools/GitVersion。我正在尝试新的解决方案。

3 个答案:

答案 0 :(得分:2)

我们可以通过按下Git标签触发GitHub Action,并且可以读取Git标签名称作为版本。然后,我们可以使用此版本生成NuGet软件包。

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

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

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

第1步:

Directory.Build.props文件添加到repo文件夹。

将代码写入Directory.Build.props文件。

<Project>
  <Import Project="build\Version.props" />
</Project>

第2步:

制作一个名为build的文件夹,并将Version.props文件添加到该文件夹​​。

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

<Project>
  <PropertyGroup>
    <Version>1.0.5</Version>
  </PropertyGroup>
</Project>

第3步:

.github\workflows文件夹中编写GitHub Action配置文件,例如创建.github\workflows\push tag and pack nuget.yml文件

通过标签推送使Action触发。

on:
  push:
    tags:
    - '*' 

通过dotnet工具将标记写入版本。

    - name: Install dotnet tool
      run: dotnet tool install -g dotnetCampus.TagToVersion

    - name: Set tag to version  
      run: dotnet TagToVersion -t ${{ github.ref }}

构建程序包

# Build and publish

    - name: Build with dotnet
      run: dotnet build --configuration Release

    - name: Install Nuget
      uses: nuget/setup-nuget@v1
      with:        
        nuget-version: '5.x'

    - name: Add private GitHub registry to NuGet
      run: |
        nuget sources add -name github -Source https://nuget.pkg.github.com/ORGANIZATION_NAME/index.json -Username ORGANIZATION_NAME -Password ${{ secrets.GITHUB_TOKEN }}
    - name: Push generated package to GitHub registry
      run: |
        nuget push .\bin\release\*.nupkg -Source github -SkipDuplicate
        nuget push .\bin\release\*.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NugetKey }} -NoSymbols 

请参见https://github.com/dotnet-campus/dotnetCampus.TagToVersion

答案 1 :(得分:1)

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

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

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

因此,在构建管道上,您只需传递版本,例如:

dotnet build -p:PackageVersion=$(BUILD_TIMESTAMP)

答案 2 :(得分:0)

实际上GitVersionTask并不难使用。你应该做的就是以下这些:

  1. NuGet安装GitVersionTask
  2. 添加名为GitVersion.yml的配置文件,其中包含一些键值。
  3. 为您的分支添加标记。
  4. 构建
  5. 执行此操作后,您可以找到输出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
    

    我在此处发布了此配置文件内容:Automatically increase the semantic version using GitVersion - walterlv