Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: krystan honourОтветов: 5

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

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

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

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

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

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

visual-studiovisual-studio-2010msbuild

Ответы

Ответ 1 · рейтинг 4 · Mike Parkhill

Я написал сценарий 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.'

Ответ 2 · рейтинг 6 · egrunin

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

// 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 выдает все предупреждения об ошибках.

Ответ 3 · рейтинг 2 · Seb

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

Ответ 4 · рейтинг 1 · MartinStettner

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

#pragma warning disable 1591

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

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

Ответ 5 · Steve

Пару мыслей.

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

// <auto-generated>

// This file is auto-generated...

// </auto-generated>

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

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

Изменить

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы