2012-11-21 9 views
73

Obecnie kompiluję wersje wydań z Nuget dla oficjalnych kompilacji na nuget.org, ale pakuję kompilacje debugowania z Nuget, aby źródło symbolu przepchało się do symbolsource.org.Najlepsze praktyki z Nuget: Debugowanie lub wydawanie?

EDIT: (Jon Skeet, z jakiegoś błędu z rozwojem Noda czas)

Nuget teraz obsługuje zarówno do pchania galerii Nuget i symbolsource.org (lub podobny), serwery as documented. Niestety, istnieją dwa przeciwstawne wymagania tutaj:

  • Kiedy tylko użyciu bibliotekę bez potrzeby debugowania, naprawdę chcesz kompilacji uwolnienia. W końcu to są kompilacje wydań.
  • Podczas debugowania biblioteki do celów diagnostycznych, naprawdę potrzebujesz kompilacji debugowania z wyłączonymi wszystkimi odpowiednimi optymalizacjami. W końcu to są właśnie wersje do debugowania.

To byłoby w porządku, ale NuGet (o ile wiem) nie pozwala, aby kompilacje wydania i debugowania były publikowane w użyteczny sposób, w tym samym pakiecie.

Tak, do wyboru są:

  • rozprowadzić debug buduje dla każdego (jak pokazano w przykładzie z docs) i żyć z dowolnej wielkości i wydajności trafień.
  • Rozłóż kompilacje wydań wszystkim i żyj z lekko ograniczonym doświadczeniem debugowania.
  • Przejdź do bardzo skomplikowanej polityki dystrybucji, potencjalnie dostarczając osobne pakiety wydań i debugowania.

Pierwsze dwa naprawdę sprowadzają się do wpływu różnic między debugowania i uwalniania buduje ... choć warto zauważyć, że istnieje również duża różnica między chcąc wkraczać do kodu biblioteki, ponieważ chcesz sprawdź zachowanie i chcesz debugować kod biblioteki, ponieważ uważasz, że znalazłeś błąd. W drugim przypadku lepiej jest uzyskać kod biblioteki jako rozwiązanie Visual Studio i debugować w ten sposób, więc nie zwracam zbyt dużej uwagi na tę sytuację.

My pokusa jest po prostu trzymać się z wydaniem buduje, z oczekiwaniem, że stosunkowo niewiele osób będzie potrzebować do debugowania, a tymi, którzy robią nie będzie miała wpływu znacznie przez optymalizacje w budowie uwalnianiu. (Kompilator JIT wykonuje większość optymalizacji.)

Czy są inne opcje, których nie rozważaliśmy? Czy istnieją inne czynniki, które przechylają równowagę? Czy pchanie pakietów NuGet do SymbolSource jest wystarczająco nowe, że "najlepsza praktyka" naprawdę nie została ustalona?

+2

Już miałem zadać to samo pytanie - chociaż obecnie naciskam konfigurację Release na symbole, ponieważ używam 'pakietu nuget ... -Symbol' i przesuwania wygenerowanych pakietów. . –

+6

Nie mogę się doczekać, kiedy będę edytować więcej szczegółów mojego własnego kontekstu na twoje pytanie? Myślę, że wyjaśni to kilka powodów do zadawania pytań. –

+0

Idź przed siebie. Nadgonię dzisiaj wszystkie te nowe posty. – gzak

Odpowiedz

25

Mówiąc o SymbolSource uważam, że najlepszym rozwiązaniem jest:

  1. push + pakiety binarne uwolnienia do treści tylko nuget.org (lub jakakolwiek inna produkcja pasz) Pakiety
  2. push debug binarne + content paszy rozwój:
    • w siedzibie
    • na myget.org
    • na nuget.org jako pakiety przedpremierowych.
  3. Przesyłaj oba pakiety symboli binarnych i debugowania do symboluource.org lub dowolnego innego magazynu symboli.

Podczas gdy jesteśmy na tym, to jest powszechne nieporozumienie, że budowanie wersji i debugowania w .NET naprawdę różni się znacznie, ale zakładam, że zróżnicowanie jest tutaj z powodu różnych kodów, które mogą lub nie mogą być zawarte w obu kompilacjach, takich jak Debug.Asserts.

To powiedziawszy, naprawdę warto przepchnąć obie konfiguracje do SymbolSource, ponieważ nigdy nie wiadomo, kiedy będzie trzeba debugować kod produkcyjny. Zdalnie w produkcji, aby było trudniej. Będziesz potrzebować pomocy, którą możesz uzyskać dzięki narzędziom, kiedy to się stanie. Które oczywiście nie życzę nikomu.

Jest jeszcze kwestia do rozważenia w odniesieniu do wersjonowania: czy to prawda, że ​​2 różne pakiety (wbudowane w debugowanie i wydawanie) dzielą 1 numer wersji? SymbolSource zaakceptowałby to, ponieważ wyodrębnia pakiety i przechowuje pliki binarne w oddzielnych gałęziach kompilacji, JEDYNIE TYLKO NuGet może odpowiednio tagować pakiety. Nie ma obecnie możliwości określenia, czy pakiet jest debugowany, czy w trybie zwolnienia.

+0

