MS 构建重复命令的重构



我有一个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 &quot;%(MatchExpression.Identity)&quot; with &quot;%(MatchExpression.Text)&quot; " 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"

最新更新