Nuget ile en iyi uygulamalar: Hata Ayıklama mı Yayınlama mı?


92

Şu anda, nuget.org'daki resmi derlemeler için sürüm yapılarını Nuget ile paketliyorum, ancak sembol kaynağı için Symbolsource.org'a gönderilen hata ayıklama yapılarını Nuget ile paketliyorum.

DÜZENLEME: (Jon Skeet, Noda Time geliştirmeden bazı önyargılarla)

Nuget şimdi Nuget galerisinde hem iterek destekler ve , symbolsource.org (veya benzeri sunucular) belgelenmiş olarak . Ne yazık ki, burada iki çelişkili gereksinim var:

  • Hata ayıklamaya ihtiyaç duymadan sadece bir kitaplık kullanırken , gerçekten bir sürüm derlemesi istersiniz. Sonuçta sürüm yapıları bunun için.
  • Tanılama amacıyla bir kitaplıkta hata ayıklarken, tüm uygun optimizasyonların devre dışı bırakıldığı bir hata ayıklama derlemesini gerçekten istiyorsunuz. Sonuçta, hata ayıklama yapıları bunun için var.

Bu iyi olurdu, ancak NuGet (söyleyebildiğim kadarıyla) hem yayınlama hem de hata ayıklama yapılarının aynı pakette yararlı bir şekilde yayınlanmasına izin vermiyor.

Yani seçenekler şunlardır:

  • Hata ayıklama derlemelerini herkese dağıtın (belgelerdeki örnekte gösterildiği gibi) ve her boyutta ve performans isabetiyle yaşayın.
  • Yayın yapılarını herkese dağıtın ve biraz bozulmuş bir hata ayıklama deneyimiyle yaşayın.
  • Potansiyel olarak ayrı sürüm ve hata ayıklama paketleri sağlayan, gerçekten karmaşık bir dağıtım ilkesine gidin.

İlk ikisi, hata ayıklama ve sürüm yapıları arasındaki farkların etkisine gerçekten indirgeniyor ... ancak bir kitaplığın koduna adım atmak istemekle bazı davranışları kontrol etmek istemeniz arasında büyük bir fark olduğunu belirtmek gerekir. bir hata bulduğunuzu düşündüğünüz için bir kitaplığın kodunda hata ayıklamak için. İkinci durumda, kitaplığın kodunu bir Visual Studio çözümü olarak almak ve bu şekilde hata ayıklamak muhtemelen daha iyidir , bu nedenle bu duruma çok fazla önem vermiyorum.

Benim cazibem, nispeten az sayıda kişinin hata ayıklaması gerekeceği ve bunu yapanların sürüm yapısındaki optimizasyonlardan fazla etkilenmeyeceği beklentisiyle sürüm yapılarına sadık kalmaktır . (JIT derleyicisi, optimizasyonun çoğunu yine de yapar.)

Peki, düşünmediğimiz başka seçenekler var mı? Dengeyi değiştiren başka hususlar var mı? NuGet paketlerini SymbolSource'a göndermek, "en iyi uygulama" gerçekten kurulmamış kadar yeterince yeni mi?


2
Ben de aynı soruyu sormak üzereydim - şu anda Sürüm yapılandırmasını sembol kaynağına zorluyor olsam da, sadece nuget pack ... -Symbolüretilen paketleri kullandığım ve zorladığım düşünüldüğünde ...
Jon Skeet

1
Bu Soru / Cevap oturumunu NuGet'in arkasındaki kişilere göndermem ve bunun üzerinde tartışıp değerlendiremeyeceklerini görmem gerektiğini hissediyorum.
gzak

Paketinizde oturum açın ve ardından yalnızca sürüm yapısını yayınlayın. Tüketicinin kendi tercihlerine göre günlük kaydını ayarlamasını sağlayacak kaydedici enjeksiyonuna izin verebilirsiniz.
CShark

Yanıtlar:


31

SymbolSource adına konuşursak, en iyi uygulamanın aşağıdakileri yapmak olduğuna inanıyorum:

  1. İkili + içerik paketlerini yalnızca nuget.org'a (veya başka herhangi bir üretim akışına) itin
  2. Hata ayıklama ikili + içerik paketlerini bir geliştirme akışına gönderin:
    • şirket içi
    • myget.org'da
    • nuget.org'da yayın öncesi paketler olarak.
  3. İkili + sembol paketlerini hem serbest bırakın hem de hata ayıklayın.

