如何从MsBuild项中获取最后一项?

如何从MsBuild项中获取最后一项?,msbuild,Msbuild,在我的构建脚本中,我拥有代码的和平: <CreateItem Include="src\packages\**\nunit-console.exe"> <Output TaskParameter="Include" ItemName="NUnitRunners"/> </CreateItem> 当只有一个nunit console.exe时,它会工作,但显然,如果有多个路径退出,它只会连接路径 有没有办法从items集合中获取最后一项 (我的情况是Nun

在我的构建脚本中,我拥有代码的和平:

<CreateItem Include="src\packages\**\nunit-console.exe">
  <Output TaskParameter="Include" ItemName="NUnitRunners"/>
</CreateItem>
当只有一个
nunit console.exe
时,它会工作,但显然,如果有多个路径退出,它只会连接路径

  • 有没有办法从items集合中获取最后一项 (我的情况是Nunitrunner)
  • 任何其他技术如何获得的路径 软件包文件夹中最新的nunit-console.exe

  • 您可以尝试创建一个
    ItemGroup
    ,然后使用
    MSBuild.ExtensionPack.Framework.MsBuildHelper
    从中提取元素

    一些链接:

    • 有关MSDN的类似问题:

    • MsBuildHelper文档:


    我试图解决完全相同的问题。我写了一个内联任务来解决这个问题:

    <UsingTask TaskName="GetFirstItem" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
      <ParameterGroup>
        <Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
        <FirstItem ParameterType="System.String" Output="true" Required="false" />
      </ParameterGroup>
      <Task>
        <Using Namespace="System.Linq"/>
        <Code Type="Fragment" Language="cs">FirstItem = Items.First().ItemSpec;</Code>
      </Task>
    </UsingTask>
    
    
    FirstItem=Items.First().ItemSpec
    
    请参见此处的示例:

    但最后,我不想增加额外的开销,如果太多/不够,我会给出一条错误消息

    <Error Condition="@(NUnitRunners->Count()) != 1" Text="@(NUnitRunners->Count()) nunit runners found." />
    

    这可能有点老套,但您可以通过将
    %(Items.Identity)
    分配给属性,使用批处理来提取最后一项

    提取第一个项目有点棘手,您必须通过创建新项目来颠倒原始项目的顺序
    。然后将
    %(Reversed.Identity)
    分配给属性

    我不确定这是否会中断,但即使启用了并行构建,对我来说也不错

    请参见此处的示例:

    <Error Condition="@(NUnitRunners->Count()) != 1" Text="@(NUnitRunners->Count()) nunit runners found." />