4

在我的构建脚本中,我的代码很平静:

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

它实际上可以nunit-console.exe在我的包文件夹中找到所有内容。让它使用这样的东西:

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

当只有一个时它可以工作nunit-console.exe,但显然它只是连接路径如果超过一个退出。

  1. 有没有办法从项目集合中获取最后一项(在我的例子中是 NUnitRunners)?
  2. 任何其他技术如何在包文件夹中获取最新 nunit-console.exe 的路径?
4

3 回答 3

2

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

一些链接:

于 2013-11-15T16:56:12.493 回答
2

这可能有点棘手,但您可以使用批处理来提取最后一项,只需分配%(Items.Identity)给一个属性。

提取第一个项目有点棘手,您必须通过创建新项目来反转原始项目的顺序<Reversed Include="@(Items->Reverse())" />。然后你分配%(Reversed.Identity)给一个属性。

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

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

于 2018-10-19T12:05:36.997 回答
1

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

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

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

但最后我不想要开销,如果有太多/不够,我会收到一条错误消息。

<Error Condition="@(NUnitRunners->Count()) != 1" Text="@(NUnitRunners->Count()) nunit runners found." />
于 2017-05-10T13:56:54.807 回答