首页 > 解决方案 > MSBuild 输出不正确的 DateTime.UtcNow 格式

问题描述

对于我在 csproj 中的版本标签,我有以下内容:

    <PropertyGroup>
        <Version>
            $([System.DateTime]::UtcNow.Year).$([System.DateTime]::UtcNow.ToString("MM")).$([System.DateTime]::UtcNow.ToString("dd")).$([System.DateTime]::UtcNow.ToString("HHmm"))
        </Version>
    </PropertyGroup>

但它的输出是这样的:Vysn.Voice.2020.1.9.309.nupkg对于 nuget 包以及当我从程序集获取版本信息时:Assembly.GetExecutingAssembly().GetName().Version

但是当我这样做时

var assembly = Assembly.GetExecutingAssembly();
            var informationalVersionAttribute = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>();

Console.WriteLine(informationalVersionAttribute.InformationalVersion);

它输出正确的 DateTime 字符串:2020.01.08.1018. 我不确定我在指定版本时是否做错了,但我希望它正确输出版本:2020.MM.dd.HHmm.

标签: asp.net-core.net-coremsbuildcsproj

解决方案


但它的输出如下:Vysn.Voice.2020.1.9.309.nupkg for nuget packages

这是一种设计行为。

  1. 首先,Vysn.Voice就是所谓的包标识符2020.1.9.309就是包版本。正如官方文档所描述的:

    始终使用其包标识符确切的版本号来引用特定包

    • 默认情况下,包版本Version. 因此,您可以通过自<Version/>定义*.csproj. 请注意包版本不会影响包标识符
    • 默认情况下,包标识符与文件中的元数据<PackageId>Vysn.Voice</PackageId>匹配*.csproj。如果<PackageId/>未指定或为空,它将使用AssemblyName. 有关更多详细信息,请参阅包 ID
  2. 另外,请注意版本号<Major>.<Minor>.<Build>应该是Integer. 并且当使用 打包项目时,版本号中NuGet前导零总是从、和部分中删除。所以你会得到,而不是得到。此处记录了此行为。MajorMinorBuild2020.01.092020.1.9

  3. 最后,当你调用

    assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
    

    您实际上是在尝试获取与orInformationalVersion 不同的。可能包含任何字符串。这与默认匹配,可能看起来像(注意会有一些前导零。)VersionPackageVersionInformationalVersionInformationalVersionVersion2020.01.09.0704


推荐阅读