我有一个msbuild文件,一个部分在一个文件中做了一堆文本替换(生成一个填写模板nuspec文件)
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$Version$" ReplacementText="$(Version)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$SolutionName$" ReplacementText="$(SolutionName)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$Authors$" ReplacementText="$(Authors)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$Owners$" ReplacementText="$(Owners)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$Summary$" ReplacementText="$(Summary)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$Description$" ReplacementText="$(Description)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$Tags$" ReplacementText="$(Tags)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$ProjectUrl$" ReplacementText="$(ProjectUrl)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$IconUrl$" ReplacementText="$(IconUrl)" />
<ReplaceFileText InputFilename="$(SolutionDir)$(SolutionName).nuspec"
MatchExpression="$BuildDir$" ReplacementText="$(BuildDir)" />
如您所见,除了要替换的实际文本和属性名称(它们本身是相同的)之外,这是大量的重复。
有没有办法重写它? 我没有太多运气找到正确的命令。
替换文件文本是一个自定义任务。
我们可以将混合复杂化为"如果我想对不仅仅是那个 .nuspec 文件进行这些更改怎么办?",但您正在尝试重构它以使其可读。
让我们创建一个我们称之为"batching.proj"的示例项目,我们可以使用 "MsBuild.exe Batching.proj" 从命令行调用该项目并查看输出。
<Project ToolsVersion="4.0" DefaultTargets="ReplaceFileText" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Here are some sample properties that will appear throughout the script... -->
<PropertyGroup>
<SolutionDir>c:MsBuild</SolutionDir>
<SolutionName>Batching</SolutionName>
<Version>1.0.0.1</Version>
<Authors>Authors</Authors>
<Owners>Owner list</Owners>
<Summary>Lorem ipsum dolor sit amet.</Summary>
<Description>Consectetur adipiscing elit.</Description>
<Tags>lists, tags, collections</Tags>
<ProjectUrl>ProjectUrl</ProjectUrl>
<IconUrl>IconUrl</IconUrl>
<BuildDir>c:MsBuildBuild</BuildDir>
</PropertyGroup>
<ItemGroup>
<!-- In the custom item group, lets say we want to perform that replacement command on multiple input files. -->
<ReplaceFiles Include="$(SolutionDir)$(SolutionName).nuspec;$(SolutionDir)$(SolutionName).oldspec;$(SolutionDir)$(SolutionName).brrwdspec;$(SolutionDir)$(SolutionName).bluspec" />
<!-- Add our Key-Value pairs in their own itemgroup -->
<MatchExpression Include="$Version$">
<Text>$(Version)</Text>
</MatchExpression>
<MatchExpression Include="$SolutionName$">
<Text>$(SolutionName)</Text>
</MatchExpression>
<MatchExpression Include="$Authors$">
<Text>$(Authors)</Text>
</MatchExpression>
<MatchExpression Include="$Owners$">
<Text>$(Owners)</Text>
</MatchExpression>
<MatchExpression Include="$Summary$">
<Text>$(Summary)</Text>
</MatchExpression>
<MatchExpression Include="$Description$">
<Text>$(Description)</Text>
</MatchExpression>
<MatchExpression Include="$Tags$">
<Text>$(Tags)</Text>
</MatchExpression>
<MatchExpression Include="$ProjectUrl$">
<Text>$(ProjectUrl)</Text>
</MatchExpression>
<MatchExpression Include="$IconUrl$">
<Text>$(IconUrl)</Text>
</MatchExpression>
<MatchExpression Include="$BuildDir$">
<Text>$(BuildDir)</Text>
</MatchExpression>
</ItemGroup>
<!-- Our custom target batches over each input file in @(ReplaceFiles).
The Message task will
iterate over each @(MatchExpression) ItemGroup member invoking the message
task each time. This is where you'd call your custom replacement task. -->
<Target Name="ReplaceFileText" Inputs="@(ReplaceFiles)" Outputs="%(ReplaceFiles->'%(Identity).xml')">
<!-- Add your ReplaceFileText call here. -->
<Message Text="In file @(ReplaceFiles) replacing "%(MatchExpression.Identity)" with "%(MatchExpression.Text)" " Importance="High" />
</Target>
</Project>
输出:
ReplaceFileText:
In file c:MsBuildBatching.nuspec replacing "$Version$" with "1.0.0.1"
In file c:MsBuildBatching.nuspec replacing "$SolutionName$" with "Batching"
In file c:MsBuildBatching.nuspec replacing "$Authors$" with "Authors"
In file c:MsBuildBatching.nuspec replacing "$Owners$" with "Owner list"
In file c:MsBuildBatching.nuspec replacing "$Summary$" with "Lorem ipsum dolor sit amet."
In file c:MsBuildBatching.nuspec replacing "$Description$" with "Consectetur adipiscing elit."
In file c:MsBuildBatching.nuspec replacing "$Tags$" with "lists, tags, collections"
In file c:MsBuildBatching.nuspec replacing "$ProjectUrl$" with "ProjectUrl"
In file c:MsBuildBatching.nuspec replacing "$IconUrl$" with "IconUrl"
In file c:MsBuildBatching.nuspec replacing "$BuildDir$" with "c:MsBuildBuild"
ReplaceFileText:
In file c:MsBuildBatching.oldspec replacing "$Version$" with "1.0.0.1"
In file c:MsBuildBatching.oldspec replacing "$SolutionName$" with "Batching"
In file c:MsBuildBatching.oldspec replacing "$Authors$" with "Authors"
In file c:MsBuildBatching.oldspec replacing "$Owners$" with "Owner list"
In file c:MsBuildBatching.oldspec replacing "$Summary$" with "Lorem ipsum dolor sit amet."
In file c:MsBuildBatching.oldspec replacing "$Description$" with "Consectetur adipiscing elit."
In file c:MsBuildBatching.oldspec replacing "$Tags$" with "lists, tags, collections"
In file c:MsBuildBatching.oldspec replacing "$ProjectUrl$" with "ProjectUrl"
In file c:MsBuildBatching.oldspec replacing "$IconUrl$" with "IconUrl"
In file c:MsBuildBatching.oldspec replacing "$BuildDir$" with "c:MsBuildBuild"
ReplaceFileText:
In file c:MsBuildBatching.brrwdspec replacing "$Version$" with "1.0.0.1"
In file c:MsBuildBatching.brrwdspec replacing "$SolutionName$" with "Batching"
In file c:MsBuildBatching.brrwdspec replacing "$Authors$" with "Authors"
In file c:MsBuildBatching.brrwdspec replacing "$Owners$" with "Owner list"
In file c:MsBuildBatching.brrwdspec replacing "$Summary$" with "Lorem ipsum dolor sit amet."
In file c:MsBuildBatching.brrwdspec replacing "$Description$" with "Consectetur adipiscing elit."
In file c:MsBuildBatching.brrwdspec replacing "$Tags$" with "lists, tags, collections"
In file c:MsBuildBatching.brrwdspec replacing "$ProjectUrl$" with "ProjectUrl"
In file c:MsBuildBatching.brrwdspec replacing "$IconUrl$" with "IconUrl"
In file c:MsBuildBatching.brrwdspec replacing "$BuildDir$" with "c:MsBuildBuild"
ReplaceFileText:
In file c:MsBuildBatching.bluspec replacing "$Version$" with "1.0.0.1"
In file c:MsBuildBatching.bluspec replacing "$SolutionName$" with "Batching"
In file c:MsBuildBatching.bluspec replacing "$Authors$" with "Authors"
In file c:MsBuildBatching.bluspec replacing "$Owners$" with "Owner list"
In file c:MsBuildBatching.bluspec replacing "$Summary$" with "Lorem ipsum dolor sit amet."
In file c:MsBuildBatching.bluspec replacing "$Description$" with "Consectetur adipiscing elit."
In file c:MsBuildBatching.bluspec replacing "$Tags$" with "lists, tags, collections"
In file c:MsBuildBatching.bluspec replacing "$ProjectUrl$" with "ProjectUrl"
In file c:MsBuildBatching.bluspec replacing "$IconUrl$" with "IconUrl"
In file c:MsBuildBatching.bluspec replacing "$BuildDir$" with "c:MsBuildBuild"