"Wydanie dwóch buildów do NuGet" jest trudnym krokiem. Zawsze opublikowaliśmy wersję Release Noda Time, uzasadniając to tym, że musiałem wybrać między tymi dwoma. (Mam plik nuspec, zamiast robić to po prostu z projektu C#). Wspomniałeś o debugowaniu kodu produkcyjnego, jakby było to znacznie trudniejsze przy samej wersji wydania - pomimo wcześniejszego "nie różnią się zbytnio". Jestem świadomy NOPs w kompilacji debugowania i oczywiście "Debug.Assert" itp. - ale czy można rozszerzyć (w odpowiedzi) na implikacje podczas debugowania? Jak źle używasz wersji Release? –

+0

Chodziło mi tylko o to, że chcesz mieć symbole dostępne dla wszystkich używanych plików binarnych: jeśli istnieją zarówno kompilacje debugowania, jak i wydania w środowisku naturalnym, będziesz chciał podać symbole dla obu. Nie muszą różnić się zbytnio pod względem kodu, ale różnią się sumami kontrolnymi, co uniemożliwia ładowanie symboli bez hakowania. – TripleEmcoder

+1

Dobrze. Moim możliwym rozwiązaniem jest * tylko * kiedykolwiek wydać pliki binarne Release, ale martwię się o to, jak wiele to boli, jeśli chodzi o debugowanie. Na przykład, czy brak NOPów oznacza, że ​​nie możesz dodawać punktów przerwania? –

0

Przykład w pliku Creating and Publishing A Symbol Package odwołuje się do plików w katalogach debugowania jako źródła plików dll i pdb.

Określanie Symbol Zawartość opakowania

Pakiet symbol może być zbudowany przez konwencje, z folderu zorganizowany w sposób opisany w poprzednim rozdziale, lub jego zawartość może być określona za pomocą sekcji Pliki.Jeśli chciał budować przykładowy pakiet opisany poprzednio, można umieścić to w swoim nuspec pliku:

<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> 

Ponieważ w celu publikowania symbole to, by inni mogli prześledzić kodu podczas debugowania, wydaje najbardziej rozważne jest opublikowanie wersji kodu przeznaczonej do debugowania bez optymalizacji, która mogłaby wpłynąć na krok po kroku.

+0

Tak, właśnie to robi * przykład * - ale wolałbym nie mieć możliwości debugowania, ponieważ nadrzędnym celem większości programistów jest uruchomienie wersji. Problem polega na tym, że NuGet nie ma możliwości publikowania zarówno wersji release, jak i debugowania, o ile wiem. (Byłoby również dla mnie małym bólem opublikowanie obu, ponieważ oznacza to stworzenie kolejnego zestawu konfiguracji dla podpisanych kompilacji debugowania ...) –

+0

Tutaj dostajemy trochę subiektywności. Zazwyczaj moim wyborem na "najlepszą praktykę" będzie to, co autor zaleca, jawnie lub niejawnie, ponieważ zakładam, że mają więcej wglądu (lub niedopatrzenia, w przypadku założeń, które kończą się w przykładach) niż I. Mówienie osobiście, Myślę, że symbole powinny pasować do wersji, której używam. Zwykle nie używałbym pakietu, który uważałbym, że prawdopodobnie będę musiał debugować, chyba że źródło jest publiczne iw razie potrzeby mogę skompilować je od podstaw, więc brak spakowanej, debugującej kompilacji nie jest szczególnie ważny. – tvanfosson

+0

W moim przypadku, jeśli ktokolwiek potrzebuje debugowania czasu Noda, ponieważ sądzi, że jest błąd w Noda Time, lepiej byłoby pobrać źródło (co oczywiście mogą zrobić). Jednak nadal warto jest wejść do kodu źródłowego Noda Time, aby zobaczyć, co się dzieje. Zasadniczo myślę, że istnieją (co najmniej) dwa różne scenariusze debugowania, z różnymi rozwiązaniami ... –

4

Całkowicie zgadzam się z Twoim wnioskiem. Pakiety NuGet z RELEASE i SymbolSource z debugowaniem. Wydaje się dość rzadkie, aby wkroczyć bezpośrednio do pakietów, a okazjonalne błędy w debugowaniu z włączonymi optymalizacjami mogą być akceptowalne.

Jeśli był naprawdę problem, myślę, że idealnym rozwiązaniem byłoby wsparcie NuGeta. Wyobraźmy sobie na przykład, że podczas debugowania może zastąpić bibliotekę wydań DLL tą, która znajduje się w pakiecie SymbolSource.

Najlepiej byłoby wtedy, gdyby nuget pack SomePackage -Symbols przeciwko wersji wydania utworzyło pakiet Nuget wydania, ale pakiet symboli debugowania. Wtyczka VS zostanie zaktualizowana tak, aby była wystarczająco inteligentna, aby zobaczyć powiązanie i pobrać zestawy debugowania podczas działania w debugerze i załadować je. Coś szalonego, ale byłoby interesujące.

Jednak nie widzę wystarczająco wielu osób narzekających na to, że w tej chwili warto.

Zespół NuGet przyjmuje żądania ściągnięcia.:)

+0

Nie jestem pewien, czy rozumiem twoje drugie zdanie - podejrzewam, że OP (zanim edytowałem) wykonywał ręczne przesuwanie do SymbolSource dla wersji debugowania. Czy przewidujesz poważne problemy, jeśli PDB wersji * wersji * zostanie umieszczone w SymbolSource zamiast wersji debugowania? A może to właśnie popierasz, a ja po prostu źle to rozumiem? –

+3

"Jednak nie widzę wystarczającej liczby osób narzekających na to, że w tej chwili byłoby warto." Być może nie narzekają, ale jeśli zapytasz próbkę użytkowników, co o tym sądzą, założę się, że większość ludzi przyznałaby się do pewnego zamieszania na tym etapie (co opublikować na NuGet.org). i SymbolSource.org). Gdybyś zapytał, co ostatecznie wybrali, prawdopodobnie uznałbyś, że nie ma jednej uzgodnionej praktyki, każdy po prostu robi swoje. – gzak

+6

Chcę narzekać na to, gdzie mam się zarejestrować? – Alex