2014-05-13 74 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>