在 MSBuild 属性中使用数学运算符

问题描述 投票:0回答:2

这样做的目标是将构建版本设置为构建日期的时间戳。我使用

Directory.Build.props
文件来设置项目属性,其中有以下内容:

<PropertyGroup>
    <Version>$([System.DateTime]::Now.Month).$([System.DateTime]::Now.Day).$([System.DateTime]::Now.Year)</Version>
</PropertyGroup>

这工作得很好,但我想通过添加一天中经过的总秒数来提高时间戳的分辨率。

我可以通过执行

$([System.DateTime]::Now.TimeOfDay.TotalSeconds)
相当轻松地获得这个值,但这是一个 Double 并且版本需要 UInt16 - 1。

认为我可以通过执行

$([System.Convert]::ToUInt16( theAboveExpression ))
转换为UInt16。

但是,双精度数可能太大,所以我需要先将其除以,但我根本不知道如何做到这一点。到目前为止,我最好的尝试就是盲目挥舞,因为我似乎找不到任何这样的例子:

$( $([System.DateTime]::Now.TimeOfDay.TotalSeconds) / 2 )

这个表达式无法被计算,我该如何完成这个?

c# visual-studio msbuild
2个回答
6
投票

当然,在决定寻求帮助后不久,我就弄清楚了......

MSBuild 包括 MSBuild 属性函数,可用于划分事物并执行其他操作。这是一个按我需要执行的工作代码示例:

<Version>
  $([System.DateTime]::Now.Month).
  $([System.DateTime]::Now.Day).
  $([System.DateTime]::Now.Year).
  $([System.Convert]::ToUInt16(
      $([MSBuild]::Divide(
          $([System.DateTime]::Now.TimeOfDay.TotalSeconds),
          2
      ))
  ))
</Version>


0
投票

接受的答案非常好,但这种替代方法可能对某些人也有用:

<DayCentury>$([System.String]::Format('{0:00.}',
              $([MSBuild]::Divide(
                $([MSBuild]::Multiply(
                  $([MSBuild]::Add(
                    $([MSBuild]::Multiply(
                      $([System.DateTime]::Now.Hour)
                      , 60)),
                    $([System.DateTime]::Now.Minute)))
                  , 99))
                , 1440))
            ))</DayCentury>
<ApplicationVersion>$([System.DateTime]::Now.ToString('yyyyMMdd'))$(DayCentury)</ApplicationVersion>

该版本具有以下功能:

  • 它与
    <ApplicationVersion>
    兼容,(至少在某些项目类型中,例如毛伊岛)预计是一个整数
  • 版本号总是随着时间的推移而增加,这有时是可取的(有时是至关重要的)
  • 它产生尽可能多的粒度
    • 构建日期仍可辨认
    • 结果数字适合 32 位有符号整数
  • 它将一直有效到 2148 年 1 月 1 日(之后该值将只能容纳在unsigned 32 位 int 中)

它简单地使用年、月和日,然后将日分成 100 个细分,并将这个两位数值附加到末尾。每个周期持续不到 15 分钟(我称之为

DayCentury
),这意味着间隔 > 15 分钟的构建将始终具有比以前使用的任何构建更高的构建编号。

我的示例有点笨拙,但我已在 MSBuild 中执行算术并避免

DayCentury
变量中出现空格的限制范围内尽我所能对其进行格式化。另外,我知道“世纪”是 100 年的集合,而不是 100 年的细分。欢迎更好的命名法......

© www.soinside.com 2019 - 2024. All rights reserved.