VisualStudio2017中的自动版本控制(.NETCore)

我花了几个小时的时间试图找到一种在。NETCoreApp 1.1(Visual Studio 2017).

我知道 AssemblyInfo.cs 是在文件夹 obj/Debug/netcoreapp1.1/中动态创建的

它不接受旧的方法: [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]

如果我将项目设置为包,我可以在那里设置版本,但这似乎是用来构建 AssemblyInfo.cs 文件的。

我的问题是,有没有人知道如何控制.NETCore (或.NETStandard)项目中的版本。

97603 次浏览

这些值现在在 .csproj文件中设置:

<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
<AssemblyVersion>1.0.6.0</AssemblyVersion>
<FileVersion>1.0.6.0</FileVersion>
<Version>1.0.1</Version>
</PropertyGroup>

这些值与在项目设置中的 包裹选项卡中看到的值相同。虽然我不认为您可以使用 *来自动增量版本,但是您可以做的是引入一个后处理步骤来替换版本(例如,作为持续集成的一部分)。

我接受了上面的回答,因为@Gigi 是正确的(到目前为止) ,但我很恼火,想出了以下 PowerShell 脚本。

首先,我的解决方案文件夹中有这个脚本(UpdateBuildVersion.ps1) :

#Get Path to csproj
$path = "$PSScriptRoot\src\ProjectFolder\ProjectName.csproj"


#Read csproj (XML)
$xml = [xml](Get-Content $path)


#Retrieve Version Nodes
$assemblyVersion = $xml.Project.PropertyGroup.AssemblyVersion
$fileVersion = $xml.Project.PropertyGroup.FileVersion


#Split the Version Numbers
$avMajor, $avMinor, $avBuild  = $assemblyVersion.Split(".")
$fvMajor, $fvMinor, $fvBuild = $fileVersion.Split(".")


#Increment Revision
$avBuild = [Convert]::ToInt32($avBuild,10)+1
$fvBuild = [Convert]::ToInt32($fvBuild,10)+1


#Put new version back into csproj (XML)
$xml.Project.PropertyGroup.AssemblyVersion = "$avMajor.$avMinor.$avBuild"
$xml.Project.PropertyGroup.FileVersion = "$fvMajor.$fvMinor.$fvBuild"


#Save csproj (XML)
$xml.Save($path)

我将其添加到 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AssemblyVersion>0.0.1</AssemblyVersion>
<FileVersion>0.0.1</FileVersion>
<PreBuildEvent>powershell.exe –NonInteractive –ExecutionPolicy Unrestricted -command "& {$(SolutionDir)UpdateBuildVersion.ps1}"</PreBuildEvent>
</PropertyGroup>
</Project>

即使将其设置为 PreBuildEvent,事实上版本号在文件加载到内存之后才会更新,所以版本号在下一次构建之前不会反映出来。实际上,您可以将其更改为 PostBuildEvent,它将具有相同的效果。

我还创建了以下两个脚本: (UpdateMinorVersion.ps1)

#Get Path to csproj
$path = "$PSScriptRoot\src\ProjectFolder\ProjectName.csproj"


#Read csproj (XML)
$xml = [xml](Get-Content $path)


#Retrieve Version Nodes
$assemblyVersion = $xml.Project.PropertyGroup.AssemblyVersion
$fileVersion = $xml.Project.PropertyGroup.FileVersion


#Split the Version Numbers
$avMajor, $avMinor, $avBuild  = $assemblyVersion.Split(".")
$fvMajor, $fvMinor, $fvBuild = $fileVersion.Split(".")


#Increment Minor Version - Will reset all sub nodes
$avMinor = [Convert]::ToInt32($avMinor,10)+1
$fvMinor = [Convert]::ToInt32($fvMinor,10)+1
$avBuild = 0
$fvBuild = 0


