7

プロジェクトのルートにあるすべての単体テスト アセンブリのリストを取得しようとしています。私は次のようにこれを行うことができます:

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

ただし、複数のサブディレクトリに存在するため、同じ DLL が複数回検出されます。アイテムのメタデータ (つまり、ファイル名と拡張子) に基づいて正規化し、一意の単体テスト DLL のリストを取得する簡単な方法はありますか? それとも、自分のタスクを書くことに頼る必要がありますか?

4

3 に答える 3

4

MSBuild Extension Packには、コマンドRemoveDuplicateFilesをサポートするタスクMSBuildHelperが含まれています。

<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>
于 2008-12-23T15:23:49.393 に答える
2

オンラインでよく検索しましたが、これを行う方法が見つかりませんでした。誰かがきれいな組み込みの方法を知っているなら、私に知らせてください。その間、私は仕事をするための簡単なタスクを書きました。使用法は次のようになります。

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

上記のタスクが実行された後、メタデータに一意の値を持つMyNormalizedItemsアイテムのみが含まれます。2 つ以上のアイテムのメタデータが同じ値である場合、最初に一致したアイテムが出力に含まれます。ItemsToNormalizeFilenameFilename

MSBuild タスクのコードは次のとおりです。

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();
        }
    }
}
于 2008-12-14T16:10:44.830 に答える