Как отключить предупреждения компилятора только в сгенерированном коде без редактирования файла(ов)

У меня есть сгенерированный код с кучей предупреждений компилятора. Я хочу отключить их в сгенерированном файле, но сохранить эти предупреждения в остальной части проекта, чтобы их можно было исправить. Я использую Visual Studio 2019 Community Edition со сгенерированными файлами из Entity Framework и других пакетов NuGet.

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

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

Рассматриваемый файл является Reference.cs для подключенной службы. Он имеет пространство имен Proxy.ProvisioningService, и этот файл содержит пару десятков классов. У меня также есть несколько файлов миграции Entity Framework, которые имеют ту же проблему в совершенно другом решении.

У меня есть файл GlobalSuppressions.cs, в который я хотел бы добавить CS1591 (конкретно), но моя текущая запись не работает. Другие записи работают для других предупреждений, и я пробовал варианты приведенного ниже кода для работы, в том числе пытался сопоставить формат других записей, но пока ничего не работает. Я изменил Build из Compile, удалил MessageId, изменил Scope на модуль, сборку и пространство имен и потомков, и я попробовал пару разных способов установить Target.

[assembly: SuppressMessage("Build", "CS1591:Missing XML comment for publicly visible type or member", Justification = "Generated code", MessageId = "CS1591", Scope = "namespaceanddescendants", Target = "Proxy.ProvisioningService")]

В одной из внешних ссылок предлагается щелкнуть правой кнопкой мыши ошибку, перейти к Suppress -> In Suppression File, но этого варианта нет в списке. Это намек на то, что я не могу сделать это в файле GlobalSuppressions.cs?

Я пытался сделать так, чтобы Visual Studio 2019 Community Edition автоматически подавляла предупреждение с помощью пункта меню Analyze -> Build And Suppress Active Issues -> For Project, но это просто добавило в файл кучу директив #pragma, которые нужно было бы заменить, если файл был восстановлен, что я и хочу избегать.

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

Я также не хочу помещать его в раздел Project -> Properties -> Build -> Suppress Warnings, так как я хочу, чтобы написанный от руки код по-прежнему выдавал эти предупреждения.

В другом ответе SE/SO предлагается использовать атрибут GeneratedCodeAttribute, чтобы предотвратить появление предупреждений о сгенерированных файлах. К сожалению, в моем файле уже есть это, и он все еще выдает предупреждения.

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

Чтобы подавить предупреждения для сгенерированного кода в проекте

  1. Щелкните проект правой кнопкой мыши в обозревателе решений и выберите пункт Свойства.

  2. Выберите вкладку Анализ кода.

  3. Установите флажок Подавить результаты из сгенерированного кода.

К сожалению, этот параметр уже выбран и не подавляет предупреждение CS1591.

Итак, мой актуальный вопрос:

Как я могу подавить предупреждения, в частности CS1591, из сгенерированных файлов кода, не редактируя их и не подавляя предупреждение во всем проекте?


