Игнорирование сгенерированных файлов при использовании Обрабатывать предупреждения как ошибки

Мы начали новый проект, но у существующего проекта тоже есть эта проблема. Проблема в том, что когда мы компилируем с уровнем предупреждения 4, мы также хотим включить

"Считать все предупреждения ошибками"

В настоящее время мы не можем сделать это, потому что в сгенерированных файлах (в частности, файлах reference.cs) отсутствуют такие вещи, как комментарии XML, и это генерирует предупреждение, мы не хотим полностью подавлять предупреждения комментариев XML из всех файлов только для определенных типы файлов (а именно сгенерированный код).

Я придумал, как этого можно достичь, но не уверен, что это лучший способ сделать это или с чего начать :) Я думаю, что нам нужно что-то сделать с шаблонами T4 для кода, который создается таким образом, чтобы он заполняет XML-документацию для сгенерированного кода.

У кого-нибудь есть идеи, в настоящее время у меня более 2k предупреждений (это большой проект) :(


person krystan honour    schedule 30.04.2010    source источник
comment
Вы можете установить свойства отдельных исходных файлов, включая параметры компилятора для отдельных исходных файлов. Они будут иметь приоритет над свойствами, унаследованными от уровня проекта.   -  person Windows programmer    schedule 30.04.2010
comment
Я прокомментировал вышеизложенное, но да, как это достигается, не могли бы вы привести пример, пожалуйста.   -  person krystan honour    schedule 30.04.2010
comment
Извините, я не уверен, можно ли это сделать для C #. Для C ++ в окне обозревателя решений можно щелкнуть правой кнопкой мыши имя файла отдельного файла и задать его свойства. Иногда мне нужно скомпилировать один исходный файл с параметрами, отличными от других, и это работает, по крайней мере, на C ++.   -  person Windows programmer    schedule 06.05.2010
comment
да, я боюсь, что это невозможно с С #. (не очевидным щелчком правой кнопкой мыши)   -  person krystan honour    schedule 06.05.2010


Ответы (5)


Я написал сценарий PowerShell, который вызывает svcutil, а затем обертывает автоматически сгенерированный код директивами #pragma, чтобы игнорировать отсутствующий xml, но все же позволяет мне регенерировать по мере необходимости.

$outFile = 'generatedCode_fromSVCUTIL.cs'
svcutil '..\XML Schema\myXsd.xsd' /dataContractOnly /n:'*,MyNamespace.GeneratedCode' /language:C#  /importxmltypes /out:$outFile

# ----------------------------------------------------- 
# Exempt this file from XML documentation requirements

Write-Host 'Wrapping ', $outFile, ' in #pragma 1591 flags' 
$a = Get-Content $outFile 

# Set up pragma lines for enabling and disabling the XML doc warning
$disableWarning = '#pragma warning disable 1591'
$restoreWarning = '#pragma warning restore 1591'

# wrap the generated code in the pragma tags
Set-Content $outFile –value $disableWarning, $a, $restoreWarning 
Write-Host 'Done.' 
person Mike Parkhill    schedule 05.11.2012
comment
гораздо лучшее решение. Изменил это как принятый ответ, поскольку он не предполагает изменения видимости объектов. - person krystan honour; 20.11.2012

Вы можете выборочно отключить предупреждения с помощью прагмы:

// Disable warning messages 4507 and 4034.
#pragma warning( disable : 4507 34 )

Если вы можете выдавать такие предупреждения (или #include) в сгенерированных файлах кода, все готово.

Кроме того, вы можете отключить их глобально в командной строке компилятора:

/wd4326 disables compiler warning C4326.

Затем снова включите их (через файл заголовка) в файлах, для которых они нужны:

// Report warning 4326 as an error.
#pragma warning( error : 326 )

Наконец, вы можете установить разные параметры компиляции для каждого исходного файла, изменив свойства в файле проекта. Лично я считаю, что это кошмар обслуживания, но бывают случаи, когда у вас нет выбора.

Изменить: я вижу, что ваши исходные файлы написаны на C #, а не на C ++.

Используя командную строку C #:

to suppress CS0028, you could specify /nowarn:28.

К сожалению, /warnaserror выдает все предупреждения об ошибках.

person egrunin    schedule 30.04.2010
comment
Интересно, что вы, как и (программист Windows) ниже, говорите, что вы можете изменять свойства для каждого исходного файла в свойствах .csproj, я не могу найти, как это достигается. это сделано в текстовом поле «Подавить предупреждения:»? Честно говоря, я очень хочу игнорировать сгенерированный код. - person krystan honour; 30.04.2010
comment
Боюсь, вам придется использовать компилятор командной строки C # (csc.exe). - person egrunin; 30.04.2010
comment
Идея в том, что после того, как вы добавили #pragma warning disable, все готово. Вам просто нужно один раз обновить генератор кода. Есть ли у вас возможность изменить генератор кода? - person Pieter van Ginkel; 18.10.2010

В VS 2010 вы можете щелкнуть правой кнопкой мыши ссылку на службу, выбрать «Настроить ссылку на службу ...» и изменить модификатор доступа с Общедоступного на Внутренний.
Это, конечно, может не подходить для вашего конкретного решения, но предупреждения не применимо к внутренним методам, и вы все равно можете повторно сгенерировать ссылку на службу.

person Seb    schedule 08.05.2012

Для C # вы можете просто разместить

#pragma warning disable 1591

в начале reference.cs файла. Тогда предупреждение об отсутствии документации XML не будет.

Но вы должны делать это каждый раз, когда файл создается повторно (т.е. когда изменяется определение вашей службы). Я не знаю, как повлиять на генерацию кода (я не уверен, используют ли они шаблоны T4 или где они могут быть расположены ...)

person MartinStettner    schedule 30.04.2010
comment
да, это скорее проблема. Это кошмар для техобслуживания, когда приходится делать это каждый раз, опять же, это выглядит полезным, но я бы хотел, чтобы это добавлялось каждый раз, если бы это было возможно. - person krystan honour; 30.04.2010

Пару мыслей.

1) Есть ли у вас автоматически сгенерированный тег в заголовке файла (комментарии вверху файла), например:

// <auto-generated>

// This file is auto-generated...

// </auto-generated>

Этот тег важен (содержимое - нет), поскольку некоторые инструменты пропускают такие файлы (например, StyleCop можно настроить так, чтобы эти файлы игнорировались).

2) Если вы создаете код автоматически, почему бы не создать хотя бы некоторые комментарии XML? Я понимаю, что вы не хотите тратить много времени на документирование кода, который, вероятно, никогда не будет прочитан, но при отладке кода я часто захожу на какой-то автоматически сгенерированный прокси, и даже простой комментарий может быть полезным, даже если там написано просто "автогенерированный код" :)