#Put new version back into csproj (XML)
$xml.Project.PropertyGroup.AssemblyVersion = "$avMajor.$avMinor.$avBuild"
$xml.Project.PropertyGroup.FileVersion = "$fvMajor.$fvMinor.$fvBuild"


#Save csproj (XML)
$xml.Save($path)

(UpdateMajorVersion.ps1)

#Get Path to csproj
$path = "$PSScriptRoot\src\ProjectFolder\ProjectName.csproj"


#Read csproj (XML)
$xml = [xml](Get-Content $path)


#Retrieve Version Nodes
$assemblyVersion = $xml.Project.PropertyGroup.AssemblyVersion
$fileVersion = $xml.Project.PropertyGroup.FileVersion


#Split the Version Numbers
$avMajor, $avMinor, $avBuild  = $assemblyVersion.Split(".")
$fvMajor, $fvMinor, $fvBuild = $fileVersion.Split(".")


#Increment Major Version - Will reset all sub nodes
$avMajor = [Convert]::ToInt32($avMajor,10)+1
$fvMajor = [Convert]::ToInt32($fvMajor,10)+1
$avMinor = 0
$fvMinor = 0
$avBuild = 0
$fvBuild = 0


#Put new version back into csproj (XML)
$xml.Project.PropertyGroup.AssemblyVersion = "$avMajor.$avMinor.$avBuild"
$xml.Project.PropertyGroup.FileVersion = "$fvMajor.$fvMinor.$fvBuild"


#Save csproj (XML)
$xml.Save($path)

我做了一个简单的 CLI 设置工具。Csproj.NET 核心版本字符串。您可以将它与诸如 GitVersion 之类的工具组合起来,以便在 CI 构建期间进行自动版本碰撞,如果您想要的话。

我想出了一个解决方案,工作原理几乎与旧的 汇编版本属性星(*)-AssemblyVersion (“1.0. *”)相同

汇编版本AssemblyFileVersion的值作为属性 文件版本(生成 AssemblyFileVersionAttribute)和 汇编版本(生成 AssemblyVersionAttribute 汇编版本属性)在 MSBuild 项目 。 csproj文件中(不在 AssemblyInfo.cs中)。 在 MSBuild 过程中,我们使用自定义 MSBuild 任务生成版本号,然后用任务中的新值覆盖这些 文件版本汇编版本属性的值。

首先,我们创建自定义 MSBuild 任务 GetCurrentBuildVersion:

public class GetCurrentBuildVersion : Task
{
    [Output]
    public string Version { get; set; }
 
    public string BaseVersion { get; set; }
 
    public override bool Execute()
    {
        var originalVersion = System.Version.Parse(this.BaseVersion ?? "1.0.0");
 
        this.Version = GetCurrentBuildVersionString(originalVersion);
 
        return true;
    }
 
    private static string GetCurrentBuildVersionString(Version baseVersion)
    {
        DateTime d = DateTime.Now;
        return new Version(baseVersion.Major, baseVersion.Minor,
            (DateTime.Today - new DateTime(2000, 1, 1)).Days,
            ((int)new TimeSpan(d.Hour, d.Minute, d.Second).TotalSeconds) / 2).ToString();
    }
}

任务类从 微软,构建,实用程序,核心 NuGet 包继承 微软。构建。实用程序。任务类。 它在输入上接受 BaseVersion 属性(可选) ,并在 Version 输出属性中返回生成的版本。获取版本号的逻辑与。NET 自动版本控制(版本号是从1/1/2000开始计算的天数,版本号是从午夜开始计算的半秒)。

若要生成此 MSBuild 任务,请将 .NET 标准1.3类库项目类型与此类一起使用。

Csproj 文件可以如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.3</TargetFramework>
    <AssemblyName>DC.Build.Tasks</AssemblyName>
    <RootNamespace>DC.Build.Tasks</RootNamespace>
    <PackageId>DC.Build.Tasks</PackageId>
    <AssemblyTitle>DC.Build.Tasks</AssemblyTitle>
  </PropertyGroup>
 
  <ItemGroup>
    <PackageReference Include="Microsoft.Build.Framework" Version="15.1.1012" />
    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.1.1012" />
  </ItemGroup>
