如何在文件内容替换队伍的变量中跳出反斜杠
例如,如果我需要替换一些字符串到%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 2017.1以来, 文件内容替代者可以运行在固定字符串模式(类似于grep -F
),而不是原始的正则表达式模式:
如果使用版本化设置 ( XML或Kotlin DSL变体),还有另外一种模式(除了REGEX
和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不支持在%-references中额外处理值,它只能“按原样”使用。
在你的情况下,可能的解决方法是:
- 不要使用文件内容替换器,并执行相关逻辑作为构建脚本的第一步,如果需要,您可以处理转义。
- 逃避价值和提供给TeamCity作为已经逃脱的形式参数。 由于文件内容替换器在构建步骤之前工作,所以可以在构建链的以前的构建中完成,并且可以在构建链中使用参数;
- 编写一个TeamCity插件 ,为一组预定义的参数提供转义值
还有另外一个解决方案,但这有点破解。 只需用两个独立的文件内容替换器分两个阶段进行替换。
- 第一个应该是一个正则表达式匹配器。 它使用正则表达式模式找到要替换的字符串,并用一个固定的已知字符串(一个GUID将会执行,或者任何唯一的魔术字符串)替换它,
- 第二个文件内容替换器匹配相同的文件,但是是固定字符串匹配器,并用参数值替换第一步中的固定字符串。 因为它是一个固定字符串匹配器,参数值中的反斜杠将被保留。
这种方法唯一的小问题是团队城市不允许对构建特征进行重新排序,这意味着执行顺序可能无法保证。 但是到目前为止,这对我很有用。