Saat ini, saya mengemas rilis build dengan Nuget untuk build resmi ke nuget.org, tetapi saya mengemas build debug dengan Nuget untuk push source simbol ke symbolource.org.
EDIT: (Jon Skeet, dengan beberapa bias dari pengembangan Noda Time)
NuGet sekarang mendukung pengiriman ke galeri NuGet dan symbolource.org (atau server serupa), seperti yang didokumentasikan . Sayangnya, ada dua persyaratan yang kontradiktif di sini:
- Saat hanya menggunakan perpustakaan tanpa perlu debugging, Anda benar-benar menginginkan rilis build. Itulah gunanya rilis build.
- Saat men-debug ke pustaka untuk tujuan diagnostik, Anda benar-benar menginginkan build debug dengan semua pengoptimalan yang sesuai dinonaktifkan. Itulah gunanya build debug.
Itu akan baik-baik saja, tetapi NuGet tidak (sejauh yang saya tahu) mengizinkan rilis dan debug build untuk dipublikasikan dengan cara yang berguna, dalam paket yang sama.
Jadi, pilihannya adalah:
- Distribusikan build debug kepada semua orang (seperti yang ditunjukkan dalam contoh di dokumen) dan aktifkan dengan ukuran dan kinerja apa pun yang muncul.
- Distribusikan rilis build untuk semua orang dan hidup dengan pengalaman debug yang sedikit terganggu.
- Gunakan kebijakan distribusi yang sangat rumit, berpotensi menyediakan rilis terpisah dan paket debug.
Dua yang pertama benar-benar bermuara pada efek perbedaan antara debug dan rilis build ... meskipun perlu dicatat bahwa ada juga perbedaan besar antara ingin masuk ke dalam kode perpustakaan karena Anda ingin memeriksa beberapa perilaku, dan menginginkan untuk men-debug kode perpustakaan karena Anda yakin telah menemukan bug. Dalam kasus kedua, mungkin lebih baik untuk mendapatkan kode perpustakaan sebagai solusi Visual Studio dan debug seperti itu, jadi saya tidak terlalu memperhatikan situasi itu.
Godaan saya adalah tetap menggunakan build rilis, dengan harapan bahwa relatif sedikit orang yang perlu melakukan debug, dan orang yang melakukannya tidak akan banyak terpengaruh oleh pengoptimalan dalam build rilis. (Kompiler JIT melakukan sebagian besar pengoptimalan.)
Jadi, apakah ada opsi lain yang belum kami pertimbangkan? Apakah ada pertimbangan lain yang memberi keseimbangan? Apakah mendorong paket NuGet ke SymbolSource cukup baru sehingga "praktik terbaik" benar-benar belum dibuat?
nuget pack ... -Symbol
dan mendorong paket yang dihasilkan ...Jawaban:
Berbicara untuk SymbolSource, saya yakin praktik terbaiknya adalah:
Sementara kita melakukannya, itu adalah kesalahpahaman umum bahwa rilis dan debug yang dibangun di .NET sangat berbeda, tetapi saya berasumsi bahwa perbedaannya ada di sini karena berbagai kode yang mungkin atau mungkin tidak disertakan dalam salah satu build, seperti Debug .Menyatakan.
Meskipun demikian, sangatlah berharga untuk mendorong kedua konfigurasi ke SymbolSource, karena Anda tidak pernah tahu kapan Anda perlu men-debug kode produksi. Jauh di produksi untuk membuatnya lebih sulit. Anda akan membutuhkan bantuan yang dapat Anda peroleh dari perkakas Anda saat itu terjadi. Yang jelas tidak saya inginkan pada siapa pun.
Masih ada masalah yang perlu dipertimbangkan terkait pembuatan versi: apakah benar memiliki 2 paket berbeda (build dalam debug dan dalam rilis) yang berbagi 1 nomor versi? SymbolSource akan menerimanya, karena mengekstrak paket dan menyimpan biner dalam cabang mode build terpisah, JIKA HANYA NuGet diizinkan untuk menandai paket yang sesuai. Tidak ada cara saat ini untuk menentukan apakah sebuah paket adalah debug atau mode rilis.
sumber
Debug.Assert
dll - tetapi dapatkah Anda memperluas (dalam jawaban Anda) tentang implikasi saat debugging? Seberapa buruk menggunakan build Rilis?Saya sepenuhnya setuju dengan kesimpulan Anda. Paket NuGet dengan RELEASE dan SymbolSource dengan debug. Tampaknya sangat jarang untuk masuk langsung ke paket dan kesalahan langkah debug sesekali dengan pengoptimalan diaktifkan mungkin dapat diterima.
Jika benar-benar ada masalah, saya pikir solusi yang ideal adalah meminta NuGet mendukungnya. Misalnya, bayangkan jika saat men-debug, itu bisa menggantikan rilis DLL dengan yang disertakan dalam paket SymbolSource.
Idealnya, yang akan terjadi selanjutnya adalah bahwa
nuget pack SomePackage -Symbols
versi rilis akan membuat paket nuget rilis, tetapi paket simbol debug. Dan plugin VS akan diperbarui agar cukup pintar untuk melihat pengaitan dan menarik rakitan Debug saat berjalan di debugger dan memuatnya sebagai gantinya. Agak gila, tapi akan menarik.Namun, saya hanya tidak melihat cukup banyak orang yang mengeluh tentang hal ini sehingga layak dilakukan saat ini.
Tim NuGet menerima permintaan penarikan. :)
sumber
Sudah 8 tahun sejak posting OP, jadi saya akan memberikan celah dengan apa yang digunakan saat ini.
Ada 2 cara untuk " melangkah ke " paket NuGet:
1. Distribusi PDB
.symbols.nupkg
paket simbol dianggap sebagai warisan dan telah diganti dengan.snupkg
paket yang dipublikasikan ke Server Simbol . Ini didukung oleh sebagian besar vendor dengan Azure DevOps sebagai pihak luar terbesar di mana permintaan fitur masih "dalam peninjauan" (terima kasih @alv untuk tautannya).Berikut adalah instruksi resminya . Cukup tambahkan dua baris ini ke file csproj:
Di sisi konsumen, pastikan bahwa IDE Anda dikonfigurasi untuk Server Simbol NuGet.org (atau Azure, dll.) Untuk memungkinkan masuk ke kode paket saat debugging.
2. Source Link. Menghubungkan kode sebenarnya
Dalam beberapa kasus, PDB mungkin menyembunyikan beberapa spesifikasi kode sumber karena pengoptimalan MSIL / JIT. Jadi ada cara untuk " Melangkah ke " sumber sebenarnya dari NuGet Anda saat melakukan debug. Ini disebut Source Link dari .NET Foundation - " sistem agnostik kontrol bahasa dan sumber untuk menyediakan pengalaman debugging sumber untuk binari ".
Ini didukung oleh Visual Studio 15.3+ dan semua vendor utama (juga mendukung repo pribadi).
Sangat mudah untuk menyiapkan ( dokumen resmi ) - cukup tambahkan dependensi pengembangan ke file proyek (tergantung pada jenis repo Anda) bersama dengan beberapa flag:
Lihat lebih lanjut tentang subjek ini di " 5 langkah untuk paket NuGet yang lebih baik ".
sumber
Contoh dalam Membuat dan Menerbitkan Paket Simbol mereferensikan file di direktori Debug sebagai sumber untuk file dll dan pdb.
Karena tujuan penerbitan simbol adalah untuk memungkinkan orang lain melewati kode Anda saat men-debug, tampaknya paling bijaksana untuk menerbitkan versi kode yang dimaksudkan untuk debugging tanpa pengoptimalan yang mungkin memengaruhi langkah kode.
sumber