</Project>

这个任务项目也可以在我的 GitHub 建立任务(Tasks) rel = “ nofollow norefrer”> holajan/DC.Build. Tasks 中找到

现在,我们将 MSBuild 设置为使用此任务并设置 文件版本汇编版本属性。 在. csproj 文件中,它看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">
  <UsingTask TaskName="GetCurrentBuildVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\DC.Build.Tasks.dll" />
 
  <PropertyGroup>
    ...
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <FileVersion>1.0.0.0</FileVersion>
  </PropertyGroup>
 
  ...
 
  <Target Name="BeforeBuildActionsProject1" BeforeTargets="BeforeBuild">
    <GetCurrentBuildVersion BaseVersion="$(FileVersion)">
      <Output TaskParameter="Version" PropertyName="FileVersion" />
    </GetCurrentBuildVersion>
    <PropertyGroup>
      <AssemblyVersion>$(FileVersion)</AssemblyVersion>
    </PropertyGroup>
  </Target>
 
</Project>

重要的是:

  • 上述 使用任务构建,任务导入 GetCurrentBuildVersion 任务。它假设此 dll 文件位于您的。Csproj 文件。
  • 如果在调用 GetCurrentBuildVersion 任务的解决方案中有更多的项目,那么调用任务的 项目1 Target 必须对每个项目有唯一的名称。

此解决方案的优点是,它不仅可以在构建服务器上进行构建,而且还可以在 网络构建或 VisualStudio 的手动构建中进行构建。

有没有人知道如何控制.NETCore (或.NETStandard)项目中的版本。

用途:

dotnet build /p:AssemblyVersion=1.2.3.4

我发现这个问题试图在 CI 构建的上下文中解决这个问题。我想将组装版本设置为 CI 构建编号。

我一直在为 VS2017中使用 csproj 配置格式的.NET Core 应用程序寻找一个版本增量器。

我发现了一个叫做 dotnet ump 的项目,它适用于 project.json 格式,但是很难找到一个解决方案。Csproj 格式。网络颠簸的作者实际上想出了解决方案。Csproj 格式,它被称为 MSBump。

在 GitHub 上有一个关于它的项目:

Https://github.com/balassamarton/msbump

在这里你可以看到代码,并且可以在 NuGet 上找到。

如果使用 Visual Studio Team Services/TFS 或其他 CI 构建过程内置版本控制,可以利用 msbuild 的 Condition属性,例如:

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


<PropertyGroup>
<Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">0.0.1-local</Version>
<Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(BUILD_BUILDNUMBER)</Version>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>


<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.2" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="1.1.2" />
</ItemGroup>


</Project>

这将告诉。NET 核心编译器,如果有的话,可以使用环境变量中的任何东西,如果在本地机器上编译,则可以退回到 0.0.1-local

启用您的。NET 核心/。NET 任何基于 GIT 设置的项目,使用 GIT 的标记/描述功能。

我一直在使用 Prebuild.targets.xml 文件,它位于项目的根文件夹中,并包含在 csproj 文件中,比如:

<Project Sdk="Microsoft.NET.Sdk">
<Import Project="PreBuild.targets.xml" />
...
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>

使用“ GenerateAssembyInfo”标记禁用自动生成装配信息。

然后 Prebuild.targets.xml 将生成一个 commonassemblyinfo.cs 文件,您可以在其中包含基于 GIT 版本的所需版本标记

注意: 我已经在其他地方找到了 Prebuilds.targets.xml,所以不必费心清理它。)

Xml 文件:

    <?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     

