"Трактуйте всі попередження як помилки, за винятком ..." у Visual Studio


124

У Visual Studio я можу вибрати параметр «Трактувати попередження як помилки», щоб запобігти складанню мого коду, якщо є попередження. Наша команда використовує цей варіант, але є два попередження, які ми хотіли б зберегти як попередження.

Існує можливість придушити попередження, але ми хочемо, щоб вони відображалися як попередження, так що це не спрацює.

Схоже, єдиний спосіб отримати поведінку, яку ми хочемо, - це ввести список кожного номера C # попередження у текстове поле "Конкретні попередження", за винятком двох, яких ми хочемо розглядати як попередження.

Окрім головного болю на технічному обслуговуванні, найбільшим недоліком такого підходу є те, що кілька попереджень не мають цифр, тому на них не можна посилатися прямо. Наприклад, "Не вдалося вирішити цю посилання. Не вдалося знайти збірку" Дані .... "

Хтось знає про кращий спосіб зробити це?


Уточнення для тих, хто не відразу бачить, чому це корисно. Подумайте, як працює більшість попереджень. Вони говорять вам, що в коді, який ви тільки що написали, щось мало. Щоб їх виправити, потрібно близько 10 секунд, і це дозволяє зберегти чистішу базу коду.

Попередження "Застаріле" сильно відрізняється від цього. Іноді виправити це означає просто використовувати новий підпис методу. Але якщо весь клас застарілий, і ви користуєтеся ним, розкиданим по сотнях тисяч рядків коду, це може зайняти кілька тижнів і більше. Ви не хочете, щоб збірка була зламана так довго, але ви точно не хочете бачити попередження про це. Це не просто гіпотетичний випадок - це сталося з нами.

Буквальні "#warning" попередження також унікальні. Я часто хочу це перевірити, але не хочу зламати збірку.


Чи можете ви, будь ласка, помістити пробіли у свій великий список номерів? Це набило обертання ліній.
Промінь

Гауд Я ненавиджу складні правила, які складаються людьми, часто, щоб заспокоїти якесь певне особистісне его.
Джон Лім’яп

21
Я бачу його думку про застаріле попередження, це не довільно.
Ред С.

На мій досвід, дозволяючи навіть одне попередження у вашій збірці, це як додавання першого асинхроніка / очікування. Незабаром їх буде десятки. У всіх налаштуваннях я пам'ятаю, що розробник може бачити менше 10 попереджень у вікні списку помилок у VS. Я можу покластися на те, що, як тільки у вас є більше 5 попереджень, переважна більшість розробників в команді не зможуть помітити нове - у вас налаштування означає, що вони не помітять попередження про те, що метод застарілий, що не відповідає вся мета цього попередження :) Який ваш досвід роботи з цим Нілом?
tymtam

@mayu, це загадка. Багато разів я бачив попередження, які довго ігноруються. Зрештою, або ви показуєте попередження, або взагалі нічого не показуєте. Якщо ви показуєте попередження, принаймні є ймовірність, що хтось дізнається з нього щось корисне. Якщо ви ставитесь до більшості попереджень як до помилок, то ті, що залишилися, можуть отримати більше уваги.
Ніл

Відповіді:


155

Ви можете додати WarningsNotAsErrors-tag у файл проекту.

<PropertyGroup>
    ...
    ...
    <WarningsNotAsErrors>618,1030,1701,1702</WarningsNotAsErrors>
</PropertyGroup>

Примітка. 612І 618обидва попередження про застаріле, різниці не знаю, але проект, над яким я працюю, повідомляє про застаріле попередження 618.


24
Різниця між 612 та 618 - коментар ObsoleteAttribute. Застарілерозподілення без коментарів генерує помилку 612, а одне з коментарем генерує 618.
Marco Spatz

@MarcoSpatz Саме так. Тоді ми можемо ставитися до [Obsolete]членів, де messageце nullяк помилки, тоді як ми дозволяємо тим, де messageвстановлено значення, залишаються лише попередженнями. Якщо errorпараметр встановлено trueв ObsoleteAttribute, замість цього створюється CS0619. Це, здається, не працює, якщо messageє null(але хто б [Obsolete(null, true)]все-таки зробив це ?).
Jeppe Stig Nielsen

Для F # використовуйте --warnaserror-:618,1030в полі Build-> Other flags. Цей варіант проекту ще не реалізований для F # проектів. github.com/Microsoft/visualfsharp/isissue/3395
Asik

2
Добре знати, що "WarningsNotAsErrors" існує. Він повинен бути доступний в налаштуваннях проекту, не редагуючи файл вручну. Дякую.
AFract

1
Майкрософт дійсно накрутив це (і через 11 років не виправив справи!). Налаштування проекту змінюються <NoWarn>, що в більшості випадків поступається і не вдалося застосувати <WarningsNotAsErrors>інтерфейс користувача. Кудос.
користувач2864740

13

/ warnaserror / warnaserror-: 618


1
Дякую за ваш внесок Хоча вони і не вирішують проблему IDE, це найбільш корисні коментарі до цих пір.
Ніл

2
Куди ви додаєте це?
чечо

@checho, ці комутатори будуть додані в командний рядок при виклику msbuild. Для наших цілей корисніша відповідь є більш корисною, оскільки ми можемо використати її в проекті замість того, щоб змінювати спосіб, який ми називаємо msbuild.
Ніл

Не працює з MSBuild 15.9.21 + g9802d43bc3: MSBUILD : error MSB1001: Unknown switch. Switch: /warnaserror-:618
Пол Б.

3

або конкретніше, у вашому випадку:

