Visual Studio'da "... dışındaki tüm uyarıları hata olarak değerlendir"


124

Visual Studio'da, herhangi bir uyarı varsa kodumun derlenmesini önlemek için "Uyarıları hata olarak değerlendir" seçeneğini belirleyebilirim. Ekibimiz bu seçeneği kullanıyor, ancak uyarı olarak tutmak istediğimiz iki uyarı var.

Uyarıları bastırma seçeneği vardır, ancak bunların işe yaramaması için uyarılar olarak görünmelerini İSTİYORUZ.

Görünüşe göre, istediğimiz davranışı elde etmenin tek yolu, uyarı olarak işlem görmesini istediğimiz ikisi dışında her C # uyarı numarasının bir listesini "Belirli uyarılar" metin kutusuna girmek.

Bakım baş ağrısının yanı sıra, bu yaklaşımın en büyük dezavantajı, birkaç uyarının rakamlara sahip olmaması, dolayısıyla bunlara açıkça referans verilememesidir. Örneğin, "Bu başvuru çözülemedi. 'Veri ....' derlemesi bulunamadı."

Bunu yapmanın daha iyi bir yolunu bilen var mı?


Bunun neden yararlı olduğunu hemen anlamayanlar için açıklama. Çoğu uyarının nasıl çalıştığını düşünün. Size yazdığınız kodda biraz yanlış olduğunu söylüyorlar. Onları düzeltmek yaklaşık 10 saniye sürer ve bu, kod tabanını daha temiz tutar.

"Eski" uyarısı bundan çok farklıdır. Bazen düzeltmek, yalnızca yeni bir yöntem imzası tüketmek anlamına gelir. Ancak, tüm bir sınıfın modası geçmişse ve onu yüz binlerce kod satırına dağılmış olarak kullanıyorsanız, düzeltilmesi haftalar veya daha uzun sürebilir. Yapının bu kadar uzun süre bozulmasını istemezsiniz, ancak kesinlikle bunun hakkında bir uyarı görmek İSTERSİNİZ. Bu sadece varsayımsal bir durum değil - bu bizim başımıza geldi.

Birebir "#warning" uyarıları da benzersizdir. Sık sık istiyorum bunu kontrol etmek, ama yapı kırmak istemiyoruz.


Büyük sayılar listenize boşluklar koyabilir misiniz? Çizgi sarmayı doldurdu.
Ray

Tanrım, çoğu zaman belirli bir kişinin egosunu yatıştırmak için insanlar tarafından oluşturulmuş karmaşık kurallardan nefret ederim.
Jon Limjap

21
Modası geçmiş uyarı hakkındaki düşüncesini görüyorum, bu keyfi değil.
Ed S.

Tecrübelerime göre, yapınızda bir uyarıya bile izin vermek, ilk eşzamansız / await eklemek gibidir. Yakında onlarcası olacak. Tüm kurulumlarda, bir geliştiricinin VS'deki Hata Listesi penceresinde 10'dan az uyarı görebildiğini hatırlıyorum. 5'ten fazla uyarı aldığınız için, bir takımdaki geliştiricilerin büyük çoğunluğunun yenisini fark edemeyeceğine bahse girebilirim - bu, sizin kurulumunuzda, yöntemin geçersiz olduğuna dair uyarıyı fark etmeyecekleri anlamına gelir. bir uyarı almanın tüm amacı :) Bu Neil ile deneyiminiz nedir?
58'de tymtam

@mayu, bu bir muamma. Çoğu zaman, uyarıların uzun zamandır görmezden gelindiğini gördüm. Ama sonunda, ya uyarıyı gösterirsiniz ya da hiçbir şey göstermezsiniz. Uyarıyı gösteriyorsan, en azından birinin ondan yararlı bir şey öğrenme şansı var. Çoğu uyarıyı hata olarak değerlendirirseniz, kalan birkaç uyarı daha fazla dikkat çekebilir.
Neil

Yanıtlar:


155

WarningsNotAsErrorsProje dosyasına bir -tag ekleyebilirsiniz .

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

Not: 612ve 618ikisi de Eski ile ilgili uyarılardır, farkı bilmiyorum ama üzerinde çalıştığım proje 618 uyarısıyla Eski olarak bildiriyor.


24
612 ile 618 arasındaki fark, ObsoleteAttribute'un yorumudur. Yorumsuz bir ObsoleteAttribute, 612 hatasını, yorumlu biri ise 618'i oluşturur.
Marco Spatz

