这样做的目标是将构建版本设置为构建日期的时间戳。我使用
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 )
这个表达式无法被计算,我该如何完成这个?
当然,在决定寻求帮助后不久,我就弄清楚了......
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>
接受的答案非常好,但这种替代方法可能对某些人也有用:
<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>
兼容,(至少在某些项目类型中,例如毛伊岛)预计是一个整数它简单地使用年、月和日,然后将日分成 100 个细分,并将这个两位数值附加到末尾。每个周期持续不到 15 分钟(我称之为
DayCentury
),这意味着间隔 > 15 分钟的构建将始终具有比以前使用的任何构建更高的构建编号。
我的示例有点笨拙,但我已在 MSBuild 中执行算术并避免
DayCentury
变量中出现空格的限制范围内尽我所能对其进行格式化。另外,我知道“世纪”是 100 年的集合,而不是 100 年的细分。欢迎更好的命名法......