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

时间:2016-06-27 13:43:42

标签: regex teamcity build-agent

例如,如果我需要替换一些字符串  %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 - 它不起作用。

3 个答案:

答案 0 :(得分:3)

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

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

  • 不要使用文件内容替换器并执行相关逻辑作为脚本中构建的第一步,如果需要,您可以在脚本中处理转义;
  • 将值和supply转义为TeamCity,作为已转义格式的参数。由于文件内容替换器在构建步骤之前工作,因此可以在构建链中的先前构建和链中构建的参数can be used中完成;
  • 写一个TeamCity plugin,它将为预定义的一组参数提供转义值

答案 1 :(得分:1)

由于 TeamCity 2017.1 文件内容替换可以在固定字符串模式下运行(类似于grep -F),而不是原始的正则表达式模式:

File Content Replacer in FIXED_STRINGS mode

如果您使用versioned settings XML Kotlin DSL 变体),还有另一种模式可供您使用(除了REGEXFIXED_STRINGS):REGEX_MIXED。在此模式下,搜索模式仍将被解释为正则表达式,但替换文本将为quoted,因此\$字符将不再具有任何特殊含义。< / p>

如果您将设置导出到 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"""
    }
}

答案 2 :(得分:0)

还有另一种解决方案,但这有点像黑客攻击。只需使用两个独立的文件内容替换器分两个阶段进行替换。

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

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