<UsingTask
TaskName="GetVersion"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup>
<VersionString ParameterType="System.String" Required="true" />
<Version ParameterType="System.String" Output="true" />
<Commit ParameterType="System.String" Output="true" />
<VersionSuffix ParameterType="System.String" Output="true" />
</ParameterGroup>
<Task>
<!--<Reference Include="" />-->
<Using Namespace="System"/>
<Using Namespace="System.IO"/>
<Using Namespace="System.Text.RegularExpressions" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var match = Regex.Match(VersionString, @"^(?<major>\d+)\.(?<minor>\d+)(\.?(?<patch>\d+))?-(?<revision>\d+)-(?<commit>[a-z0-9-]+)$");
int major, minor, patch, revision;
Int32.TryParse(match.Groups["major"].Value, out major);
Int32.TryParse(match.Groups["minor"].Value, out minor);
Int32.TryParse(match.Groups["patch"].Value, out patch);
Int32.TryParse(match.Groups["revision"].Value, out revision);
_Version = new Version(major, minor, patch, revision).ToString();
_Commit = match.Groups["commit"].Value;
]]>
</Code>
</Task>
</UsingTask>
     

<UsingTask
TaskName="GitExistsInPath"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup>
<Exists ParameterType="System.Boolean" Output="true" />
</ParameterGroup>
<Task>
<!--<Reference Include="" />-->
<Using Namespace="System"/>
<Using Namespace="System.IO"/>
<Using Namespace="System.Text.RegularExpressions" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var values = Environment.GetEnvironmentVariable("PATH");
foreach (var path in values.Split(';')) {
var exeFullPath = Path.Combine(path, "git.exe");
if (File.Exists(exeFullPath)) {
Exists = true;
return true;
}
var cmdFullPath = Path.Combine(path, "git.cmd");
if (File.Exists(cmdFullPath)) {
Exists = true;
return true;
}
}
Exists = false;
]]>
</Code>
</Task>
</UsingTask>
     

<Target Name="CreateCommonVersionInfo" BeforeTargets="CoreCompile">
<Message Importance="high" Text="CreateCommonVersionInfo" />
     

<GitExistsInPath>
<Output TaskParameter="Exists" PropertyName="GitExists"/>
</GitExistsInPath>
<Message Importance="High" Text="git not found!" Condition="!$(GitExists)"/>
          

<Exec Command="git describe --tags --long --dirty > $(ProjectDir)version.txt" Outputs="$(ProjectDir)version.txt" WorkingDirectory="$(SolutionDir)" IgnoreExitCode="true" Condition="$(GitExists)">
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
<Message Importance="high" Text="Calling git failed with exit code $(ExitCode)" Condition="$(GitExists) And '$(ExitCode)'!='0'" />
        

<ReadLinesFromFile File="$(ProjectDir)version.txt" Condition="$(GitExists) And '$(ExitCode)'=='0'">
<Output TaskParameter="Lines" ItemName="OutputLines"/>
</ReadLinesFromFile>
<Message Importance="High" Text="Tags: @(OutputLines)" Condition="$(GitExists) And '$(ExitCode)'=='0'"/>


<Delete Condition="Exists('$(ProjectDir)version.txt')" Files="$(ProjectDir)version.txt"/>
     

<GetVersion VersionString="@(OutputLines)" Condition="$(GitExists) And '$(ExitCode)'=='0'">
<Output TaskParameter="Version" PropertyName="VersionString"/>
<Output TaskParameter="Commit" PropertyName="Commit"/>
</GetVersion>
          

<PropertyGroup>
<VersionString Condition="'$(VersionString)'==''">0.0.0.0</VersionString>
</PropertyGroup>
     

<Message Importance="High" Text="Creating CommonVersionInfo.cs with version $(VersionString) $(Commit)" />
     

<WriteLinesToFile Overwrite="true" File="$(ProjectDir)CommonAssemblyInfo.cs" Encoding="UTF-8" Lines='using System.Reflection%3B
     

// full version: $(VersionString)-$(Commit)
     

