MSBuildCommunityTasks在ReplacementText中的FileUpdate $,(和)

时间:2018-01-25 07:03:00

标签: regex msbuild msbuildcommunitytasks

我正在尝试使用MSBuildCommunityTasks FileUpdate任务修复MSBuild项目中SQLite makefile的问题。

我需要替换确切的字符串" $(LTLIBOPTS)$(LTLIBPATHS)"使用确切的字符串" $(LTLIBOPTS)$(LTLIBPATHS)$(TCLLIBPATHS)。"

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

\$\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中进行文件搜索和替换而不必乱用正则表达式?我讨厌正则表达式。

1 个答案:

答案 0 :(得分:0)

我几乎拥有它。问题不在于替换表达式。问题是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帮助我找出解决问题的方法。

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