Regex 如何在File content replacer teamcity变量中转义反斜杠

Regex 如何在File content replacer teamcity变量中转义反斜杠,regex,teamcity,build-agent,Regex,Teamcity,Build Agent,例如,如果我需要替换一些字符串 %teamcity.agent.work.dir%\\nd\r\\bin\\isf。但是如果变量teamcity.agent.work.dir是C:\BuildAgent\work\,它将删除所有反斜杠并将文本替换为C:BuildAgentwork\nd\r\bin\isf 若我一开始不知道变量的值,那个么我怎么能避开变量中的所有反斜杠呢 \Q%env.NDRIVE%\E\nd\r\bin\isf-它不起作用。TeamCity不支持对%-references中的值

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

若我一开始不知道变量的值,那个么我怎么能避开变量中的所有反斜杠呢


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

TeamCity不支持对%-references中的值进行额外处理,它只能“按原样”使用

在您的情况下,可能的解决办法是:

  • 不要使用File content replacer并在脚本中执行相关逻辑作为构建的第一步,如果需要,您可以在脚本中处理转义
  • 以已转义的形式将值和作为参数转义到TeamCity。由于File content replacer在构建步骤之前工作,因此这可以在构建链中的上一个构建和链中构建的参数中完成
  • 编写一个函数,该函数将为预定义的一组参数提供转义值
自TeamCity2017.1以来,File Content Replacer可以在固定字符串模式下运行(类似于
grep-F
),而不是原来的regex模式:

如果您使用(XML或Kotlin DSL变体),您还可以使用另一种模式(除了
REGEX
FIXED_STRINGS
):
REGEX\u MIXED
。在此模式下,搜索模式仍将被解释为正则表达式,但替换文本将是这样的:
\
$
字符将不再具有任何特殊意义

如果将设置导出到Kotlin,示例文件内容替换器配置可能如下所示:

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不允许对构建功能进行重新排序,这表明执行顺序可能无法保证。但到目前为止,它对我有效