"Perlakukan semua peringatan sebagai kesalahan kecuali ..." di Visual Studio

124

Dalam Visual Studio, saya dapat memilih opsi "Perlakukan peringatan sebagai kesalahan" untuk mencegah kode saya dari kompilasi jika ada peringatan. Tim kami menggunakan opsi ini, tetapi ada dua peringatan yang ingin kami simpan sebagai peringatan.

Ada opsi untuk menyembunyikan peringatan, tetapi kami SANGAT ingin mereka muncul sebagai peringatan, jadi itu tidak akan berhasil.

Tampaknya satu-satunya cara untuk mendapatkan perilaku yang kita inginkan adalah dengan memasukkan daftar setiap nomor peringatan C # ke dalam kotak teks "Peringatan spesifik", kecuali dua yang kita ingin diperlakukan sebagai peringatan.

Selain sakit kepala pemeliharaan, kerugian terbesar dari pendekatan ini adalah bahwa beberapa peringatan tidak memiliki angka, sehingga tidak dapat dirujuk secara eksplisit. Misalnya, "Tidak dapat menyelesaikan referensi ini. Tidak dapat menemukan perakitan 'Data ....'"

Adakah yang tahu cara yang lebih baik untuk melakukan ini?


Memperjelas bagi mereka yang tidak langsung melihat mengapa ini berguna. Pikirkan tentang cara kerja sebagian besar peringatan. Mereka memberi tahu Anda ada sesuatu yang salah dalam kode yang baru saja Anda tulis. Butuh sekitar 10 detik untuk memperbaikinya, dan itu membuat basis kode lebih bersih.

Peringatan "Usang" sangat berbeda dari ini. Terkadang memperbaikinya berarti hanya menggunakan tanda tangan metode baru. Tetapi jika seluruh kelas kedaluwarsa, dan Anda menggunakannya tersebar melalui ratusan ribu baris kode, perlu waktu berminggu-minggu atau lebih untuk memperbaikinya. Anda tidak ingin build tersebut rusak selama itu, tetapi Anda pasti ingin melihat peringatan tentang hal itu. Ini bukan hanya kasus hipotetis - ini telah terjadi pada kami.

Peringatan literal "#warning" juga unik. Saya sering ingin check-in, tetapi saya tidak ingin merusak build.

Neil
sumber
Bisakah Anda memasukkan spasi ke dalam daftar besar nomor Anda? Itu telah mengisi pembungkus garis.
Ray
Aduh, aku benci aturan rumit yang dibuat oleh orang-orang, seringkali untuk menenangkan ego seseorang.
Jon Limjap
21
Saya mengerti maksudnya tentang peringatan usang, ini tidak sembarangan.
Ed S.
Dalam pengalaman saya, mengizinkan bahkan satu peringatan dalam build Anda seperti menambahkan async / await pertama. Sebentar lagi akan ada puluhan. Dalam semua pengaturan, saya ingat seorang pengembang dapat melihat kurang dari 10 peringatan di jendela Daftar Kesalahan di VS. Saya dapat bertaruh bahwa begitu Anda memiliki lebih dari 5 peringatan, sebagian besar pengembang dalam sebuah tim tidak akan dapat menemukan yang baru - dalam pengaturan Anda, itu berarti bahwa mereka tidak akan melihat peringatan bahwa metode tersebut sudah usang yang menentang tujuan keseluruhan dari peringatan :) Apa pengalaman Anda dengan Neil ini?
tymtam
@mayu, ini teka-teki. Berkali-kali, saya telah melihat peringatan diabaikan untuk waktu yang lama. Tapi pada akhirnya, apakah Anda menunjukkan peringatan atau Anda tidak menunjukkan apa-apa. Jika Anda menunjukkan peringatan, setidaknya ada kemungkinan seseorang mempelajari sesuatu yang berguna darinya. Jika Anda memperlakukan sebagian besar peringatan sebagai kesalahan, maka beberapa yang tersisa bisa mendapatkan lebih banyak perhatian.
Neil

Jawaban:

155

Anda dapat menambahkan WarningsNotAsErrors-tag di file proyek.

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

Catatan: 612dan 618keduanya merupakan peringatan tentang Usang, tidak tahu perbedaannya tetapi proyek yang saya kerjakan melaporkan Usang dengan peringatan 618.

