Нормализация списка объектов в MSBuild

Вы можете указать подкомпонентные классы, которые должны зависеть от компонента, дочерним для которого является ваш модуль.

У меня есть компонент A с модулем ModuleA и компонент B. Если вы укажете subcomponents = B.class внутри ModuleA, то кинжал не будет компилировать, давая

error: A doesn't have a @Subcomponent.Builder, which is required when used with @Module.subcomponents
@Module(subcomponents = {B.class})
^

, если компонент B не является подкомпонентом A.

7
задан tshepang 31 October 2013 в 23:14
поделиться

2 ответа

Пакет Расширения 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>
4
ответ дан 6 December 2019 в 15:36
поделиться

Я имел хороший поиск онлайн и не мог найти способ сделать это. Если кто-либо знает чистый встроенный путь, затем сообщенный мне. Тем временем я записал простую задачу сделать задание. Использование похоже на это:

<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();
        }
    }
}
2
ответ дан 6 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: