使用 [System.Text.RegularExpressions.Regex]::Match(string,string) 参数的 xbuild 无法正常工作(MSBuild 很好)



我有一个目标,它用ReadLinesFromFile读取.proj文件,然后尝试从包含的行中匹配版本号(例如1.0.23),如:

<Target Name="GetRevision">
    <ReadLinesFromFile File="$(MyDir)GetStuff.Data.proj">
      <Output TaskParameter="Lines" ItemName="GetStuffLines" />
    </ReadLinesFromFile>
    <PropertyGroup>
      <In>@(GetStuffLines)</In>
      <Out>$([System.Text.RegularExpressions.Regex]::Match($(In), "(d+).(d+).(d+)"))</Out>
    </PropertyGroup>
    <Message Text="Revision number [$(Out)]" />
    <CreateProperty Value="$(Out)">
      <Output TaskParameter="Value" PropertyName="RevisionNumber" />
    </CreateProperty>
  </Target>

结果总是空的。。即使我尝试做一个简单的Match($(In),"somestring"),它在linux/xbuild中也不能正常工作。这在windows/msbuild 上确实有效

有什么窍门/想法吗?另一种选择是从第一个.proj文件中获取属性版本,而不是读取所有行并用正则表达式匹配数字,但我甚至不知道这是否可能。

我正在运行版本:

XBuild Engine Version 12.0
Mono, Version 4.2.1.0

编辑:我已经能够进一步追踪到Match()中的参数,变量求值有问题。该函数实际上与例如Match("foobar","bar")一起工作,我将获得bar

但其他输入会发生奇怪的事情,例如Match($(In), "Get")将与Get匹配,因为它实际上与字符串"@(GetStuffLines)"匹配

当我做Match($(In), "@..")时,我会得到一个匹配的@(G

但是,当我执行Match($(In), "@.*")时,我实际上得到了输入文件GetStuff.Data.proj的全部内容,这表明变量在某个地方被正确扩展,匹配匹配了整个输入字符串。

我需要绕过Match(),因为它在这一点上似乎被窃听了。我想出的丑陋的解决方案是使用Exec并grep模式,如:

 <Exec Command="grep -o -P '[0-9]+[.][0-9]+[.][0-9]+' $(MyDir)GetStuff.Data.proj > extractedRevisionNumber.tmp" Condition="$(OSTYPE.Contains('linux'))"/>
    <ReadLinesFromFile File="$(ComponentRootDir)extractedRevisionNumber.tmp" Condition="$(OSTYPE.Contains('linux'))">
        <Output TaskParameter="Lines" ItemName="GetExtractedRevisionNumber" />
    </ReadLinesFromFile>

我甚至不能使用属性ConsoleToMSBuildConsoleOutput(https://msdn.microsoft.com/en-us/library/ms124731%28v=VS.110%29.aspx)因为xbuild没有认出那些。。这就是为什么我对模式进行grep并将其保存到一个临时文件中,该文件可以用ReadLinesFromFile读取到我稍后使用的ItemName="GetExtractedRevisionNumber"中。

最新更新