SvenL
sumber
24
Perbedaan antara 612 dan 618 adalah komentar dari ObsoleteAttribute. Sebuah ObsoleteAttribute without comment menghasilkan kesalahan 612, dan kesalahan dengan komentar menghasilkan 618.
Marco Spatz
@Marcu_Agung. Kemudian kita dapat memperlakukan [Obsolete]anggota yang messageberada nullsebagai kesalahan, sementara kita membiarkan anggota messageyang disetel tetap menjadi peringatan saja. Jika errorparameter disetel ke truedalam ObsoleteAttribute, CS0619 akan dibuat. Ini sepertinya tidak berhasil jika messageada null(tapi siapa yang akan melakukannya [Obsolete(null, true)]?).
Jeppe Stig Nielsen
Untuk F #, gunakan --warnaserror-:618,1030pada Build-> Other flags field. Opsi proyek ini belum diterapkan untuk proyek F #. github.com/Microsoft/visualfsharp/issues/3395
Asik
2
Sebaiknya Anda tahu "WarningsNotAsErrors" ada. Ini harus tersedia dalam pengaturan proyek tanpa harus mengedit file secara manual. Terima kasih.
AFrak
1
Microsoft benar-benar mengacaukan ini (dan 11 tahun kemudian, belum memperbaiki semuanya!). Pengaturan proyek berubah <NoWarn>, yang lebih rendah dalam banyak kasus dan gagal dimasukkan ke <WarningsNotAsErrors>dalam UI. Pujian.
pengguna2864740
13

/ warnaserror / warnaserror-: 618


sumber
1
Terima kasih atas masukannya. Meskipun mereka tidak menyelesaikan masalah IDE, ini adalah komentar yang paling berguna sejauh ini.
Neil
2
Di mana Anda menambahkan ini?
checho
@checho, sakelar tersebut akan ditambahkan pada baris perintah saat memanggil msbuild. Untuk tujuan kami, jawaban teratas lebih membantu, karena kami dapat memanggangnya ke dalam proyek daripada harus mengubah cara kami memanggil msbuild.
Neil
Tidak bekerja dengan MSBuild 15.9.21 + g9802d43bc3:MSBUILD : error MSB1001: Unknown switch. Switch: /warnaserror-:618
Paul
3

atau lebih khusus lagi, dalam kasus Anda:

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

ini harus memperlakukan semua peringatan sebagai kesalahan kecuali yang ada dalam daftar yang dipisahkan koma


sumber
1

Mengapa Anda ingin terus melihat peringatan yang tidak Anda perlakukan sebagai kesalahan? Saya bingung mengapa ini diinginkan - Anda memperbaikinya atau tidak.

Apakah dua file build / solusi yang berbeda berfungsi - atau skrip untuk menyalin satu dan kemudian memodifikasi tingkat peringatan / peringatan agar sesuai. Tampaknya mungkin Anda ingin beberapa eksekusi kompilator bertele-tele, tetapi yang lain Anda ingin terus berjalan.

Jadi switch kompilator yang berbeda sepertinya cara yang baik untuk digunakan. Anda dapat melakukan ini dengan target yang berbeda - satu berlabel debug atau rilis dan yang lain diberi label yang sesuai tentang peringatan.

Tim
sumber
7
Kebanyakan peringatan terjadi karena kebingungan sederhana dalam kode saya (misalnya, saya mendeklarasikan variabel yang tidak saya gunakan). Peringatan kedaluwarsa sering terjadi karena adanya perubahan pada kode orang lain. Memperbaiki ini bisa memakan waktu berminggu-minggu pengembangan. #warning adalah peringatan yang saya inginkan dalam kode (kemungkinan perbaikan jangka panjang).
Neil
4
Dengan kata lain, ada peringatan bahwa saya tidak ingin merusak bangunan saya. Jika #warning merusak build, maka saya tidak akan pernah bisa memeriksanya. Jika Obsolete merusak build, tim lain yang kami andalkan dapat tanpa sadar merusak build tim kami hanya dengan menambahkan atribut usang.
Neil
@Neil Saya setuju dengan beberapa argumen Anda, tetapi menghapus var yang tidak Anda gunakan tidak memakan banyak waktu DAN Anda pasti ingin tahu bahwa tim lain membuat sesuatu menjadi usang.
tymtam
@mayu, terima kasih atas komentar Anda. Saya setuju tentang var yang tidak Anda gunakan. Itulah mengapa saya meminta kompilator memperlakukannya sebagai kesalahan. Saya juga setuju Anda ingin tahu jika ada sesuatu yang usang. Tapi jika butuh waktu lama untuk refactor sesuatu yang usang dari kode Anda, pilihan Anda adalah 1) Perlakukan peringatan ini sebagai peringatan 2) Biarkan build Anda tetap rusak untuk waktu yang lama 3) Beberapa solusi lain seperti mematikan peringatan sebagai kesalahan. Dengan sebagian besar peringatan sebagai kesalahan, daftar peringatan Anda kemungkinan besar akan tetap pendek, jadi Anda lebih cenderung memperhatikan ketika mereka benar-benar muncul. Apa solusi pilihan Anda?
Neil
1
@mayu, tim lain (baik dalam perusahaan yang sama atau di luar) mungkin secara sah ingin mengkomunikasikan bahwa kelas, metode, komponen lain sedang dihapuskan secara bertahap selama beberapa periode waktu. Menambahkan atribut adalah cara yang baik untuk memberi sinyal ini kepada konsumen perpustakaan. Saya tidak menganggapnya merepotkan untuk melakukan ini. Faktanya, menambahkan atribut sedini mungkin adalah cara yang baik untuk memastikan orang lain mengetahui perubahan di masa mendatang.
Neil
1

