В настоящее время я упаковываю сборки выпуска с помощью Nuget для официальных сборок на nuget.org, но я упаковываю сборки отладки с помощью Nuget для того, чтобы источник символов отправлял символы на symbolsource.org.
РЕДАКТИРОВАТЬ: (Джон Скит, с некоторым предубеждением от разработки Noda Time)
NuGet теперь поддерживает отправку как в галерею NuGet, так и в symbolsource.org (или аналогичные серверы), как описано в документации . К сожалению, здесь есть два противоречащих друг другу требования:
- Когда вы просто используете библиотеку без необходимости отладки, вам действительно нужна сборка выпуска. В конце концов, для этого и нужны релизные сборки.
- При отладке в библиотеку для диагностических целей вам действительно нужна отладочная сборка с отключенными всеми соответствующими оптимизациями. В конце концов, для этого и нужны отладочные сборки.
Это было бы хорошо, но NuGet не позволяет (насколько я могу судить) публиковать как релизную, так и отладочную сборки полезным способом в одном пакете.
Итак, варианты:
- Распространяйте отладочные сборки для всех (как показано в примере в документации) и работайте с любым размером и падением производительности.
- Распространите сборки релиза среди всех и живите с немного ослабленным опытом отладки.
- Используйте действительно сложную политику распространения, потенциально предоставляя отдельные пакеты выпуска и отладки.
Первые два на самом деле сводятся к влиянию различий между отладочной и выпускной сборками ... хотя стоит отметить, что есть большая разница между желанием войти в код библиотеки, потому что вы хотите проверить какое-то поведение, и желанием для отладки кода библиотеки, потому что вы считаете, что нашли ошибку. Во втором случае, вероятно, лучше получить код библиотеки как решение Visual Studio и отладить таким образом, поэтому я не обращаю слишком много внимания на эту ситуацию.
У меня есть искушение просто придерживаться релизных сборок, ожидая, что отладку потребуется относительно небольшому количеству людей, а на тех, кто это сделает, оптимизация релизной сборки не сильно повлияет . (В любом случае компилятор JIT выполняет большую часть оптимизации.)
Итак, есть ли другие варианты, которые мы не рассматривали? Есть ли другие соображения, которые склоняют чашу весов? Является ли размещение пакетов NuGet в SymbolSource достаточно новым, чтобы действительно не было «лучших практик»?
nuget pack ... -Symbol
и отправляю сгенерированные пакеты ...Ответы:
Говоря о SymbolSource, я считаю, что лучше всего:
В то время как мы находимся на этом, распространено заблуждение, что сборки выпуска и отладки в .NET действительно сильно различаются, но я предполагаю, что различие здесь из-за различного кода, который может или не может быть включен в любую сборку, например Debug .Asserts.
Тем не менее, действительно стоит передать обе конфигурации в SymbolSource, потому что вы просто никогда не знаете, когда вам понадобится отлаживать производственный код. Удаленно в производстве, чтобы усложнить задачу. Когда это произойдет, вам понадобится помощь, которую вы можете получить от своих инструментов. Чего я, очевидно, никому не желаю.
Есть еще вопрос, который следует учитывать в отношении управления версиями: правильно ли иметь 2 разных пакета (сборка в отладке и в выпуске) с общим номером версии? SymbolSource согласится с этим, поскольку он извлекает пакеты и сохраняет двоичные файлы в отдельных ветвях режима сборки, ЕСЛИ ТОЛЬКО NuGet позволяет помечать пакеты соответствующим образом. В настоящее время нет способа определить, находится ли пакет в режиме отладки или в режиме выпуска.
источник
Debug.Assert
т.д., но не могли бы вы рассказать (в своем ответе) о последствиях при отладке? Насколько плохо использовать сборку Release?Полностью согласен с вашим выводом. Пакеты NuGet с RELEASE и SymbolSource с отладкой. Кажется, довольно редко входить непосредственно в пакеты, и случайные ошибки отладки с включенной оптимизацией могут быть приемлемыми.
Если бы действительно была проблема, я думаю, что идеальным решением было бы, чтобы NuGet поддерживал ее. Например, представьте, если бы при отладке он мог заменить выпускаемую DLL библиотекой, включенной в пакет SymbolSource.
В идеале в таком
nuget pack SomePackage -Symbols
случае вместо версии выпуска должен быть создан пакет nuget выпуска, но пакет символов отладки. И плагин VS будет обновлен, чтобы быть достаточно умным, чтобы видеть ассоциацию и извлекать сборки отладки при запуске в отладчике и загружать их вместо этого. Вроде безумно, но было бы интересно.Однако я просто не вижу достаточно людей, которые жалуются на это, чтобы это того стоило на данный момент.
Команда NuGet принимает запросы на вытягивание. :)
источник
Прошло 8 лет с момента публикации OP, поэтому я расскажу о том, что используется в настоящее время.
Есть 2 способа « войти » в пакет NuGet:
1. Распространение PDB
.symbols.nupkg
Пакеты символов считаются устаревшими и были заменены.snupkg
пакетами, которые публикуются на сервере символов . Он поддерживается всеми основными поставщиками, такими как NuGet.org, Azure DevOps ( хотя и менее гладко ) и т. Д.Вот официальные инструкции . Просто добавьте эти две строки в файл csproj:
На стороне потребителя убедитесь, что ваша IDE настроена для сервера символов NuGet.org (или Azure и т. Д.), Чтобы разрешить переход в код пакета при отладке.
2. Ссылка на исходный код. Ссылка на фактический код.
В некоторых случаях PDB могут скрывать некоторые особенности исходного кода из-за оптимизации MSIL / JIT. Таким образом, есть способ « зайти » в фактический источник вашего NuGet во время отладки. Это называется Source Link от .NET Foundation - « независимая от языка и управления исходным кодом система для обеспечения возможности отладки исходного кода для двоичных файлов ».
Он поддерживается Visual Studio 15.3+ и всеми основными поставщиками (также поддерживает частные репозитории).
Это тривиально для настройки ( официальная документация ) - просто добавьте зависимость разработки в файл проекта (зависит от типа вашего репо) вместе с некоторыми флагами:
Подробнее об этом читайте в статье « 5 шагов к лучшему пакету NuGet ».
источник
Пример в разделе « Создание и публикация пакета символов» ссылается на файлы в каталогах Debug как на источники файлов dll и pdb.
Поскольку цель публикации символов состоит в том, чтобы позволить другим пройти через ваш код при отладке, кажется наиболее разумным опубликовать версию кода, предназначенную для отладки, без оптимизаций, которые могут повлиять на выполнение кода.
источник