GitVersion.Tool

在 Visual Studio 中使用 GitVersion.Tool 来自动生成版本号可以通过以下步骤实现。这个过程涉及配置 GitVersion 和 MSBuild,使每次构建时自动生成版本号。

步骤概述

  1. 安装 GitVersion.Tool
  2. 配置 GitVersion.yml
  3. 修改项目文件(.csproj)
  4. 在 Visual Studio 中配置构建前运行 GitVersion

详细步骤

1. 安装 GitVersion.Tool

首先,确保 GitVersion.Tool 已经安装。你可以通过命令行安装:

dotnet tool install --global GitVersion.Tool

2. 初始化 GitVersion

在项目根目录运行以下命令以初始化 GitVersion:

gitversion init

这将创建一个默认的 GitVersion.yml 文件。

3. 配置 GitVersion.yml

根据项目需要编辑 GitVersion.yml 文件。例如:

next-version: 1.0.0
branches:
  master:
    tag: ''
  develop:
    tag: 'alpha'
  feature:
    tag: 'beta'
ignore:
  sha: []

4. 修改 .csproj 文件

在项目文件(.csproj)中配置版本号属性,以使用 GitVersion 生成的版本号。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="GitVersion.MsBuild" Version="5.*" PrivateAssets="All" />
  </ItemGroup>

  <PropertyGroup>
    <Version>$(GitVersion_FullSemVer)</Version>
    <AssemblyVersion>$(GitVersion_Major).$(GitVersion_Minor).0.0</AssemblyVersion>
    <FileVersion>$(GitVersion_Major).$(GitVersion_Minor).$(GitVersion_Patch).0</FileVersion>
    <InformationalVersion>$(GitVersion_InformationalVersion)</InformationalVersion>
  </PropertyGroup>

</Project>

5. 配置构建前运行 GitVersion

为了在每次构建前自动运行 GitVersion,你可以使用 Visual Studio 的预构建事件。将 GitVersion 作为构建前事件来生成版本信息。

  1. 右键点击项目,选择 "Properties"。
  2. 转到 "Build Events" 标签。
  3. 在 "Pre-build event command line" 中添加以下内容:
dotnet-gitversion /output buildserver /output file

这个命令将在每次构建前运行 GitVersion,并将生成的版本信息输出到一个文件中。

6. 配置 MSBuild 读取版本文件

为了让 MSBuild 在构建时使用 GitVersion 生成的版本号,需要读取 GitVersion 的输出文件并设置 MSBuild 属性。可以在 .csproj 文件中添加以下内容:

<PropertyGroup>
  <GitVersionFile>$(MSBuildProjectDirectory)\gitversion.json</GitVersionFile>
</PropertyGroup>

<Import Project="Sdk.targets" />

<Target Name="ReadGitVersion" BeforeTargets="InitializeBuildProperties">
  <ReadLinesFromFile File="$(GitVersionFile)">
    <Output TaskParameter="Lines" ItemName="GitVersionLines" />
  </ReadLinesFromFile>
  <Message Text="GitVersion: %(GitVersionLines)" Importance="High" />
  <PropertyGroup>
    <GitVersion_FullSemVer>$([MSBuild]::GetRegistryValueFromFile(%(GitVersionLines), "FullSemVer"))</GitVersion_FullSemVer>
    <GitVersion_Major>$([MSBuild]::GetRegistryValueFromFile(%(GitVersionLines), "Major"))</GitVersion_Major>
    <GitVersion_Minor>$([MSBuild]::GetRegistryValueFromFile(%(GitVersionLines), "Minor"))</GitVersion_Minor>
    <GitVersion_Patch>$([MSBuild]::GetRegistryValueFromFile(%(GitVersionLines), "Patch"))</GitVersion_Patch>
    <GitVersion_InformationalVersion>$([MSBuild]::GetRegistryValueFromFile(%(GitVersionLines), "InformationalVersion"))</GitVersion_InformationalVersion>
  </PropertyGroup>
</Target>

总结

通过在 Visual Studio 中配置 GitVersion.Tool,你可以实现每次构建时自动生成和更新版本号。这种方法依赖于 Git 仓库的历史和标签,并且与 MSBuild 集成,以确保版本号在构建时正确生成和使用。这个过程使得版本管理更加自动化和可靠,特别适合于需要频繁发布和版本控制的项目。

Nerdbank.GitVersioning

使用 Nerdbank.GitVersioning 可以在 Visual Studio 中实现自动生成版本号。Nerdbank.GitVersioning 通过读取 Git 仓库的历史和标签来生成版本号,非常适合与 Git 仓库集成的项目。以下是如何在 Visual Studio 中配置 Nerdbank.GitVersioning 以确保每次构建时自动生成版本号的详细步骤。

配置步骤

1. 安装 Nerdbank.GitVersioning

首先,通过 NuGet 安装 Nerdbank.GitVersioning

  1. 在 Visual Studio 中打开你的解决方案。
  2. 在 "解决方案资源管理器" 中右键点击你的项目,然后选择 "管理 NuGet 包"。
  3. 搜索 Nerdbank.GitVersioning,然后安装。

或者,通过命令行:

dotnet add package Nerdbank.GitVersioning

2. 初始化 Nerdbank.GitVersioning

