2014-05-13 38 views
0

我想将文件复制到服务器,但在执行此操作之前,我想包括我生成的最新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)" /> 

这样做的输出有两个文件: 如

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

我想包括2.1.1405.1301构建中这是最新的项目。

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

谢谢,

回答

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>