regex - 带有 [System.Text.RegularExpressions.Regex]::Match(string,string) 参数的 xbuild 不能正常工作(MSBuild 很好)

标签 regex linux msbuild mono xbuild

我有一个目标,它使用 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" 中。

关于regex - 带有 [System.Text.RegularExpressions.Regex]::Match(string,string) 参数的 xbuild 不能正常工作(MSBuild 很好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33955006/

相关文章:

msbuild - 你如何编写一个 MSBuild 任务来支持取消?

jquery - 如何使用 jquery.linkify 插件链接 @usernames 和 #hashtags

javascript - 仅当字符串后面没有左方括号或点运算符时才替换字符串,即 "["或 "."

r - 在 R 中,在字符串数据框列中的 % 符号之前提取数字值

c++ - GDB 无法显示堆栈并显示 "#1 0x0000000000000000 in ?? ()"

msbuild - 如何在命令行中抑制来自 msbuild 的所有编译器和代码分析警告?

java - 匹配 REST 中的空路径参数

c - fork() - 让父进程工作而不等待子进程

linux - 将CPU频率指定为引导时Linux的内核CMD_LINE参数?

tfs - 部署 SSIS 包时出现 MSBuild DeploymentModel 无法识别的错误