在项目根目录运行以下命令以初始化 Nerdbank.GitVersioning

安装 nbgv工具

dotnet tool install -g nbgv
nbgv install

这将在你的项目根目录中创建一个 version.json 文件。

3. 配置 version.json

根据你的项目需求编辑 version.json 文件。例如:

{
  "version": "1.0",
  "publicReleaseRefSpec": [
    "^refs/heads/main$",
    "^refs/tags/v\\d+\\.\\d+"
  ],
  "cloudBuild": {
    "setVersionVariables": true
  }
}
  • "version": "1.0": 基础版本号。
  • "publicReleaseRefSpec": 指定哪些分支或标签应被视为公共发布版本。
  • "cloudBuild": { "setVersionVariables": true }: 在云构建(如 Azure DevOps、GitHub Actions 等)中设置版本变量。

4. 修改 .csproj 文件

在项目文件(.csproj)中添加以下内容,以便在构建时使用 Nerdbank.GitVersioning 生成的版本号:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Nerdbank.GitVersioning" Version="3.4.231" PrivateAssets="All" />
  </ItemGroup>

  <PropertyGroup>
    <Version>$(GitBuildVersion)</Version>
    <AssemblyVersion>$(GitBuildVersionMajor).$(GitBuildVersionMinor).0.0</AssemblyVersion>
    <FileVersion>$(GitBuildVersionMajor).$(GitBuildVersionMinor).$(GitBuildVersionPatch).0</FileVersion>
    <InformationalVersion>$(GitBuildVersionFullSemVer)</InformationalVersion>
  </PropertyGroup>

</Project>

5. 在构建过程中生成版本号

确保在构建过程中正确生成版本号。Nerdbank.GitVersioning 将在每次构建时自动运行,并生成正确的版本号。

结论

通过在 Visual Studio 中配置 Nerdbank.GitVersioning,你可以实现每次构建时自动生成和更新版本号。Nerdbank.GitVersioning 提供了一种基于 Git 的灵活版本控制方式,适合与各种 CI/CD 工具集成,从而简化版本管理流程。无论是本地开发还是云端构建,Nerdbank.GitVersioning 都能确保版本号的一致性和可靠性。

MSBuild

使用MSBuild任务自动生成版本号是一种更直接的方法,适用于不依赖Git仓库的项目。

优点

  1. 无依赖:不依赖Git,适用于任何项目。
  2. 简单易用:直接在项目文件中配置,无需额外工具。

缺点

  1. 灵活性有限:生成版本号的灵活性和复杂度不如Nerdbank.GitVersioning。

实现步骤

以下是如何配置MSBuild,以便每次构建时自动生成不同的版本号。

1. 修改 .csproj 文件

在您的项目文件(.csproj)中添加以下内容:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <PropertyGroup>
    <!-- 自动生成版本号 -->
    <Version>1.0.$(Year:yy)$(DayOfYear).$(Rev:r)</Version>
    <FileVersion>1.0.$(Year:yy)$(DayOfYear).$(Rev:r)</FileVersion>
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <InformationalVersion>1.0.$(Year:yy)$(DayOfYear).$(Rev:r)</InformationalVersion>
  </PropertyGroup>

  <PropertyGroup>
    <Year Condition="'$(Year)' == ''">$(MSBuildThisFileYear)</Year>
    <DayOfYear Condition="'$(DayOfYear)' == ''">$(MSBuildThisFileDayOfYear)</DayOfYear>
    <Rev Condition="'$(Rev)' == ''">0</Rev>
  </PropertyGroup>

  <Target Name="UpdateRevision" BeforeTargets="BeforeBuild">
    <PropertyGroup>
      <Rev>$([System.Int32]::Parse($(Rev)) + 1)</Rev>
    </PropertyGroup>
  </Target>

</Project>

解释

  • <Version>1.0.$(Year:yy)$(DayOfYear).$(Rev:r)</Version>: 版本号的格式为 1.0.yyDDD.r,其中 yy 是年份的最后两位,DDD 是一年中的第几天,r 是修订号。

  • <FileVersion>: 文件版本号,通常与版本号一致。

  • <AssemblyVersion>: 程序集版本号,可以固定不变或者随版本变化。

  • <InformationalVersion>: 信息版本号,通常与版本号一致。

  • <Year Condition="'$(Year)' == ''">$(MSBuildThisFileYear)</Year>: 获取当前年份。

  • <DayOfYear Condition="'$(DayOfYear)' == ''">$(MSBuildThisFileDayOfYear)</DayOfYear>: 获取一年中的第几天。

  • <Rev Condition="'$(Rev)' == ''">0</Rev>: 初始化修订号。

  • <Target Name="UpdateRevision" BeforeTargets="BeforeBuild">: 在每次构建之前,将修订号加1。

示例

假设今天是2024年5月18日,当前是今年的第138天,版本号将类似于 1.0.24138.0。每次构建时,修订号会自动递增,例如下一次构建时版本号会变成 1.0.24138.1,再下一次是 1.0.24138.2,以此类推。

总结

通过在项目文件中配置MSBuild属性,可以确保每次构建的版本号都是唯一的。此方法简单且不依赖于外部工具,非常适合任何项目。每次打包的版本号会根据当前的日期和修订号动态生成,从而确保每次打包的版本号都不一样。