【问题标题】:How do I get the difference between two dates in a .csproj file?如何获取 .csproj 文件中两个日期之间的差异?
【发布时间】:2021-05-12 18:42:48
【问题描述】:

我在一个 csproj 文件中看到了一些 code like this

$([System.DateTime]::UtcNow.ToString(mmff))

自动增加程序集版本:

<VersionSuffix>2.0.0.$([System.DateTime]::UtcNow.ToString(mmff))</VersionSuffix>
<AssemblyVersion Condition=" '$(VersionSuffix)' == '' ">0.0.0.1</AssemblyVersion>

那是什么样的语言/脚本?如何使用它来获取两个日期之间的差异?

我试图做这样的事情:

<VersionMajor>2</VersionMajor>
<VersionMinor>1</VersionMinor>
<DaysFromLastRelease>$(([System.DateTime]::UtcNow - new [System.DateTime](2021,1,1))::TotalDays)</DaysFromLastRelease>

但它不起作用:)

【问题讨论】:

  • 它不是一种语言。文件是只读的,是 XML 格式的。
  • OP 说的是像[System.DateTime]::UtcNow.ToString(mmff) 这样的嵌入式表达式。
  • 看起来有点像PowerShell
  • 我不建议使用时间来生成版本号。它可以打破 MSBuild 的增量构建模型并产生更长的构建时间。
  • 看到这个example 关于语义版本控制。它使用 git 的提交信息而不是时间

标签: c# .net visual-studio msbuild csproj


【解决方案1】:

.csproj 文件基本上是 MSBuild 文件 (XML)。您所指的嵌入式语法称为Property Function

似乎不支持使用减号 (-) 的减法。 Property Functions中有一个Subtract()属性函数。

也许这可以作为解决方案的基础。我没试过!

<Now>$([System.DateTime]::UtcNow.DayOfYear)</Now>

<January>$([System.DateTime]::new(2021,1,1)).DayOfYear</January>
<!-- or... (not sure about the below)
<January>$([System.DateTime]::Parse("1/1/2021").DayOfYear)</January>
 -->

<DaysFromLastRelease>$([MSBuild]::Subtract($(Now), $(January)))</DaysFromLastRelease>

其他可能性

  • 通过编写 MSBuild 任务计算日期差
  • 调用您编写的简单程序
  • 不知何故使用外部程序设置环境变量,然后在您的.csproj 中引用该变量

【讨论】:

  • new DateTime 可以用作例如$([System.DateTime]::new(2021,1,1))
  • @Renat 很高兴知道。我会补充我的答案。谢谢。
  • .NET 平台(Framework 和/或 Core、Mono...)的任何编译器都支持此功能,还是仅专用于 Visual Studio?
  • @OlivierRogier 它是 MSBuild,所以大概它可以在 VS 之外工作。
  • 基于您有一个名为DaysFromLastRelease 的节点的事实,听起来您想要计算Now - LastBuildDate,然后在# 天内得到它,对吧?我在回答中提供的内容是硬编码的,所以这就是为什么我说这将是一个基础,而不是一个完整的解决方案。完整的解决方案必须考虑诸如负值之类的奇怪现象。 MSBuild 虽然功能强大,但可能已经在您想做的事情中遇到了它......不确定;)
【解决方案2】:

这对我有用:

<PropertyGroup>
    <VersionMajor Condition="'$(VersionMajor)' == ''">0</VersionMajor>
    <VersionMinor Condition="'$(VersionMinor)' == ''">0</VersionMinor>
    <VersionPatch Condition="'$(VersionPatch)' == ''">$([System.DateTime]::UtcNow.Subtract($([System.DateTime]::new(2001,1,1))).TotalDays.ToString("0"))</VersionPatch>
    <VersionRevision Condition="'$(VersionRevision)' == ''">$([System.DateTime]::UtcNow.TimeOfDay.TotalMinutes.ToString("0"))</VersionRevision>
    <Version>$(VersionMajor).$(VersionMinor).$(VersionPatch).$(VersionRevision)</Version>
</PropertyGroup>

这里我手动设置了 VersionMajor 和 VersionMinor。然后我为 Patch 和 revision 设置了自动递增的值。

  • 补丁:自 2001/01/01(二十一世纪的第一天)以来的天数。
  • 修订:一天中的总分钟数

到 2180 年 6 月为止已经足够了(记住最大版本号是 65534)。


额外提示: 我将所有这些行放入一个 Version.Build.props 文件到 Properties 文件夹中。然后我用这个标签从 csproj 文件中导入它:

<Import Project="$([MSBuild]::GetPathOfFileAbove('Version.Build.props', '$(MSBuildThisFileDirectory)/Properties/'))" />

这样,我可以在我的 csproj 文件中手动设置 proyect 版本,只需设置 VersionMajor 和 VersionMinor 这就是我实际所做的,将它们保留为自动或混合它们。

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2017-03-27
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多