Biz oradayken, .NET'teki sürüm ve hata ayıklama yapılarının gerçekten çok farklı olduğu yaygın bir yanılgıdır, ancak farklılaşmanın her iki yapıya da dahil edilebilecek veya edilmeyebilecek çeşitli kodlar nedeniyle burada olduğunu varsayıyorum. .Asserts.

Bununla birlikte, her iki yapılandırmayı da SymbolSource'a itmeye gerçekten değer, çünkü üretim kodunda ne zaman hata ayıklamanız gerekeceğini asla bilemezsiniz. Daha zor hale getirmek için uzaktan üretimde. Bu gerçekleştiğinde aletlerinizden alabileceğiniz yardıma ihtiyacınız olacak. Açıkçası kimseden istemiyorum.

Sürüm oluşturma ile ilgili olarak hala dikkate alınması gereken bir konu var: 1 sürüm numarasını paylaşan 2 farklı paket (hata ayıklama ve sürümde derleme) olması doğru mu? SymbolSource, paketleri çıkardığı ve ikili dosyaları ayrı derleme modu dallarında depoladığı için, YALNIZCA NuGet'in paketleri uygun şekilde etiketlemesine izin verdiğinden bunu kabul eder. Şu anda bir paketin hata ayıklama veya yayınlama modu olup olmadığını belirlemenin bir yolu yoktur.


"NuGet'e iki derleme yayımlama" bölümü, zor bittir. İkisi arasında seçim yapmak zorunda olduğum gerekçesiyle her zaman Noda Time'ın Yayın yapısını yayınladım. (Sadece C # projesinden yapmak yerine bir nuspec dosyam var.) Üretim kodunda hata ayıklamayı sanki sadece bir sürüm yapısıyla çok daha zor gibi söylüyorsunuz - önceki "çok farklı değiller" kısmına rağmen. Hata ayıklama yapılarındaki NOP'ların farkındayım ve tabii ki Debug.Assertvb - ancak hata ayıklama sırasındaki etkileri (cevabınızda) genişletebilir misiniz? Sürüm yapısını kullanmak ne kadar kötü?
Jon Skeet 13

Demek istediğim, sadece kullanımdaki tüm ikili dosyalar için kullanılabilir sembollere sahip olmak istemenizdi: vahşi ortamda hem hata ayıklama hem de sürüm yapıları varsa, her ikisi için de semboller sağlamak isteyeceksiniz. Kod açısından çok farklı olmaları gerekmez, ancak sağlama toplamlarında farklılık göstereceklerdir, bu da bazı bilgisayar korsanlığı olmadan sembollerin yüklenmesini imkansız hale getirir.
TripleEmcoder 01

1
Sağ. Olası çözümüm, yalnızca Release ikili dosyalarını serbest bırakmak, ancak bunun hata ayıklama açısından ne kadar zarar vereceği konusunda endişeliyim. Örneğin, NOP olmaması, kesme noktaları ekleyemeyeceğiniz anlamına mı geliyor?
Jon Skeet 13

Sorun, JIT optimizasyonlarında, derleme zamanı optimizasyonlarından daha fazladır. Bu nedenle, yayınlama modu paketlerine basarsanız ve hata ayıklama gerektiğinde COMPLUS_ZapDisable = 1 kullanmanızı önerirseniz, bu benim için yeterli olur. Yine de NuGet, hata ayıklamaya ve bir şekilde birlikte yayınlamaya izin vermelidir.
TripleEmcoder

Symbolssource.org'un var olduğu hakkında hiçbir fikrim yoktu. Bir kaşıntı olarak birçok kez kaşıma ihtiyacım oldu, bunu memnuniyetle karşılıyorum.
Remus Rusanu

4

Kararınıza tamamen katılıyorum. RELEASE ile NuGet paketleri ve hata ayıklamalı SymbolSource. Doğrudan paketlere adım atmak oldukça nadir görülür ve optimizasyonların etkinleştirilmesiyle ara sıra oluşan hata ayıklama yanlış adımları kabul edilebilir olabilir.

Gerçekten bir sorun olsaydı, ideal çözümün NuGet'in desteklemesi olacağını düşünüyorum. Örneğin, hata ayıklama sırasında sürüm DLL'sini SymbolSource paketinde bulunan DLL ile değiştirebileceğini düşünün.