person computercarguy    schedule 25.02.2021    source источник
comment
Вы могли бы написать свой собственный анализатор?   -  person zaggler    schedule 25.02.2021
comment
Но... у вас есть ответ, который работает, но он вам явно не нравится... что заключается в добавлении #pragma в сценарий. В любом случае это сгенерированный код, поэтому я не понимаю, почему вы считаете, что это взлом. Может, стоит просто начать нравиться такой подход? Я имею в виду, твой босс занимается твоим делом. Он спросит, исправили ли вы это с помощью хака?   -  person davidbak    schedule 25.02.2021
comment
@davidbak, нет, я уже сказал, почему это не так. Если эти файлы регенерируются, #pragma исчезает, так что это не настоящее решение.   -  person computercarguy    schedule 25.02.2021
comment
Я думал, ты сказал сценарий. Например, часть процесса сборки. Вставьте его в свой make-файл.   -  person davidbak    schedule 25.02.2021
comment
Если эти файлы регенерируются, #pragma исчезает, так что это не настоящее решение — это реальное решение, если вы исправите генератор кода так, чтобы он включал #pragma как часть генерации, как было предложено.   -  person Peter Duniho    schedule 25.02.2021
comment
@PeterDuniho, если я избавлюсь от своего исследования, люди скажут, что я не проводил исследования, как и комментатор в другом вопросе.   -  person computercarguy    schedule 25.02.2021
comment
@davidbak, у вас есть объяснение, как поместить это в мой make-файл? Ссылка на статью или что? Я никогда этого не делал.   -  person computercarguy    schedule 25.02.2021
comment
Во-первых, люди будут говорить самые разные вещи. Ну и что? Во-вторых, как я уже объяснял, вы можете адекватно поделиться результатами своего исследования, не сообщая нам всех кровавых подробностей о каждой ссылке, которую вы посетили. Честно говоря, вы просто делаете те же ошибки, что и раньше.   -  person Peter Duniho    schedule 25.02.2021
comment
См. github.com/dotnet/roslyn/issues/12702, может быть полезно...   -  person zaggler    schedule 25.02.2021
comment
Если вы используете make (или любой другой вариант), вам нужен поисковый запрос по цепочке правил makefile.   -  person davidbak    schedule 25.02.2021
comment
Это является релевантным ответом на SO, который я получил с помощью правил цепочки makefile, но у google/duckduckgo/etc есть больше в другом месте...   -  person davidbak    schedule 25.02.2021
comment
@davidbak, я не думаю, что make-файлы - это то, как я хочу это сделать. Я использую Visual Studio в бизнес-среде с другими разработчиками и не хочу полностью менять процесс сборки для одного решения только для того, чтобы избавиться от некоторых предупреждений. stackoverflow.com/questions/314553 /   -  person computercarguy    schedule 25.02.2021
comment
Что ж, черт возьми, важно знать, что вы используете проекты/решения Visual Studio вместо make-файлов, а? Жаль, что это не в вашем вопросе. Но в любом случае Visual Studio при сборке C# имеет средство Custom Tool. По-видимому, это не так просто, как добавить шаг сборки в make-файл, но это можно сделать. Я быстро нашел статью о codeproject, в которой это объяснялось (а также собственные документы Microsoft). Если вы узнаете об общей идее создания файлов с помощью промежуточных шагов, вы узнаете условия поиска, которые помогут вам найти, как это сделать в вашем случае. Или вы можете задать вопрос!   -  person davidbak    schedule 25.02.2021
comment
Рассмотрите это, но я уверен, вы можете добиться большего...   -  person davidbak    schedule 25.02.2021
comment
@davidbak, я несколько раз упоминал Visual Studio в своем вопросе, и это тег.   -  person computercarguy    schedule 25.02.2021
comment
Многие люди используют Visual Studio с make-файлами или другими системами сборки. Что бы ни. Я считаю, что хороший способ продолжить - создать файл, который вы хотите, из (сгенерированного) файла, который у вас есть. Теперь вы можете изучить это сейчас, когда я передал вам эту идею.   -  person davidbak    schedule 25.02.2021
comment
@PeterDuniho, я удалил ссылки, но я не знаю, как я могу сделать объяснения того, почему они не работали, более краткими, добавляя информацию, которую вы считаете отсутствующей, которую вы не видели, чего не хватает, пока также говоря, что вы не читали весь вопрос. И я использовал другого человека в качестве примера того, как использование вашего совета все равно принесет мне DV. Вы говорите много общих вещей, не предоставляя никакой конкретной информации.   -  person computercarguy    schedule 25.02.2021
comment
@PeterDuniho, также, как мне исправить генератор кода, чтобы он включал #pragma как часть генерации, когда генератор кода является частью структуры EF? Не означает ли это, что мне придется переписать часть пакета NuGet, а затем я не смогу обновить его при необходимости?   -  person computercarguy    schedule 25.02.2021
comment
@Codexer, к сожалению, в этой ветке форума рассматриваются те же вещи, которые я пробовал, но они не сработали, а у других людей была такая же проблема, которая не работала в течение 4 лет, когда люди оставляли комментарии. По крайней мере, я знаю, что я не единственный с этой проблемой.   -  person computercarguy    schedule 25.02.2021
comment
[SuppressMessage] работает только для предупреждений анализа кода, CS1591 — нет, это предупреждение компилятора. Для этого требуется более умная генерация кода, либо #pragma, либо исправление плохого комментария документа. Поскольку это очевидно, но не рассматривается, вероятным результатом является глобальное подавление. Ограничьте его влияние, изолировав автоматически сгенерированный код в собственной сборке.   -  person Hans Passant    schedule 26.02.2021
comment
@HansPassant, я работал над решениями, которые имеют много разных проектов даже по незначительным причинам, поэтому я не решаюсь отделить часть проекта по этой причине, но это может быть единственный/лучший/предсказуемый способ сделать это, поскольку нет другой вариант кажется полезным. Я по-прежнему не хочу добавлять #pragma в файлы генерации кода из-за того, что файлы, возможно, регенерируются и приходится переделывать работу.   -  person computercarguy    schedule 26.02.2021
comment
1) Я думаю, что вы могли бы пройти всю карьеру, не видя Makefile только в проектах Windows VS (особенно .NET), некоторые отрасли определенно не используют их для .NET. 2) Возможное решение проблемы стены текста состоит в том, чтобы просто связать исследование со списком коротких ссылок в академическом стиле, например [0](link][1](link)[2](link), но это трудно сказать. 3) Я не думаю, что есть что-то неправильное в вопросе о том, в какой форме я нашел этот метод для решения своей проблемы, но он мне не нравится, честно говоря, именно так выглядит исследовательская работа.   -  person jrh    schedule 02.03.2021
comment
С учетом сказанного... сгенерированный код приближается к той территории, где Makefile имеет смысл. Я могу сочувствовать раздражению генераторов кода, которые выдают код, вызывающий неприятные предупреждения (у меня была похожая проблема в C++). На самом деле не было другого решения, кроме как подавить предупреждение для всего файла или проекта (и я отредактировал сценарий CMake именно для этого).   -  person jrh    schedule 02.03.2021
comment
Вы попали в неприятную ситуацию, когда у вас есть неясный, неинтересный вопрос, который является естественной добычей Roomba. Непонятный, потому что по какой-то причине у него явно низкий уровень SEO, некрутой, потому что проблема, которую он решает, является приземленной (подавление неприятных предупреждений в плохо разработанном стороннем коде). Реальный ответ, вероятно, заключается в том, что автор генератора кода исправляет свою ошибку, и читатели могут подумать, что эта проблема исчезнет после обновления генератора кода. Не круто обходить чью-то ошибку, не так круто, как модная новая языковая функция.   -  person jrh    schedule 02.03.2021
comment
С учетом сказанного, я не говорю, что 1) имеет смысл обратиться к автору генератора с просьбой исправить это, 2) вам не следует пытаться обойти это или что хаки не стоит обсуждать, 3) вы не должны позаботьтесь о предупреждениях и постарайтесь избавиться от них, 4) некрутые или неясные вопросы — это плохо, или 5) то, что здесь произошло, — это хорошо, я просто рассказываю вам, как оно есть, ТАК основано на голосовании и нравится вам это или нет популярность является фактором успеха вопроса. Иногда получение ответов на некоторые вопросы здесь — просто пустая трата времени, и исследовательские усилия сами по себе не могут решить вопрос.   -  person jrh    schedule 02.03.2021


