例如,如果我需要将一些字符串替换为
%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.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 2017.1 开始,文件内容替换器可以在固定字符串模式下运行(类似于grep -F
),而不是原来的正则表达式模式:
如果您使用版本化设置(XML或Kotlin DSL变体),还有另一种模式可供您使用(除了REGEX
and FIXED_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 不允许重新排序构建功能,这表明可能无法保证执行顺序。但到目前为止,它对我有用。