条件包含在项目组中的项目

时间:2014-05-13 13:57:17

标签: visual-studio-2012 msbuild

我想将文件复制到服务器,但在此之前我想包含我生成的最新msi文件。

我注意到ItemGroup和Item有一个Condition属性,但我不知道如何利用它来包含最新的文件。

到目前为止,这是我的设置:

<Target Name="AfterBuild">
 <ItemGroup>
  <Installers Include="\\SERVERNAME\BuildOutput\ProductStream\**\Installers\Customer\Installer.msi"/>
</ItemGroup>
<Message Text="FirstItem: %(Installers.Filename)" />
<Message Text="FirstItem: %(Installers.FullPath)" />

这个输出是两个文件: e.g

\\Servername\BuildOutput\ProductStream\Installers\ProductStreamV2.1.1202.1402\Installer.msi
\\Servername\BuildOutput\ProductStream\Installers\ProductStreamV2.1.1405.1301\Installer.msi

我想在Item中包含2.1.1405.1301版本,因为这是最新版本。

如果有人会帮助我,我将不胜感激,因为我无法从MSDN博客中找到如何做到这一点。

谢谢,

1 个答案:

答案 0 :(得分:0)

您可以为此目的使用自定义任务。它允许您以任何方式过滤项目。在这里,我使用正则表达式来选择最新的安装程序:

<Target Name="AfterBuild">
    <ItemGroup>
         <Installers Include="**\Installer.msi"/>
    </ItemGroup>
    <SelectLatestInstaller Installers="@(Installers)">
        <Output TaskParameter="LatestInstaller" ItemName="LatestInstaller" />
    </SelectLatestInstaller>
    <Message Text="%(LatestInstaller.FullPath)" />
</Target>

<UsingTask TaskName="SelectLatestInstaller" 
           TaskFactory="CodeTaskFactory" 
           AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <Installers ParameterType="System.String[]" Required="true" />
        <LatestInstaller ParameterType="System.String" Output="true" />
    </ParameterGroup>
    <Task>
        <Reference Include="System.Linq" />
        <Using Namespace="System" />
        <Using Namespace="System.Linq" />
        <Using Namespace="System.Text.RegularExpressions" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
                LatestInstaller = Installers
                    .OrderByDescending(f => Regex.Match(f, @"\\ProductStreamV(?<version>(\d+.){0,3}\d+)\\").Groups["version"].Value)
                    .FirstOrDefault();
        ]]>
        </Code>
    </Task>
</UsingTask>