Frage

Ich versuche, eine Liste aller Unit-Test-Baugruppen unter der Wurzel meines Projektes zu erhalten. Ich kann dies tun, wie folgt:

<CreateItem Include="**\bin\**\*.UnitTest.*.dll">
   <Output TaskParameter="Include" ItemName="Items"/>
</CreateItem>

Dies wird jedoch die gleichen DLLs mehrfach finden, da sie in mehrere Unterverzeichnisse vorhanden sind. Gibt es eine einfache Möglichkeit für mich, auf Artikel Metadaten (dh. Der Dateiname und Erweiterung) auf der Basis zu normalisieren, so dass ich eine Liste des einzigartigen Unit-Test-DLLs bekommen? Oder muss ich schreibe meine eigene Aufgabe zurückgreifen müssen?

War es hilfreich?

Lösung

Die MSBuild Extension Pack enthält die Aufgabe MSBuildHelper , die Unterstützung der Befehl 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>

Andere Tipps

Auch wenn diese alt ist, konnte ich nie Thomas Lösung bekommen, mich zu arbeiten, aber ich habe irgendwie eine Abhilfe nur eingebaute Befehle mit v4.0 von msbuild mit finden:

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

Dokumentation: Punkt Funktionen

hatte ich eine gute Online-Suche und jede mögliche Weise nicht, dies zu tun finden. Wenn jemand eine saubere integrierte Möglichkeit weiß, dann lass es mich wissen. In der Zwischenzeit habe ich eine einfache Aufgabe, die Arbeit zu erledigen. Die Verwendung sieht wie folgt aus:

<NormalizeByMetadata Items="@(ItemsToNormalize)" MetadataName="Filename">
    <Output TaskParameter="NormalizedItems" ItemName="MyNormalizedItems"/>
</NormalizeByMetadata>

Nachdem die obige Aufgabe ausgeführt hat, wird MyNormalizedItems enthalten nur die Elemente aus ItemsToNormalize, die einen eindeutigen Wert für die Filename Metadaten haben. Wenn zwei oder mehr Elemente den gleichen Wert für ihre Filename Metadaten haben, wird das erste Spiel in der Ausgabe enthalten sein.

Der Code für die MSBuild-Aufgabe ist:

public class NormalizeByMetadata : Task
{
    [Required]
    public ITaskItem[] Items
    {
        get;
        set;
    }

    [Required]
    public string MetadataName
    {
        get;
        set;
    }

    [Output]
    public ITaskItem[] NormalizedItems
    {
        get;
        private set;
    }

    public override bool Execute()
    {
        NormalizedItems = Items.Distinct(new ItemEqualityComparer(MetadataName)).ToArray();
        return true;
    }

    private sealed class ItemEqualityComparer : IEqualityComparer<ITaskItem>
    {
        private readonly string _metadataName;

        public ItemEqualityComparer(string metadataName)
        {
            Debug.Assert(metadataName != null);
            _metadataName = metadataName;
        }

        public bool Equals(ITaskItem x, ITaskItem y)
        {
            if (x == null || y == null)
            {
                return x == y;
            }

            var xMetadata = x.GetMetadata(_metadataName);
            var yMetadata = y.GetMetadata(_metadataName);
            return string.Equals(xMetadata, yMetadata);
        }

        public int GetHashCode(ITaskItem obj)
        {
            if (obj == null)
            {
                return 0;
            }

            var objMetadata = obj.GetMetadata(_metadataName);
            return objMetadata.GetHashCode();
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top