我有一个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)" />
正如您所看到的,除了要替换的实际文本和属性名称(它们本身是相同的)之外,这还有很多重复。
有没有办法重写这个?我没有太多运气找到正确的命令。
PS。 ReplaceFileText是一个自定义任务。
答案 0 :(得分:1)
我们可以使用“如果我想让这些更改不仅仅是那个.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:\MsBuild\Build\</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:\MsBuild\Batching.nuspec replacing "\$Version\$" with "1.0.0.1"
In file c:\MsBuild\Batching.nuspec replacing "\$SolutionName\$" with "Batching"
In file c:\MsBuild\Batching.nuspec replacing "\$Authors\$" with "Authors"
In file c:\MsBuild\Batching.nuspec replacing "\$Owners\$" with "Owner list"
In file c:\MsBuild\Batching.nuspec replacing "\$Summary\$" with "Lorem ipsum dolor sit amet."
In file c:\MsBuild\Batching.nuspec replacing "\$Description\$" with "Consectetur adipiscing elit."
In file c:\MsBuild\Batching.nuspec replacing "\$Tags\$" with "lists, tags, collections"
In file c:\MsBuild\Batching.nuspec replacing "\$ProjectUrl\$" with "ProjectUrl"
In file c:\MsBuild\Batching.nuspec replacing "\$IconUrl\$" with "IconUrl"
In file c:\MsBuild\Batching.nuspec replacing "\$BuildDir\$" with "c:\MsBuild\Build\"
ReplaceFileText:
In file c:\MsBuild\Batching.oldspec replacing "\$Version\$" with "1.0.0.1"
In file c:\MsBuild\Batching.oldspec replacing "\$SolutionName\$" with "Batching"
In file c:\MsBuild\Batching.oldspec replacing "\$Authors\$" with "Authors"
In file c:\MsBuild\Batching.oldspec replacing "\$Owners\$" with "Owner list"
In file c:\MsBuild\Batching.oldspec replacing "\$Summary\$" with "Lorem ipsum dolor sit amet."
In file c:\MsBuild\Batching.oldspec replacing "\$Description\$" with "Consectetur adipiscing elit."
In file c:\MsBuild\Batching.oldspec replacing "\$Tags\$" with "lists, tags, collections"
In file c:\MsBuild\Batching.oldspec replacing "\$ProjectUrl\$" with "ProjectUrl"
In file c:\MsBuild\Batching.oldspec replacing "\$IconUrl\$" with "IconUrl"
In file c:\MsBuild\Batching.oldspec replacing "\$BuildDir\$" with "c:\MsBuild\Build\"
ReplaceFileText:
In file c:\MsBuild\Batching.brrwdspec replacing "\$Version\$" with "1.0.0.1"
In file c:\MsBuild\Batching.brrwdspec replacing "\$SolutionName\$" with "Batching"
In file c:\MsBuild\Batching.brrwdspec replacing "\$Authors\$" with "Authors"
In file c:\MsBuild\Batching.brrwdspec replacing "\$Owners\$" with "Owner list"
In file c:\MsBuild\Batching.brrwdspec replacing "\$Summary\$" with "Lorem ipsum dolor sit amet."
In file c:\MsBuild\Batching.brrwdspec replacing "\$Description\$" with "Consectetur adipiscing elit."
In file c:\MsBuild\Batching.brrwdspec replacing "\$Tags\$" with "lists, tags, collections"
In file c:\MsBuild\Batching.brrwdspec replacing "\$ProjectUrl\$" with "ProjectUrl"
In file c:\MsBuild\Batching.brrwdspec replacing "\$IconUrl\$" with "IconUrl"
In file c:\MsBuild\Batching.brrwdspec replacing "\$BuildDir\$" with "c:\MsBuild\Build\"
ReplaceFileText:
In file c:\MsBuild\Batching.bluspec replacing "\$Version\$" with "1.0.0.1"
In file c:\MsBuild\Batching.bluspec replacing "\$SolutionName\$" with "Batching"
In file c:\MsBuild\Batching.bluspec replacing "\$Authors\$" with "Authors"
In file c:\MsBuild\Batching.bluspec replacing "\$Owners\$" with "Owner list"
In file c:\MsBuild\Batching.bluspec replacing "\$Summary\$" with "Lorem ipsum dolor sit amet."
In file c:\MsBuild\Batching.bluspec replacing "\$Description\$" with "Consectetur adipiscing elit."
In file c:\MsBuild\Batching.bluspec replacing "\$Tags\$" with "lists, tags, collections"
In file c:\MsBuild\Batching.bluspec replacing "\$ProjectUrl\$" with "ProjectUrl"
In file c:\MsBuild\Batching.bluspec replacing "\$IconUrl\$" with "IconUrl"
In file c:\MsBuild\Batching.bluspec replacing "\$BuildDir\$" with "c:\MsBuild\Build\"