规范化MSBuild中的项目列表

Ken*_*art 7 msbuild unique normalize distinct

我正在尝试获取项目根目录下的所有单元测试程序集的列表.我可以这样做:

<CreateItem Include="**\bin\**\*.UnitTest.*.dll">
   <Output TaskParameter="Include" ItemName="Items"/>
</CreateItem>
Run Code Online (Sandbox Code Playgroud)

但是,由于它们存在于多个子目录中,因此会多次找到相同的DLL.有没有一种简单的方法让我根据项目元数据(即文件名和扩展名)进行规范化,以便获得一个唯一的单元测试DLL列表?或者我是否必须编写自己的任务?

小智 8

即使这已经过时了,我也无法让托马斯解决方案自己工作,但我确实找到了一种解决方法,只使用内置命令和vbu.0的msbuild:

<ItemGroup>
    <TestAssemblies Include="$(SolutionRoot)\**\bin\*.Tests.dll" />
    <TestItems Include="%(TestAssemblies.FileName)%(TestAssemblies.Extension)">
        <ItemPath>%(TestAssemblies.Identity)</ItemPath>
    </TestItems>
    <DistinctTestItems Include="@(TestItems->Distinct())"></DistinctTestItems>
</ItemGroup>
<Message Text="%(DistinctTestItems.ItemPath)" Importance="high" />
Run Code Online (Sandbox Code Playgroud)

文档:项目功能


Tho*_*erg 4

MSBuild扩展包包含任务MSBuildHelper,支持命令RemoveDuplicateFiles

<CreateItem Include="**\bin\**\*.UnitTest.*.dll">
    <Output TaskParameter="Include" ItemName="Items"/>
</CreateItem>
<MSBuild.ExtensionPack.Framework.MsBuildHelper TaskAction="RemoveDuplicateFiles" InputItems1="@(Items)">
    <Output TaskParameter="OutputItems" ItemName="Items"/>
</MSBuild.ExtensionPack.Framework.MsBuildHelper>
Run Code Online (Sandbox Code Playgroud)