Visual studio 2012 项目组中项目的条件包含

Visual studio 2012 项目组中项目的条件包含,visual-studio-2012,msbuild,Visual Studio 2012,Msbuild,我想将文件复制到服务器上,但在此之前,我想包括我生成的最新msi文件 我注意到ItemGroup和Item有一个Condition属性,但我不知道如何利用它来包含最新的文件 到目前为止,这是我的设置: <Target Name="AfterBuild"> <ItemGroup> <Installers Include="\\SERVERNAME\BuildOutput\ProductStream\**\Installers\Customer\Installer

我想将文件复制到服务器上,但在此之前,我想包括我生成的最新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)" />
我想在项目中包括2.1.1405.1301版本,因为这是最新版本

如果有人能帮助我,我将不胜感激,因为我在MSDN博客上找不到如何进行这项工作


谢谢,

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

<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>


Regex.Match(f,@“\\ProductStreamV(?(\d+){0,3}\d+\ \”).Groups[“version”].Value)
.FirstOrDefault();
]]>

<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>