Изменить

3) Вы также можете подавить предупреждения, добавив прагмы в параметры сборки (щелкните правой кнопкой мыши проект, выберите свойства, выберите вкладку «Сборка»). Это удобнее, чем добавлять в код. Попробуйте добавить 1591;1574;1587 в поле "Подавить предупреждения".

4) Вы можете перейти на вкладку «Анализ кода» в «Свойствах проекта» и снять флажок «Обрабатывать предупреждение как ошибку» для конкретных предупреждений, которые вызывают у вас проблемы.

Очевидно, что это глобальные настройки, они не просто выбирают автоматически сгенерированные файлы.

person Steve    schedule 18.10.2010
comment
Боюсь, это не решает проблему, визуальная студия при создании документации игнорирует тот факт, что эти заголовки существуют. - person krystan honour; 18.10.2010
comment
ОК, добавил в свой список ту или иную мысль :) - person Steve; 18.10.2010
comment
Я не понимаю, почему это привлекло голосование против, мог ли тот, кто проголосовал против, по крайней мере, проявить любезность, чтобы оставить комментарий, в котором говорилось, что было не так с этим ответом? - person Steve; 27.10.2010
comment
Все комментарии здесь полезны, но, к сожалению, не решают проблему. Основная проблема здесь заключается в том, что, похоже, нет способа легко игнорировать предупреждения, поскольку ошибки в автоматически сгенерированном коде, возможно, если бы в VS2010 была возможность установить это как инъекцию пользовательского кода, это решило бы проблему обслуживания. До тех пор, пока это возможно, всегда будет кто-то, кто регенерирует код и забудет прагму, которая затем нарушит сборку, которую я пытался автоматизировать на этом этапе. - person krystan honour; 02.11.2010