MSBuild通常使用正斜杠替换构建文件中的反斜杠(通常位于路径中),这有助于处理跨平台项目。但我有一个任务,我不希望MSBuild触摸我的反斜杠:我们的构建中有一个自定义任务,它采用正则表达式和替换任务,并更新文件。 (我正在使用它来更新AssemblyInfo.cs文件中的版本号,从git describe
获取版本号。有一个TeamCity构建功能,只有我可以控制它运行时才能工作,但这是一个不同的故事 - - 足以说明在我的MSBuild文件中执行此操作看起来是目前最好的方法。
我的问题是MSBuild通过在我传递给我们的自定义任务的属性中使用正斜杠替换反斜杠来“帮助”我,对我的正则表达式造成严重破坏。我写的:
<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs" Regex='AssemblyFileVersion\("[^"]+"\)' ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />
我在构建日志中得到了什么:
error : Did not manage to replace 'AssemblyFileVersion/("[^"]+"/)' with 'AssemblyFileVersion/("1.1.0.92"/)'
注意我的正则表达式中的反斜杠是如何成为正斜杠的?是的,这不会匹配我的AssemblyInfo.cs文件中的任何内容。
我已经能够通过避免在我的正则表达式中完全使用反斜杠来解决这个问题,如下所示:
<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs" Regex='AssemblyFileVersion[(]"[^"]+"[)]' ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />
但这并不适用于所有情况。迟早我需要一个带有\s
的正则表达式,或者其他一些反斜杠表达式,然后我就会沉没。在此之前,我真的想弄清楚如何告诉MSBuild“停止帮助我!我说反斜杠,我真的意味着反斜杠,而不是正斜杠,在这个ONE属性。你可以”帮助“我的所有其他属性你喜欢,但别这个!“有什么想法吗?
答案 0 :(得分:0)
您可以创建自己的替换文字任务,只需更改/或\或使用其他更独特的标记即可控制错误替换的字符。
<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<ParameterGroup>
<InputFilename ParameterType="System.String" Required="true" />
<MatchExpression ParameterType="System.String" Required="true" />
<ReplacementText ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Core" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Text.RegularExpressions" />
<Code Type="Fragment" Language="cs">
<![CDATA[
File.WriteAllText(
InputFilename,
Regex.Replace(File.ReadAllText(InputFilename), MatchExpression.Replace('/', '\\'), ReplacementText)
);
]]>
</Code>
</Task>