سؤال

واني اسعى الى الحصول على قائمة من جميع الجمعيات وحدة اختبار تحت جذر مشروعي. أستطيع أن أفعل ذلك كما يلي:

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

ولكن، هذا سوف تجد نفسها دلس عدة مرات منذ وجودها في العديد من الدلائل الفرعية. هل هناك طريقة سهلة بالنسبة لي لتطبيع بناء على البند الفوقية (أي اسم الملف والإرشاد) حتى أستطيع الحصول على قائمة من DLLs اختبار وحدة فريدة من نوعها؟ أو هل تضطر الى اللجوء الى الكتابة مهمة بلدي؟

هل كانت مفيدة؟

المحلول

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>

نصائح أخرى

وعلى الرغم من هذا العمر، لم أتمكن من الحصول توماس حل للعمل نفسي، ولكن لم أجد نوعا من الحل فقط باستخدام الأوامر المضمنة مع V4.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" />

وثائق: وظائف البند

وكان لي بحث جيد على الانترنت وتعذر العثور على أي طريقة للقيام بذلك. إذا كان أي شخص يعرف طريقة مضمنة نظيفة ثم اسمحوا لي أن أعرف. في هذه الأثناء، كتبت مهمة بسيطة للقيام بهذه المهمة. استخدام يبدو مثل هذا:

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

وبعد تنفيذ المهمة المذكورة أعلاه، سوف يحتوي MyNormalizedItems فقط تلك العناصر من ItemsToNormalize التي لها قيمة فريدة لالفوقية Filename. إذا اثنين أو أكثر من العناصر لديها نفس القيمة للبيانات الوصفية Filename، وسيتم تضمين المباراة الأولى في الإخراج.

ورمز للمهمة 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();
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top