@MarcoSpatz Kesinlikle. Ardından [Obsolete], messageolduğu yerdeki üyelere nullhata olarak davranabilirken, messageayarlananların yalnızca uyarı olarak kalmasına izin verebiliriz . Eğer errorparametre olarak ayarlanır trueiçinde ObsoleteAttribute, bir CS0619 yerine oluşturulur. Bu işin değil gibi görünüyor messageolduğunu null(ama yapacağını kim [Obsolete(null, true)]ki?).
Jeppe Stig Nielsen

F # --warnaserror-:618,1030için, Build-> Other flags alanını kullanın. Bu proje seçeneği henüz F # projeleri için uygulanmadı. github.com/Microsoft/visualfsharp/issues/3395
Asik

2
"WarningsNotAsErrors" bilinmekte fayda var. Dosyayı manuel olarak düzenlemeden proje ayarlarında mevcut olmalıdır. Teşekkürler.
03'te çekin

1
Microsoft bunu gerçekten mahvetti (ve 11 yıl sonra hiçbir şeyi düzeltmedi!). <NoWarn>Çoğu durumda daha düşük <WarningsNotAsErrors>olan ve kullanıcı arayüzüne yerleştirilemeyen proje ayarları değişir . Kudos.
user2864740

13

/ warnaserror / warnaserror-: 618


1
Girişiniz için teşekkürler. IDE problemini çözmeseler bile, bunlar şimdiye kadarki en yararlı yorumlar.
Neil

2
Bunu nereye ekliyorsunuz?
checho

@checho, bu anahtarlar msbuild çağrılırken komut satırına eklenecektir. Amaçlarımız açısından, en iyi cevap daha yararlıdır, çünkü msbuild adını verdiğimiz yolu değiştirmek yerine onu projeye dahil edebiliriz.
Neil

MSBuild 15.9.21 + g9802d43bc3 ile çalışmıyor: MSBUILD : error MSB1001: Unknown switch. Switch: /warnaserror-:618
Paul B.

3

veya daha spesifik olarak, sizin durumunuzda:

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

bu, virgülle ayrılmış listenizdekiler dışındaki tüm uyarıları hata olarak değerlendirmelidir


1

Neden hata olarak görmediğiniz uyarıları görmeye devam etmek istiyorsunuz? Bunun neden arzu edildiği konusunda kafam karıştı - ya onları düzeltirsin ya da yapmazsın.

İki farklı yapı / çözüm dosyası çalışır mı - veya birini kopyalamak için bir komut dosyası ve daha sonra uyarıları / uyarı düzeyini uygun şekilde değiştirin. Görünüşe göre derleyicinin bazı uygulamalarının ciyaklamasını istiyorsunuz, ancak diğerlerinin devam etmesini istiyorsunuz.

Dolayısıyla farklı derleyici anahtarları, gitmek için iyi bir yol gibi görünüyor. Bunu farklı hedeflerle yapabilirsiniz - biri hata ayıklama veya yayınlama ve diğerleri uyarılar hakkında uygun şekilde etiketlenmiş.


7
Çoğu uyarı kodumdaki basit bir karışıklıktan kaynaklanıyor (örneğin, kullanmadığım bir değişken bildirdim). Eski bir uyarı genellikle başka birinin kodundaki bir değişiklik nedeniyle oluşur. Bunu düzeltmek haftalarca geliştirme alabilir. #warning, kodda istediğim bir uyarı (muhtemelen uzun vadeli bir düzeltme).
Neil

4
Başka bir deyişle, yapımı bozmak istemediğime dair uyarılar var. #Warning yapıyı bozarsa, o zaman bir tanesini kontrol edemem. Eğer Eski Sürüm yapıyı bozarsa, bağlı olduğumuz başka bir takım, sadece eski bir öznitelik ekleyerek, bilmeden ekibimizin yapısını bozabilir.
Neil

@Neil Bazı argümanlarınıza katılıyorum, ancak kullanmadığınız bir varlığın kaldırılması fazla zaman almıyor VE kesinlikle başka bir takımın modası geçmiş bir şey yaptığını bilmek istiyorsunuz.
2016

@mayu, yorumunuz için teşekkürler. Kullanmadığınız bir varlığa katılıyorum. Bu yüzden derleyicinin bunu bir hata olarak değerlendirmesini isterim. Ayrıca, bir şeyin ne zaman eski olduğunu bilmek istediğinize de katılıyorum. Ancak, kodunuzdaki eski bir şeyi yeniden düzenlemek çok uzun sürerse, seçenekleriniz şunlardır: 1) Bu uyarıyı bir uyarı olarak değerlendirin 2) Yapınızın uzun süre bozuk kalmasına izin verin 3) Uyarıları hata olarak kapatmak gibi başka bir çözüm. Çoğu uyarı hata şeklinde olduğunda, uyarı listeniz büyük olasılıkla kısa kalacaktır, bu nedenle ne zaman göründüklerini fark etme olasılığınız daha yüksektir. Tercih ettiğiniz çözüm nedir?
Neil