[assembly: AssemblyVersion("$(VersionString)")]
[assembly: AssemblyInformationalVersion("$(VersionString)")]
[assembly: AssemblyFileVersion("$(VersionString)")]' />
        

</Target>
</Project>

编辑: 如果您正在使用 MSBUILD 构建

 $(SolutionDir)

可能会给你带来麻烦

 $(ProjectDir)

取而代之

在. csproj 的 <PropertyGroup>节中添加 <Deterministic>False</Deterministic>

使 AssemblyVersion * 工作的解决方案在 “在.Net Core # 22660上的[ AssemblyVersion ]中混淆通配符的错误消息”中进行了描述

只有在生成不是确定性的情况下才允许使用通配符 是.Net Core 项目的默认值。 向 csproj 添加 <Deterministic>False</Deterministic>修复了 问题。

原因.Net 核心开发者认为确定性构建是有益的,详见 http://blog.paranoidcoding.com/2016/04/05/statistic-Builds-in-roslyn.html”rel = “ norefrer”> http://blog.paranoidcoding.com/2016/04/05/Deterministic-Builds-in-roslyn.html 和 编译器应该是确定的: 相同的输入产生相同的输出 # 372

然而,如果您正在使用 TeamCity、 TFS 或其他 CI/CD 工具,那么最好保持版本号由它们控制和递增,并作为参数传递给 build (正如其他答案中所建议的那样) ,例如。

msbuild /t:build /p:Version=YourVersionNumber /p:AssemblyVersion=YourVersionNumber

包裹编号 NuGet 软件包

msbuild /t:pack /p:Version=YourVersionNumber

我认为这个来自@joels 的 回答我是为 VSTS 上运行的 dotnet 核心设置版本号的正确答案

要为这个答案添加更多信息,

BUILD_BUILDNUMBER实际上是 预定义变量

结果发现预定义变量有两个版本。

一个是 BUILD.xxxx,另一个是 BUILD _ XXXX。

只能在 cproj 中使用 Environment Variable Name

您可以使用 MSBuild 属性函数根据当前日期设置版本后缀:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<VersionSuffix>pre$([System.DateTime]::UtcNow.ToString(yyyyMMdd-HHmm))</VersionSuffix>
</PropertyGroup>

这将输出一个名称为: 包名1.0.0-pre20180807-1711. nupkg的包。

有关 MSBuild 属性函数的详细信息: https://learn.microsoft.com/en-us/visualstudio/msbuild/property-functions

Version是由 VersionPrefixVersionSuffix的组合形成的,或者如果 VersionSuffix是空白的,则仅由 VersionPrefix形成。

<PropertyGroup>
<VersionPrefix>1.0.0</VersionPrefix>
</PropertyGroup>

我们可以为 dotnet publish -- version-suffix 1.2.3使用特殊的参数

档案版本:

<AssemblyVersion Condition=" '$(VersionSuffix)' == '' ">0.0.1.0</AssemblyVersion>
<AssemblyVersion Condition=" '$(VersionSuffix)' != '' ">$(VersionSuffix)</AssemblyVersion>

版本:

<Version Condition=" '$(VersionSuffix)' == '' ">0.0.1</Version>
<Version Condition=" '$(VersionSuffix)' != '' ">$(VersionSuffix)</Version>

Https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore21

--version-suffix <VERSION_SUFFIX>     Defines the value for the $(VersionSuffix) property in the project.

感谢@joels 为我指明了正确的方向。

当 DevOps Build 运行时,我不得不稍微改变他的回答,我得到了下面的例外

指定的版本字符串不符合推荐的格式-Major. minor.build.version

我必须在 main.minor.BUILD 部分的末尾添加 $(BUILD _ BUILDNUMBER)。为了去复制实际的版本,我还使用了 version-prefix:

<PropertyGroup>
<VersionPrefix>1.0.3</VersionPrefix>
<Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">$(VersionPrefix)-local</Version>
<Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(VersionPrefix)-$(BUILD_BUILDNUMBER)</Version>
</PropertyGroup>

