如何在文件内容替换器 teamcity 的变量中转义反斜杠

How to escape backslashes in variable of File content replacer teamcity

例如,如果我需要将一些字符串替换为 %teamcity.agent.work.dir%\nd_r\bin\isf。但是如果变量 teamcity.agent.work.dirC:\BuildAgent\work\,它会删除所有反斜杠并将文本替换为 C:BuildAgentwork\nd_r\bin\isf

如果我最初不知道它的值,我如何转义变量中的所有反斜杠?

\Q%env.NDRIVE%\E\nd_r\bin\isf - 它不起作用。

TeamCity 不支持对 %-references 中的值进行额外处理,只能使用 "as is".

对于您的情况,可能的解决方法是:

  • 不要使用文件内容替换器并在脚本中执行相关逻辑作为构建的第一步,如有必要,您可以在脚本中处理转义;
  • 从链中的构建中转义值和supply to TeamCity as a parameter in already escaped form. Since File content replacer works before the build steps, this can be done in a previous build in the build chain and the parameter can be used
  • 编写一个 TeamCity plugin 将为一组预定义参数提供转义值

由于 TeamCity 2017.1File Content Replacer 可以 运行 在固定字符串模式(类似于 grep -F),与原始正则表达式模式相反:

如果您使用versioned settings (either XML or Kotlin DSL variant), there's yet another mode available to you (in addition to REGEX and FIXED_STRINGS): REGEX_MIXED. In this mode, the search pattern will still be interpreted as a regular expression, but the replacement text will be quoted,那么\$字符将不再具有任何特殊含义。

如果将设置导出到 Kotlin,示例 File Content Replacer 配置可能如下所示:

features {
    replaceContent {
        fileRules = "**/*"
        pattern = "(?iu)the\h+pattern\h+to\h+search\h+for"
        regexMode = FileContentReplacer.RegexMode.REGEX_MIXED
        replacement = """%teamcity.agent.work.dir%\nd_r\bin\isf"""
    }
}

还有另一种解决方案,但有点麻烦。只需使用两个单独的文件内容替换器分两个阶段进行替换。

  • 第一个应该是正则表达式匹配器。它使用正则表达式模式找到您想要替换的字符串,并将其替换为固定的已知字符串(GUID 或任何独特的魔术字符串)
  • 第二个文件内容替换器匹配相同的文件,但是是一个固定字符串匹配器,将第一步中的固定字符串替换为参数值。因为它是固定字符串匹配器,参数值中的反斜杠被保留。

这种方法唯一的小问题是 teamcity 不允许重新排序构建功能,这表明可能无法保证执行顺序。但到目前为止它对我有用。