1
@mayu, başka bir ekip (aynı şirket içinde veya dışında) bir sınıfın, yöntemin veya başka bir bileşenin belirli bir süre içinde aşamalı olarak kaldırıldığını yasal olarak iletmek isteyebilir. Bir öznitelik eklemek, bunu bir kitaplığın tüketicilerine bildirmenin iyi bir yoludur. Bunu yapmanın zahmetli olduğunu düşünmüyorum. Aslında, özelliği olabildiğince erken eklemek, başkalarının gelecekteki değişikliklerin farkında olmasını sağlamanın iyi bir yoludur.
Neil

1

Uyarıları hata olarak değerlendir kullanıyorum.

Nadir durumlarda, bazı kabul edilebilir uyarılar göründüğünde (yani, eski üyeye başvurma veya XML serileştirme sınıflarında eksik belgeler), #pragma devre dışı bırakma ile açıkça bastırılmalıdır. (ve isteğe bağlı olarak temiz bir koda sahip olmama nedeni sağlanabilir) birlikte bir yorum olarak).

Bu direktifin varlığı , bazı soruların olması durumunda bu uyarı ihlalini kimin kabul ettiğini (sürüm kontrolünün "suçlama" eylemiyle) bulmaya da olanak tanır .


3
Açıklamamda bahsedilen sorunları çözmese de bunu da kullanıyorum. Bazı uyarıların gizli değil uyarı olarak değerlendirilmesini istiyorum.
Neil

0

Neden basitçe "İçinde 612, 1030, 1701 veya 1702 dışında herhangi bir uyarı olan kodu kontrol eden kişi, beyaz tahtaya gitmeli ve yüz kez yazmalı" diye bir kural olmasın ki, tekrar izin verilmeyen uyarılarla kod girmeyeceğim. '"


9
Bunu zorlarken iyi şanslar ... Uyarıları hata olarak ele almak, genel kod kalitesini artırmak için çok önemli bir adımdır ve geliştiricileri, kodlarını gerçekten düzeltmeye zorlar! Yaşasın otomasyonu, el emeği olduğunu böylece 20. yüzyılın: imsi!
Andreas Magnusson

@AndreasMagnusson Keşke uyarıların olmaması kodun kalitesini gerçekten sağlamışsa ..
user2864740

2
@ user2864740: Kabul edildi, gümüş mermi yok. Ancak, sihirli bir değnek olmadığı gerekçesiyle yararlı bir şeyi reddetmek çok yaygın bir yanılgıdır.
Andreas Magnusson


-4

Bana öyle geliyor ki temel sorun, uyarıları açıkça hata olarak ele almanın ve bunu ihlal eden check-in'lere izin verme şeklindeki görünür politikanızın bir birleşimidir. Dediğiniz gibi, bir uyarıya rağmen çalışmaya devam edebilmek istiyorsunuz. Sadece görmezden gelmek istediğiniz birkaç uyarıdan bahsettiniz, ancak ya takımdaki başka biri başka türden bir uyarıya neden olursa, hangisini düzeltmeniz eşit derecede uzun sürerdi? Bunu da görmezden gelmek istemez miydin?

Mantıksal çözüm, ya 1) Eğer kod derlenmezse check-in'lere izin vermemek (yani uyarıları oluşturanların, yapıyı bozdukları için düzeltmeleri gerekeceği anlamına gelir) ya da 2) uyarıları uyarı olarak ele almak olacaktır. Biri uyarıları hata olarak değerlendiren, kodun uyarı içermediğinden emin olmak için düzenli olarak çalıştırılabilen ve bunları yalnızca uyarı olarak değerlendiren ve başkası bir uyarı verse bile çalışmanıza izin veren iki yapı yapılandırması oluşturun.


1
Seçilen yanıtı kullanarak, uyarı olarak değerlendirilen uyarılar listesine eklemek kolaydır. Bu, önerdiğiniz çözümlerden çok daha iyi çalışıyor. Uyarılar açıkça hata değildir, ancak çoğu uyarıyı hata olarak ele almak, kodun bu uyarılarla asla kontrol edilmeyeceği anlamına gelir.
Neil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.