Question

Je suis en train d'obtenir une liste de tous les ensembles de tests unitaires sous la racine de mon projet. Je peux le faire comme suit:

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

Cependant, cela trouver les mêmes DLL plusieurs fois depuis qu'ils existent dans plusieurs sous-répertoires. Est-il un moyen facile pour moi de Normaliser basé sur les métadonnées de l'élément (ie. Le nom du fichier et l'extension) afin que j'obtenir une liste des DLL de tests unitaires unique? Ou dois-je recourir à écrire ma propre tâche?

Était-ce utile?

La solution

Le MSBuild Extension Pack contient la tâche MSBuildHelper , supportant la commande 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>

Autres conseils

Même si cela est vieux, je ne pourrais jamais obtenir la solution Thomas à me travailler, mais je ne trouve une sorte de solution de contournement en utilisant uniquement des commandes intégrées avec v4.0 de 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" />

Documentation: Fonctions d'article

J'ai eu une bonne recherche en ligne et ne pouvait pas trouver un moyen de le faire. Si quelqu'un connaît un propre façon intégrée alors s'il vous plaît laissez-moi savoir. En attendant, je l'ai écrit une tâche simple pour faire le travail. L'utilisation ressemble à ceci:

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

Une fois la tâche ci-dessus a exécuté, ne contiendra que MyNormalizedItems les articles de qui ont une ItemsToNormalize valeur unique pour les métadonnées Filename. Si deux ou plusieurs éléments ont la même valeur pour leurs métadonnées <=>, seront inclus dans le premier match de la sortie.

Le code pour la tâche MSBuild est:

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();
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top