Saya menggunakan peringatan perlakukan sebagai kesalahan.

Dalam kasus yang jarang terjadi, ketika beberapa peringatan yang dapat diterima muncul (yaitu merujuk anggota usang, atau dokumentasi yang hilang pada kelas serialisasi XML), maka itu harus secara eksplisit disembunyikan dengan #pragma disable (dan alasan opsional untuk tidak memiliki kode bersih dapat diberikan sebagai komentar).

Kehadiran direktif ini juga memungkinkan untuk mengetahui, siapa yang menerima pelanggaran peringatan ini (dengan tindakan "menyalahkan" kontrol versi) jika ada beberapa pertanyaan.

Rinat Abdullin
sumber
3
Saya juga menggunakan ini, meskipun tidak menyelesaikan masalah yang disebutkan dalam deskripsi saya. Saya ingin peringatan tertentu diperlakukan sebagai peringatan, bukan disembunyikan.
Neil
0

Mengapa tidak memiliki aturan yang mengatakan "Siapa pun yang memeriksa kode dengan peringatan apa pun di dalamnya selain 612, 1030, 1701 atau 1702 di dalamnya harus pergi ke papan tulis dan menulis ratusan kali 'Saya tidak akan memeriksa kode dengan peringatan yang tidak diizinkan lagi. '"

erikkallen
sumber
9
Semoga berhasil memberlakukan itu ... Memperlakukan peringatan sebagai kesalahan adalah langkah yang sangat penting untuk meningkatkan kualitas kode secara keseluruhan dan ini akan memaksa pengembang untuk benar-benar memperbaiki kode mereka! Semua otomatisasi hujan es, tenaga kerja manual begitu abad ke-20: ish!
Andreas Magnusson
@AndreasMagnusson Jika hanya kurangnya peringatan yang benar-benar memastikan kualitas kode ..
pengguna2864740
2
@ user2864740: Setuju, tidak ada peluru perak. Tapi itu adalah kesalahan yang terlalu umum untuk menolak sesuatu yang berguna dengan premis bahwa itu bukan peluru perak.
Andreas Magnusson
-4

Menurut saya akar masalah sebenarnya adalah kombinasi dari Anda memperlakukan peringatan sebagai kesalahan, padahal jelas tidak, dan kebijakan Anda yang jelas tentang mengizinkan check-in yang melanggar ini. Seperti yang Anda katakan, Anda ingin tetap dapat bekerja meskipun ada peringatan. Anda hanya menyebutkan beberapa peringatan yang ingin Anda abaikan, tetapi bagaimana jika orang lain dalam tim menyebabkan jenis peringatan lain, yang akan membutuhkan waktu lama untuk memperbaikinya? Tidakkah Anda ingin bisa mengabaikannya juga?

Solusi logisnya adalah dengan 1) Larang check in jika kode tidak dapat dikompilasi (yang berarti mereka yang membuat peringatan harus memperbaikinya, karena pada dasarnya, mereka merusak build), atau 2) memperlakukan peringatan sebagai peringatan. Buat dua konfigurasi build, satu yang memperlakukan peringatan sebagai kesalahan, yang dapat dijalankan secara teratur untuk memastikan bahwa kode bebas peringatan, dan yang lainnya, yang hanya memperlakukannya sebagai peringatan, dan memungkinkan Anda untuk bekerja bahkan jika orang lain memperkenalkan peringatan.

jalf
sumber
1
Menggunakan jawaban yang dipilih, mudah untuk menambahkan ke daftar peringatan yang diperlakukan sebagai peringatan. Itu bekerja jauh lebih baik daripada solusi yang Anda usulkan. Peringatan jelas bukan kesalahan, tetapi memperlakukan sebagian besar peringatan sebagai kesalahan berarti kode tidak akan pernah diperiksa dengan peringatan tersebut.
Neil