İdeal olarak, o zaman olacak olan şey, nuget pack SomePackage -Symbolsbir yayın sürümüne karşı bir yayın nuget paketi, ancak bir hata ayıklama sembolleri paketi oluşturmasıdır. Ve VS eklentisi, ilişkilendirmeyi görmek ve bir hata ayıklayıcıda çalışırken Hata Ayıklama derlemelerini çekip yerine bunları yüklemek için yeterince akıllı olacak şekilde güncellenecektir. Biraz çılgınca ama ilginç olurdu.

Ancak, şu anda buna değeceğinden şikayet eden yeterince insan görmüyorum.

NuGet ekibi çekme isteklerini kabul eder. :)


İkinci cümlenizi anladığımdan emin değilim - OP'nin (ben düzenlemeden önce) hata ayıklama yapıları için SymbolSource'a manuel itmeler yaptığından şüpheleniyorum. Yayın sürümünün PDB'si hata ayıklama sürümü yerine SymbolSource'ta biterse önemli sorunlar öngörüyor musunuz ? Yoksa savunduğun şey bu muydu ve ben yanlış mı anladım?
Jon Skeet

3
"Ancak, şu anda buna değeceğinden şikayet eden yeterince insan görmüyorum." Belki de şikayet etmiyorlardır, ancak bir kullanıcı örneğine bunun hakkında ne düşündüklerini sorarsanız, bahse girerim ki çoğu insan bu belirli adımda biraz kafa karışıklığını kabul eder (NuGet.org ve SymbolSource'a ne yayınlamalı) .org). Neyi seçtiklerini sorduysanız, muhtemelen üzerinde anlaşılan tek bir uygulama olmadığını, herkesin kendi işini yaptığını göreceksiniz.
gzak

7
Bundan şikayet etmek istiyorum, nereden kaydolabilirim?
Alex

Dahili NuGetlere sahip olduğunuzda ve bunları bir sembol sunucusuna dağıtmaya başladığınızda ... kaçınılmaz olarak onlarda hata ayıklamak isteyeceksiniz .... ve kodda adım adım ilerleyebilseniz bile, " yerel değişken veya argüman ... optimize edildi ". Phil'in bahsettiği gibi ... Eğer nuget hata ayıklama dll'lerini hata ayıklama kipinde yüklemek ve dll'leri yayın kipinde (nuget paketlerinden) serbest bırakmak için bir yol bulmuşsa, bu nihai olacaktır. O zamana kadar Nuget paketi değiştiriciyle
felickz

1
Kabul ediyorum, bu güzel bir ürün geliştirme olur.
htm11h

2

OP'nin gönderilmesinden bu yana 8 yıl geçti, bu yüzden bugünlerde kullanılanlara bir göz atacağım.

NuGet paketine " adım atmanın " 2 yolu vardır :

1. PDB'lerin Dağılımı

.symbols.nupkgsembol paketleri eski kabul edilir ve Symbol Server'da.snupkg yayınlanan paketlerle değiştirilmiştir . NuGet.org, Azure DevOps ( daha az sorunsuz ) gibi tüm büyük satıcılar tarafından desteklenir .

İşte resmi talimatlar . Bu iki satırı csproj dosyasına eklemeniz yeterlidir:

<PropertyGroup>
  <IncludeSymbols>true</IncludeSymbols>
  <SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>

Tüketici tarafında, hata ayıklama sırasında paket koduna adım atmaya izin vermek için IDE'nizin NuGet.org (veya Azure vb.) Sembol Sunucusu için yapılandırıldığından emin olun .

2. Kaynak Bağlantısı. Asıl kodu bağlama

Bazı durumlarda, PDB'ler, MSIL / JIT optimizasyonu nedeniyle kaynak kodunun bazı özelliklerini gizleyebilir. Dolayısıyla , hata ayıklama sırasında NuGet'inizin gerçek kaynağına " Adım atmanın " bir yolu vardır . Adı .NET Foundation'dan Kaynak Bağlantısı - " ikili dosyalar için kaynak hata ayıklama deneyimleri sağlamak için bir dil ve kaynak denetimi bağımsız sistem ".

Visual Studio 15.3+ ve tüm büyük satıcılar tarafından desteklenir (ayrıca özel depoları destekler).

Kurulum yapmak önemsizdir ( resmi belgeler ) - sadece proje dosyasına bir geliştirme bağımlılığı ekleyin (deponuzun türüne bağlıdır) ve bazı bayraklar:

<PropertyGroup>
    <PublishRepositoryUrl>true</PublishRepositoryUrl>
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
</PropertyGroup>
<ItemGroup>
  <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>

" Daha iyi NuGet paketi için 5 adım " bölümünde bu konu hakkında daha fazla bilgi edinin .


1

Bir Sembol Paketi Oluşturma ve Yayımlama'daki örnek , Hata Ayıklama dizinlerindeki dosyalara dll ve pdb dosyalarının kaynağı olarak başvurur.

Sembol Paketi İçeriklerini Belirtme

Bir sembol paketi, önceki bölümde açıklanan şekilde yapılandırılmış bir klasörden geleneklerle oluşturulabilir veya içeriği dosyalar bölümü kullanılarak belirtilebilir. Daha önce açıklanan örnek paketi oluşturmak istiyorsanız, bunu nuspec dosyanıza koyabilirsiniz:

<files>
  <file src="Full\bin\Debug\*.dll" target="lib\net40" /> 
  <file src="Full\bin\Debug\*.pdb" target="lib\net40" /> 
  <file src="Silverlight\bin\Debug\*.dll" target="lib\sl40" /> 
  <file src="Silverlight\bin\Debug\*.pdb" target="lib\sl40" /> 
  <file src="**\*.cs" target="src" />
</files>

Sembolleri yayınlamanın amacı, başkalarının hata ayıklama sırasında kodunuzda adım adım ilerlemesine izin vermek olduğundan, kod adımını etkileyebilecek optimizasyonlar olmadan hata ayıklamaya yönelik bir kod sürümünü yayınlamak en akıllıca görünmektedir.


Evet, örneğin yaptığı budur - ancak çoğu geliştiricinin yalnızca yayın sürümünü çalıştırma arzusunu geçersiz kılan hata ayıklama yeteneğiyle sonuçlanmamayı tercih ederim. Sorun, NuGet'in söyleyebildiğim kadarıyla hem yayınlama hem de hata ayıklama derlemelerini yayınlamanın bir yolu olmamasıdır. (İmzalı hata ayıklama yapıları için başka bir yapılandırma kümesi oluşturmak anlamına geldiğinden, her ikisini de yayınlamak benim için hafif bir acı olurdu ...)
Jon Skeet

Burada biraz öznelliğe giriyoruz. Tipik olarak, benim "en iyi uygulama" seçimim, yazarın açık veya zımni olarak önerdiği seçim olacaktır, çünkü benden daha fazla içgörüye (veya örneklerle sonuçlanan varsayımlar durumunda gözetim) sahip olduklarını varsayıyorum. Kişisel olarak konuşmak, Sanırım semboller, kullandığım versiyonla eşleşmeli. Kaynak herkese açık olmadığı ve gerekirse sıfırdan derleyebildiğim sürece, hata ayıklamam gerekebileceğini düşündüğüm bir paketi genellikle kullanmazdım, bu nedenle paketlenmiş, hata ayıklama yapısının olmaması özellikle önemli değildir.
tvanfosson

Benim durumumda, birinin Noda Time'da bir hata olduğuna inandıkları için Noda Time'da hata ayıklaması gerekiyorsa, kaynağı indirmeleri daha iyi olacaktır (tabii ki yapabilirler). Bununla birlikte, sadece neler olup bittiğini görmek için Noda Zaman kaynak koduna girebilmek hala yararlıdır. Temel olarak, farklı çözümlerle hata ayıklama için (en az) iki farklı senaryo olduğunu düşünüyorum ...
Jon Skeet

Düşünmeyi sevdiğim bir şey .NET'in kendisidir: Sanırım Microsoft'un yayın sürümlerini yayınladığını ve .NET sürümlerinde hata ayıklama yapmadığını söylemek güvenli. Bir sürüm yapısı, belirli bir kalite ve kararlılık düzeyini ifade eder, bu nedenle, bir şeyleri teşhis etmek için nadiren koda girmeniz gerekmesidir.
gzak

2
Ancak, bu aynı zamanda oldukça "kapalı kaynak" zihniyetidir. Açık kaynak dünyasında, çeşitli kitaplıkların "kararlı sürümleri" koduna adım atabilmenin daha çok beklendiğini buldum, çünkü bazı şeyler bozuk değil, bazen en iyi dokümantasyon sadece kitaplığın ne olduğunu görmektir. yapıyor.
gzak
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.