【问题标题】:Conditional Include on Items in an Item Group项目组中项目的条件包含
【发布时间】:2014-05-13 13:57:17
【问题描述】:

我想将文件复制到服务器上,但在此之前我想包含我生成的最新 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 博客中找到如何去做。

谢谢,

【问题讨论】:

    标签: visual-studio-2012 msbuild


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 2023-04-07
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多