在我的构建脚本中,我有代码的和平:
<CreateItem Include="src\packages\**\nunit-console.exe">
<Output TaskParameter="Include" ItemName="NUnitRunners"/>
</CreateItem>
它实际上找到了我的packages文件夹中的所有nunit-console.exe
。让它使用这样的东西:
<Exec Command=""@(NUnitRunners)" ..." />
当只有一个nunit-console.exe
时,它才有效,但显然只要多出一个路径就会连接路径。
答案 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