如何在文件内容替换队伍的变量中跳出反斜杠

例如,如果我需要替换一些字符串到%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 2017.1以来, 文件内容替代者可以运行在固定字符串模式(类似于grep -F ),而不是原始的正则表达式模式:

文件内容替代者在FIXED_STRINGS模式

如果使用版本化设置 ( XMLKotlin DSL变体),还有另外一种模式(除了REGEXFIXED_STRINGS ): REGEX_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""" } } 

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

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

  • 不要使用文件内容替换器,并执行相关逻辑作为构建脚本的第一步,如果需要,您可以处理转义。
  • 逃避价值和提供给TeamCity作为已经逃脱的形式参数。 由于文件内容替换器在构建步骤之前工作,所以可以在构建链的以前的构建中完成,并且可以在构建链中使用参数;
  • 编写一个TeamCity插件 ,为一组预定义的参数提供转义值

还有另外一个解决方案,但这有点破解。 只需用两个独立的文件内容替换器分两个阶段进行替换。

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

这种方法唯一的小问题是团队城市不允许对构建特征进行重新排序,这意味着执行顺序可能无法保证。 但是到目前为止,这对我很有用。