GitVersion.Tool
在 Visual Studio 中使用 GitVersion.Tool 来自动生成版本号可以通过以下步骤实现。这个过程涉及配置 GitVersion 和 MSBuild,使每次构建时自动生成版本号。
步骤概述
- 安装 GitVersion.Tool
- 配置 GitVersion.yml
- 修改项目文件(.csproj)
- 在 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 作为构建前事件来生成版本信息。
- 右键点击项目,选择 "Properties"。
- 转到 "Build Events" 标签。
- 在 "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:
- 在 Visual Studio 中打开你的解决方案。
- 在 "解决方案资源管理器" 中右键点击你的项目,然后选择 "管理 NuGet 包"。
- 搜索 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仓库的项目。
优点
- 无依赖:不依赖Git,适用于任何项目。
- 简单易用:直接在项目文件中配置,无需额外工具。
缺点
- 灵活性有限:生成版本号的灵活性和复杂度不如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属性,可以确保每次构建的版本号都是唯一的。此方法简单且不依赖于外部工具,非常适合任何项目。每次打包的版本号会根据当前的日期和修订号动态生成,从而确保每次打包的版本号都不一样。