/ warnaserror / warnaserror-: 612,1030,1701,1702

це має сприймати всі попередження як помилки, за винятком тих, що у вашому списку, розділених комами


1

Чому ви хочете бачити попередження, які ви не трактуєте як помилки? Мене бентежить питання, чому це бажано - або ви виправляєте їх, або не робите.

Чи працюватимуть два різні файли збірки / рішення - або сценарій, який копіює один, а потім змінює рівень попереджень / попереджень. Здається, що, можливо, ви хочете, щоб деякі виконання компілятора були зірвані, але інші ви хочете продовжувати.

Так що різні компілятори компілятора здаються хорошим способом. Ви можете зробити це з різними цілями - одна позначена налагодженням або випуском, а інші позначені належним чином про попередження.


7
Більшість попереджень трапляються через просту плутанину в моєму коді (наприклад, я оголосив змінну, яку не використовую). Застаріле попередження часто трапляється через зміну чужого коду. Виправлення цього може зайняти кілька тижнів розвитку. #warning - це попередження, яке я хочу в коді (ймовірно, довгострокове виправлення).
Ніл

4
Іншими словами, є попередження про те, що я не хочу порушувати свою збірку. Якщо #warning порушує збірку, то я ніколи не можу перевірити. Якщо застарілий порушує збірку, то інша команда, від якої ми залежимо, може несвідомо зламати збірку нашої команди лише додавши застарілий атрибут.
Ніл

@Neil Я погоджуюся з деякими вашими аргументами, але видалення вар, який ви не використовуєте, не потребує багато часу, і ви обов'язково хочете знати, що інша команда зробила щось застаріле.
tymtam

@mayu, дякую за ваш коментар Я згоден щодо вару, яким ви не користуєтесь. Ось чому я б змусив компілятор трактувати це як помилку. Я також погоджуюся, що ви хочете знати, коли щось застаріло. Але якщо для відновлення чогось застарілого нашого коду потрібно недовго, але ваш вибір 1) Трактуйте це попередження як попередження 2) Нехай ваша збірка залишається зламаною на тривалий час 3) Деякі інші рішення, як відключення попереджень як помилок. Якщо більшість попереджень як помилок, ваш список попереджень, ймовірно, залишиться коротким, тому ви, швидше за все, помітите, коли вони з’являться. Яке вподобане рішення?
Ніл

1
@mayu, інша команда (чи то в межах однієї компанії, так і поза нею) може законно захотіти повідомити, що клас, метод, інший компонент припиняється протягом певного періоду часу. Додавання атрибуту - хороший спосіб повідомити про це споживачам бібліотеки. Я не вважаю це клопітним зробити це. Насправді, додати атрибут якомога раніше - це хороший спосіб переконатися, що інші знають про майбутні зміни.
Ніл

1

Я використовую попередження як помилки.

У рідкісних випадках, коли з’являється якесь прийнятне попередження (наприклад, посилання застарілого члена або відсутня документація про класи серіалізації XML), воно повинно бути явно придушено з відключенням #pragma (і необов'язково, причину відсутності чистого коду можна надати як коментар разом).

Наявність цієї директиви також дозволяє з'ясувати, хто прийняв це попередження за порушення (шляхом дії "звинувачення" контролю версій) у випадку виникнення питань.


3
Я також використовую це, хоча це не вирішує проблем, згаданих у моєму описі. Я хочу, щоб певні застереження трактувались як попередження, а не приховані.
Ніл

0

Чому б просто не було правила, що говорить: "Хто перевіряє код з будь-яким попередженням, що знаходиться всередині нього, крім 612, 1030, 1701 або 1702 в ньому, повинен зайти на дошку і написати сто разів", я не перевірятиму код із забороненими попередженнями знову. '"


9
Успіх у дотриманні цього ... Поводження з попередженнями як помилками є дуже важливим кроком для підвищення загальної якості коду, і це змусить розробників фактично виправити свій код! Вся автоматизація градів, ручна праця настільки 20-го століття: іш!
Андреас Магнуссон

@AndreasMagnusson Якщо лише відсутність попереджень насправді забезпечила якість коду ..
user2864740

2
@ user2864740: Погоджено, срібних куль немає. Але все це занадто поширена помилка, щоб відкинути щось корисне за умови, що це не срібна куля.
Андреас Магнуссон


-4

Мені здається, корінна проблема - це комбінація вашого трактування попереджень як помилок, коли їх явно немає, і вашої очевидної політики щодо дозволу на реєстрацію, що порушує це. Як ви кажете, ви хочете мати можливість продовжувати роботу, незважаючи на попередження. Ви згадали лише кілька попереджень, які ви хочете ігнорувати, але що робити, якщо хтось із команди викликав будь-який інший тип попередження, який би зайняв у вас однаково багато часу для виправлення? Чи не хочете ви також можете ігнорувати це?

Логічним рішенням буде або 1) заборонити перевірку, якщо код не компілюється (це означає, що ті, хто створив попередження, повинні їх виправити, оскільки вони фактично порушили збірку), або 2) трактувати попередження як попередження. Створіть дві конфігурації побудови, одна, яка розглядає попередження як помилки, які можна регулярно запускати, щоб забезпечити без попередження код, та інша, яка розглядає їх лише як попередження та дозволяє працювати, навіть якщо хтось інший ввів попередження.


1
Використовуючи обрану відповідь, легко додати до списку попереджень, які трактуються як попередження. Це працює набагато краще, ніж будь-яке із запропонованих вами рішень. Очевидно, що попередження не є помилками, але трактування більшості попереджень як помилок означає, що код ніколи не перевірятиметься цими попередженнями.
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.