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

时间:2013-11-15 11:14:11

标签: msbuild

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

<CreateItem Include="src\packages\**\nunit-console.exe">
  <Output TaskParameter="Include" ItemName="NUnitRunners"/>
</CreateItem>

它实际上找到了我的packages文件夹中的所有nunit-console.exe。让它使用这样的东西:

<Exec Command="&quot;@(NUnitRunners)&quot; ..." />

当只有一个nunit-console.exe时,它才有效,但显然只要多出一个路径就会连接路径。

  1. 有没有办法从商品收藏中获取最后一件商品 (在我的情况下是NUnitRunners)?
  2. 任何其他技术如何获得路径 包文件夹中的最新nunit-console.exe?

3 个答案:

答案 0 :(得分:2)

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

一些链接:

答案 1 :(得分:0)

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

git cherry-pick --continue

请在此处查看示例:https://gist.github.com/Serivy/74fff320c93176e6ca7f76e1cc139367

但是最后我不想要开销,如果有太多/不够的话,我会找错信息。

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

答案 2 :(得分:0)

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

提取第一个项目比较麻烦,您必须通过创建新项目<Reversed Include="@(Items->Reverse())" />来颠倒原始项目的顺序。然后,您将%(Reversed.Identity)分配给属性。

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

在此处查看示例:https://gist.github.com/shadow-cs/cb5499b010bdacd1f778be29daf7f04c