Msbuild MS构建重复命令的重构

Msbuild MS构建重复命令的重构,msbuild,refactoring,Msbuild,Refactoring,我有一个msbuild文件,其中一个部分在一个文件中执行一系列文本替换(以生成一个填充模板nuspec文件) 正如您所看到的,除了被替换的实际文本和属性名称(它们本身是相同的)之外,这是大量重复 有没有办法重写这个?我找不到正确的命令 ps.ReplaceFileText是一项自定义任务。我们可以通过“如果我想对.nuspec文件以外的文件进行更改怎么办?”使混合变得复杂,但您正在尝试重构该文件以使其可读 让我们创建一个名为“batching.proj”的示例项目,可以使用“MsBuild.

我有一个msbuild文件,其中一个部分在一个文件中执行一系列文本替换(以生成一个填充模板nuspec文件)


正如您所看到的,除了被替换的实际文本和属性名称(它们本身是相同的)之外,这是大量重复

有没有办法重写这个?我找不到正确的命令


ps.ReplaceFileText是一项自定义任务。

我们可以通过“如果我想对.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 &quot;%(MatchExpression.Identity)&quot; with &quot;%(MatchExpression.Text)&quot; " Importance="High" />
    </Target>
</Project>
<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 &quot;%(MatchExpression.Identity)&quot; with &quot;%(MatchExpression.Text)&quot; " 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\"