您可以像下面这样在 csproj 文件中进行操作。我没算出来。我在 Stack Overflow 的其他地方发现了这个功能,但是这个功能可以工作,并且会提供类似于1.0的功能。* for version.

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<FileVersion>1.0.$([System.DateTime]::UtcNow.Date.Subtract($([System.DateTime]::Parse("2000-01-01"))).TotalDays).$([System.Math]::Floor($([MSBuild]::Divide($([System.DateTime]::UtcNow.TimeOfDay.TotalSeconds), 1.32))))</FileVersion>
<Version>1.0.$([System.DateTime]::UtcNow.Date.Subtract($([System.DateTime]::Parse("2000-01-01"))).TotalDays)</Version>
</PropertyGroup>

作为替代方法,你可以尝试使用基于当前日期的带后缀的固定大数:

  <PropertyGroup>
<VersionPrefix>1</VersionPrefix>
<VersionSuffix>$([System.DateTime]::UtcNow.ToString(yyMM)).$([System.DateTime]::UtcNow.ToString(ddHH)).$([System.DateTime]::UtcNow.ToString(mmss))</VersionSuffix>
<Version Condition=" '$(VersionSuffix)' == '' ">$(VersionPrefix).0.0.1</Version>
<Version Condition=" '$(VersionSuffix)' != '' ">$(VersionPrefix).$(VersionSuffix)</Version>
</PropertyGroup>

我的工作是使用 PropertyGroup定义补丁和修订,然后您可以只使用这个版本变量(和前缀,如果需要)。版本号必须是短数字,所以我使用 YearMonth 作为补丁,MinutesOfDay 作为修订。将这几行添加到您的 csproj 文件:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">


<PropertyGroup>
<VersionMajor>0</VersionMajor>
<VersionMinor>9</VersionMinor>
<VersionPatch Condition="'$(VersionPatch)' == ''">$([System.DateTime]::UtcNow.ToString("yyMM"))</VersionPatch>
<VersionRevision Condition="'$(VersionRevision)' == ''">$([System.DateTime]::UtcNow.TimeOfDay.TotalMinutes.ToString("0"))</VersionRevision>
</PropertyGroup>


<PropertyGroup>
<OutputType>...</OutputType>
<TargetFramework>net5.0</TargetFramework>
<Title>Software Title</Title>
<Description>...</Description>
<Authors>...</Authors>
<Version>$(VersionMajor).$(VersionMinor).$(VersionPatch).$(VersionRevision)</Version>
</PropertyGroup>


....


</Project>

它可以实现在一个通用的方式利用 Directory.build.props文件。更多信息在这里: https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

只需在项目文件夹中添加一个具有此名称的文件,并将这些行放在那里。


我在这里寻找一个共享项目的解决方案。在我的案例中,我解决了在我的共享项目中添加 Version.build.props文件的问题,使用上面所示的结构,在任何 csproj 文件中使用我的共享代码为项目添加一行新代码:

<!-- Shared project import -->
<Import Project="..\Shared\Shared.projitems" Label="Shared" />
<!-- Version number generator -->
<Import Project="$([MSBuild]::GetPathOfFileAbove('Version.Build.props', '$(MSBuildThisFileDirectory)../Shared/'))" />

我把密码留在这里,以防有人需要。

* 解决方案测试的.Net5,但应工程的早期版本。

  <PropertyGroup>
<SecondsSinceEpoch>$([System.DateTime]::UtcNow.Subtract($([System.DateTime]::MinValue)).TotalSeconds)</SecondsSinceEpoch>
<Revision>$([System.Math]::Truncate($([System.Decimal]::Remainder($(SecondsSinceEpoch), 100000))))</Revision>
<Version>1.7.0.$(Revision)</Version>
<AssemblyVersion>$(Version)</AssemblyVersion>
<FileVersion>$(Version)</FileVersion>
</PropertyGroup>

