Фильтрация вывода Msbuild CreateItem для инкрементальной проверки StyleCop

Я пытаюсь изменить цели stylecop, чтобы поддерживать добавочную проверку только файлов, которые изменились.

При отладке я вижу, что @(Compile) — это список файлов, которые нужно проверить; однако я хотел бы отфильтровать этот список только для файлов, которые были изменены (т.е. те, которые имеют отметку времени позже, чем целевая dll, на которую, как я знаю, я могу ссылаться как $(TargetPath) ).

Как вы можете повторить вывод этого createitem, «StyleCopFiles» и удалить те файлы, которые не изменились?

Ниже приведена цель, к которой я хотел бы добавить условие фильтра:

<Target Name="SetUpStyleCopProperties">
        <!-- Determine what files should be checked. Take all Compile items, but exclude those that have
        set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. -->
        <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' != 'true') and ('%(Compile.ExcludeFromSourceAnalysis)' != 'true')">
            <Output TaskParameter="Include" ItemName="StyleCopFiles"/>
        </CreateItem>

        <!-- Show list of what files should be excluded. checked. Take all Compile items, but exclude those that have
        set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. -->
        <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' == 'true') or ('%(Compile.ExcludeFromSourceAnalysis)' == 'true')">
            <Output TaskParameter="Include" ItemName="StyleCopExcludedFiles"/>
        </CreateItem>
    </Target>

person badazzhindu    schedule 11.09.2013    source источник
comment
Есть ли какая-то конкретная причина, по которой вы не хотите использовать встроенную функцию кэширования результатов StyleCop?   -  person Nicole Calinoiu    schedule 11.09.2013
comment
Каждый раз, когда я меняю 1 файл, он повторно выполняет проверку стиля для всего проекта. Наш проект невероятно большой, и цель стиля копа занимает ~ 10 секунд.   -  person badazzhindu    schedule 11.09.2013
comment
Это с включенным кэшированием результатов StyleCop? (stylecop.codeplex.com/wikipage?title=Results%20Caching%20tab)   -  person Nicole Calinoiu    schedule 11.09.2013
comment
Ага. У меня есть этот набор.   -  person badazzhindu    schedule 11.09.2013
comment
Почему бы не отключить stylecop в конфигурации отладки. Я сомневаюсь, что его нужно запускать каждый раз при компиляции.   -  person James Woolfenden    schedule 12.09.2013
comment
Моя организация заинтересована в поддержании стиля и долговечности кода. Мы помечаем предупреждения как сбои и не хотим, чтобы код загружался, если он не был обработан стилем.   -  person badazzhindu    schedule 12.09.2013


Ответы (1)


То, что вы предлагаете, было бы возможно с использованием пользовательской задачи MSBuild. Однако инкрементальный анализ StyleCop, вероятно, не будет работать так, как вы ожидаете, поскольку неудачный анализ StyleCop не обязательно предотвратит компиляцию. Представьте себе следующую последовательность событий в рамках предложенного вами пошагового анализа:

  1. Файл A.cs изменен, включая добавление проблемы, которая может вызвать предупреждение StyleCop.
  2. Проект построен.
  3. Файл B.cs изменен, включая добавление проблемы, которая может вызвать предупреждение StyleCop. (Файл A.cs не изменяется.)
  4. Проект построен.

В #2 вы увидите предупреждение StyleCop о проблеме в A.cs. Однако в № 4 вы увидите проблему только в B.cs, а не в A.cs. Это действительно то, что вы хотите?

Если вы действительно обнаружите, что StyleCop вызывает проблемную задержку во время локальных сборок разработчика, есть еще одна альтернатива: создать альтернативную конфигурацию сборки, в которой отсутствует StyleCop. Например, я обычно создаю конфигурацию решения «DebugCompileOnly», в которой отсутствуют анализы StyleCop и FxCop. Разработчики могут использовать это по своему усмотрению на своих локальных машинах, но предполагается, что они компилируются в конфигурации отладки (которая включает оба инструмента) перед фиксацией. Сборка с непрерывной интеграцией на сервере сборки использует конфигурацию отладки, что гарантирует очень быстрое обнаружение любого сбоя.

person Nicole Calinoiu    schedule 12.09.2013