ReplacementText 中的 MSBuildCommunityTasks FileUpdate $、( 和 )

MSBuildCommunityTasks FileUpdate $, (, and ) in ReplacementText

我正在尝试使用 MSBuildCommunityTasks FileUpdate 任务解决 MSBuild 项目中 SQLite 生成文件的问题。

我需要用准确的字符串“$(LTLIBOPTS) $(LTLIBPATHS) $(TCLLIBPATHS)”替换准确的字符串“$(LTLIBOPTS) $(LTLIBPATHS)”。

我找到了一个与我正在搜索的字符串相匹配的正则表达式。具体如下。

$\x28LTLIBOPTS\x29 $\x28LTLIBPATHS\x29

问题是我无法弄清楚 ReplacementText 使用什么神奇的咒语来让它替换为所需的文本。我能得到的最接近的如下。

$$\(LTLIBOPTS\) $$\(LTLIBPATHS\) $$\(TCLLIBPATHS\)

我正在使用 FileUpdate 任务,如下所示。

<FileUpdate
  Files="$(MSBuildProjectDirectory)$(SQLITE_DIR)\Makefile.msc"
  Regex="$\x28LTLIBOPTS\x29 $\x28LTLIBPATHS\x29"
  ReplacementText="$$\(LTLIBOPTS\) $$\(LTLIBPATHS\) $$\(TCLLIBPATHS\)" />

这导致在文件中插入以下内容。

$\(LTLIBOPTS\) $\(LTLIBPATHS\) $\(TCLLIBPATHS\)

谁能告诉我 ReplacementText 需要使用什么魔法咒语?

谢谢。

此外,有没有一种方法可以在 MsBuild 中进行文件搜索和替换,而不必乱用正则表达式?我讨厌正则表达式。

我差一点就搞定了。问题不在于替换表达式。问题是 MsBuild 将 $(STRING) 解释为变量引用。我需要在 ReplacementText 中使用 %24 而不是 $,如下所示。

<FileUpdate
  Condition="!Exists('$(MSBuildProjectDirectory)$(SQLITE_DIR)\sqlite_patched')"
  Files="$(MSBuildProjectDirectory)$(SQLITE_DIR)\Makefile.msc"
  Regex="$\x28LTLIBOPTS\x29 $\x28LTLIBPATHS\x29"
  ReplacementText="%24(LTLIBOPTS) %24(LTLIBPATHS) %24(TCLLIBPATHS)" />

顺便说一句,我发现 Regex Storm 上的 .NET Regex Tester 是一种宝贵的资源。它帮助我弄清楚问题根本不在于替换表达式。

一旦我意识到问题不在替换表达式中,这篇文章 How to: Escape Special Characters in MSBuild 帮助我弄清楚如何解决我的问题。

我希望这对可能遇到同样问题的其他人有所帮助。