我对通过 .csproj设置一个体面的价值的看法。不幸的是,如果下一次重新构建的时间间隔为 100000秒,那么它将是相同的值。不过比 MSBump好,每个 建造都是 < strong > Re build

如果构建缓慢或自动化,可以使用 TotalMinutesTotalDays等。

我的 OSS 项目 “放松版本”可以完全自动地插入 Git 仓库中的属性和常量文字,只安装 NuGet 包,而不需要任何依赖于工具的操作。

应用信息示例:

sing System.Reflection;
[assembly: AssemblyVersion("1.0.21")]
[assembly: AssemblyFileVersion("2020.12.20.33529")]
[assembly: AssemblyInformationalVersion("1.0.21-561387e2f6dc90046f56ef4c3ac501aad0d5ec0a")]
[assembly: AssemblyMetadata("Date","Sun, 20 Dec 2020 09:37:39 GMT")]
[assembly: AssemblyMetadata("Branch","master")]
[assembly: AssemblyMetadata("Tags","")]
[assembly: AssemblyMetadata("Author","Kouji Matsui <k@kekyo.net>")]
[assembly: AssemblyMetadata("Committer","Kouji Matsui <k@kekyo.net>")]
[assembly: AssemblyMetadata("Message","Merge branch 'devel'")]
[assembly: AssemblyMetadata("Build","")]
[assembly: AssemblyMetadata("Generated","Sun, 20 Dec 2020 09:37:43 GMT")]
[assembly: AssemblyMetadata("Platform","AnyCPU")]
[assembly: AssemblyMetadata("BuildOn","Unix")]
[assembly: AssemblyMetadata("SdkVersion","5.0.101")]


namespace YourApp
{
internal static class ThisAssembly
{
public const string AssemblyVersion = "1.0.21";
public const string AssemblyFileVersion = "2020.12.20.33529";
public const string AssemblyInformationalVersion = "1.0.21-561387e2f6dc90046f56ef4c3ac501aad0d5ec0a";
public static class AssemblyMetadata
{
public const string Date = "Sun, 20 Dec 2020 09:37:39 GMT";
public const string Branch = "master";
public const string Tags = "";
public const string Author = "Kouji Matsui <k@kekyo.net>";
public const string Committer = "Kouji Matsui <k@kekyo.net>";
public const string Message = "Merge branch 'devel'";
public const string Build = "";
public const string Generated = "Sun, 20 Dec 2020 09:37:43 GMT";
public const string Platform = "AnyCPU";
public const string BuildOn = "Unix";
public const string SdkVersion = "5.0.101";
}
}
}

综上所述: 你可以恢复到旧的 AssemblyInfo.cs行为:

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Deterministic>false</Deterministic>

但是这种方法是不推荐的,因为关闭 GenerateAssemblyInfo可能会导致问题的基础,比如说。 更具选择性的方法:

<Deterministic>false</Deterministic>
<GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
<GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>
<AssemblyVersion>1.2.*</AssemblyVersion>

你不再需要 AssemblyInfo.cs了。

根据安东尼奥 · 罗德里格斯的回答,另一种带有日期的替代方法是避免数字的重复

  • 版本补丁: (2位数字的年份) + (年份日)
  • 版本修订: 一天中的总秒数
  <PropertyGroup>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<VersionPatch Condition="'$(VersionPatch)' == ''">$([System.DateTime]::UtcNow.ToString("yy"))$([System.DateTime]::UtcNow.DayOfYear.ToString("0"))</VersionPatch>
<VersionRevision Condition="'$(VersionRevision)' == ''">$([System.DateTime]::UtcNow.TimeOfDay.TotalSeconds.ToString("0"))</VersionRevision>
</PropertyGroup>


<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<Version>$(VersionMajor).$(VersionMinor).$(VersionPatch).$(VersionRevision)</Version>
</PropertyGroup>