3

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

4

3 回答 3

3

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

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

  • 不要使用文件内容替换器并在脚本中执行相关逻辑作为构建的第一步,您可以在其中处理转义(如有必要);
  • 将值转义并提供给 TeamCity 作为已转义形式的参数。由于文件内容替换器在构建步骤之前工作,这可以在构建链中的先前构建中完成,并且可以从链中的构建中使用参数;
  • 编写一个TeamCity 插件,该插件将为一组预定义的参数提供转义值
于 2016-06-27T16:40:18.690 回答
1

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

FIXED_STRINGS 模式下的文件内容替换器

如果您使用版本化设置XMLKotlin DSL变体),还有另一种模式可供您使用(除了REGEXand FIXED_STRINGSREGEX_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"""
    }
}
于 2017-04-12T15:26:21.360 回答
0

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

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

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

于 2017-07-21T11:40:16.000 回答