如何阻止MSBuild将反斜杠替换为正斜杠?
MSBuild通常将生成文件(通常位于路径中)中的反斜杠替换为正斜杠,这在处理跨平台项目时很有帮助。但我有一个任务不希望MSBuild碰到反斜杠:我们的构建中有一个自定义任务,它接受正则表达式和替换任务,并更新文件。(我正在使用它更新AssemblyInfo.cs文件中的版本号,从如何阻止MSBuild将反斜杠替换为正斜杠?,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,MSBuild通常将生成文件(通常位于路径中)中的反斜杠替换为正斜杠,这在处理跨平台项目时很有帮助。但我有一个任务不希望MSBuild碰到反斜杠:我们的构建中有一个自定义任务,它接受正则表达式和替换任务,并更新文件。(我正在使用它更新AssemblyInfo.cs文件中的版本号,从git Descripte获取版本号。如果我能控制它的运行时间,TeamCity构建功能就可以工作,但这是另一回事——可以说,在我的MSBuild文件中这样做看起来是目前最好的方法) 我的问题是,MSBuild“帮助”
git Descripte
获取版本号。如果我能控制它的运行时间,TeamCity构建功能就可以工作,但这是另一回事——可以说,在我的MSBuild文件中这样做看起来是目前最好的方法)
我的问题是,MSBuild“帮助”了我,在我传递给自定义任务的属性中用正斜杠替换反斜杠,这对我的正则表达式造成了严重破坏。我写的是:
<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs" Regex='AssemblyFileVersion\("[^"]+"\)' ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />
注意我的正则表达式中的反斜杠是如何变成正斜杠的吗?是的,这与我的AssemblyInfo.cs文件中的任何内容都不匹配
我可以通过完全避免在正则表达式中使用反斜杠来解决这个问题,如下所示:
<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs" Regex='AssemblyFileVersion[(]"[^"]+"[)]' ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />
但这并不适用于所有情况。迟早我会需要一个包含
\s
的正则表达式,或者一些其他反斜杠表达式,然后我就会沉下去。在此之前,我很想知道如何告诉MSBuild“停止帮助我!我在这一个属性中说的是反斜杠,我的意思是反斜杠,而不是正斜杠。你可以用你喜欢的其他属性“帮助”我,但别管这个!”有什么想法吗?您可以创建自己的替换文本任务,并通过简单地更改/到\或使用其他更独特的标记来控制错误替换的字符
<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>
源代码现在已打开,因此您可以调试并向Microsoft提出修复建议。
<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>