0

我有一个使用 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这表明变量在某处正确扩展并且匹配匹配整个输入字符串。

4

1 回答 1

1

我需要绕过 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>

我什至无法使用这些属性ConsoleToMSBuildConsoleOutputhttps://msdn.microsoft.com/en-us/library/ms124731%28v=VS.110%29.aspx),因为 xbuild 没有识别这些。这就是为什么我grep 模式并将其保存到一个临时文件中,该文件可以读取ReadLinesFromFileItemName="GetExtractedRevisionNumber"我以后使用的文件中。

于 2015-11-30T13:04:18.937 回答