Ответы (1)


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

Я думаю, что вы можете легко сделать это с помощью задачи MSBuild, добавив что-то вроде этого в свой файл .csproj:

<Target Name="DisableWarnings" BeforeTargets="CoreCompile">
    <ItemGroup>
        <AutoGeneratedFiles Include="**/*.Designer.cs" />
    </ItemGroup>
    <WriteLinesToFile File="%(AutoGeneratedFiles.FullPath)"
        Condition="!$([System.IO.File]::ReadAllText(%(AutoGeneratedFiles.FullPath)).StartsWith(&quot;#pragma warning&quot;))"
        Lines="$([System.String]::Concat(&quot;#pragma warning disable 1591&quot;,$([System.IO.File]::ReadAllText(%(AutoGeneratedFiles.FullPath))),&quot;#pragma warning restore 1591&quot;))"
        Overwrite="true"
        Encoding="Unicode" />
</Target>

person J.Loscos    schedule 16.03.2021
comment
Я добавил это в свой файл csproj, но получаю сообщение об ошибке. Я использую .Net Core 3.1, если это имеет значение. Ошибка MSB4186 Неверный синтаксис вызова статического метода: [System.IO.File]::ReadAllText().StartsWith(предупреждение #pragma). Метод «System.IO.File.ReadAllText» не найден. Вызов статического метода должен иметь вид: $([FullTypeName]::Method()), например $([System.IO.Path]::Combine(a, b)). Убедитесь, что все параметры определены, имеют правильный тип и указаны в правильном порядке. - person computercarguy; 16.03.2021
comment
Я думаю, у вас есть эта ошибка, потому что не удалось найти файлы AutoGeneratedFiles. В примере я поставил *.Designer.cs для соответствия файлам, сгенерированным resx, но вы должны изменить его, чтобы он соответствовал сгенерированным файлам вашего проекта. - person J.Loscos; 16.03.2021
comment
В порядке. Похоже, что в другом проекте, в котором определенно есть файлы .designer.cs, нет никаких ошибок, но, к сожалению, это не те файлы, которые выдают предупреждение. Они находятся в файле .cs для Entity. Я поиграю с этим, чтобы увидеть, смогу ли я заставить это работать. Пример: 20210122181917_Initial.cs Я думаю, мне придется искать эти символы подчеркивания, поскольку я не думаю, что они есть в каких-либо других файлах, кроме файлов, созданных Entity. - person computercarguy; 16.03.2021
comment
Я заработал, добавив второй AutoGeneratedFiles для включения */_*.cs и первый параметр Concat для #pragma warning disable 1591 // auto-generated / . Это дает мне тег auto-generated, который предотвращает другие предупреждения, а также предотвращает игнорирование using и namespace, как в конце оператора pragma. Если вы обновите или позволите мне обновить свой ответ, вы получите награду, если кто-то (каким-то образом) не предложит лучший ответ. Я все еще считаю это немного хакерским, но это намного лучше, чем ничего. Спасибо вам за помощь! - person computercarguy; 16.03.2021
comment
Я считаю это хакерским, потому что мне придется добавлять его в каждый файл .csproj, для которого он мне нужен, и мне не нравится редактировать эти файлы вручную. Но то, что мне это не нравится, не означает, что это невозможно сделать или что это не работает. - person computercarguy; 16.03.2021