Вопрос по debugging, nuget, visual-studio, release – Лучшие практики с Nuget: отладка или релиз?

80

В настоящее время я упаковываю сборки релиза с Nuget для официальных сборок в nuget.org, но я упаковываю сборки отладки с Nuget для источника символов, отправляемого на symbolsource.org.

РЕДАКТИРОВАТЬ: (Джон Скит, с некоторым уклоном от разработки Noda Time)

NuGet теперь поддерживает отправку в обе галереи NuGetа также symbolsource.org (или похожие серверы),как задокументировано, К сожалению, здесь есть два противоречивых требования:

Когда простос помощью библиотека без необходимости отладки, вам действительно нужна сборка релиза. Тот'В конце концов, для чего нужны сборки релизов.При отладке в библиотеку для диагностических целей вы действительно хотите отладочную сборку со всеми соответствующими оптимизациями отключенными. Тот'В конце концов, для чего нужны отладочные сборки.

Это было бы хорошо, но NuGet неt (насколько я могу судить) позволяет публиковать как релизную, так и отладочную сборки в одном и том же пакете.

Итак, выбор:

Раздайте отладочные сборки всем (как показано в примере в документации) и живите с любыми размерами и производительностью.Раздайте сборки выпуска всем и живите с немного ослабленным опытом отладки.Пойдите для действительно сложной политики распространения, потенциально предоставляя отдельные пакеты выпуска и отладки.

Первые два действительно сводятся к эффекту различий между сборками отладки и выпуска ... хотя это 'Стоит отметить, что тамТакже существует большая разница между желанием войти в код библиотеки, потому что вы хотите проверить поведение, и желанием отладить код библиотеки, потому что вы веритемы нашли ошибку Во втором случае этоВозможно, лучше получить код библиотекикак решение Visual Studio и отладить таким образом, так что яЯ не обращаю слишком много внимания на эту ситуацию.

Мое искушение состоит в том, чтобы просто придерживаться сборок релиза, ожидая, чтоотносительно мало кому нужно будет отлаживать, а те, кто победитэто не повлияетмного оптимизациями в сборке релиза. (Компилятор JIT в любом случае выполняет большую часть оптимизации.)

Итак, есть ли другие варианты у нас не былоТ рассмотрены? Есть ли другие соображения, которые нарушают баланс? Выдвигает пакеты NuGet в SymbolSource достаточно новым, чтобылучшая практика » действительно нетне было установлено?

Готово - не стесняйтесь редактировать дальше :) Jon Skeet
Идите прямо вперед. Я'Познакомлюсь со всеми этими новыми постами позже сегодня. gzak
Я чувствую, что должен передать эту сессию вопросов и ответов людям, стоящим за NuGet, и посмотреть, смогут ли они повлиять на нее. gzak
Не возражаете, если я отредактирую больше деталей моего собственного контекста в ваш вопрос? Я думаю это'уточню некоторые причины для вопроса. Jon Skeet

Ваш Ответ

3   ответа
4

ource с отладкой. Кажется, довольно редко переходить непосредственно к пакетам, и иногда допускается ошибка отладки с включенной оптимизацией.

Если бы действительно была проблема, я думаю, что идеальным решением было бы иметь поддержку NuGet. Например, представьте, что при отладке он может заменить библиотеку выпуска той, которая включена в пакет SymbolSource.

В идеале то, что случилось бы, этоnuget pack SomePackage -Symbols против версии выпуска создаст пакет nuget выпуска, но пакет символов отладки. И плагин VS будет обновлен, чтобы быть достаточно умным, чтобы видеть ассоциации и вставлять сборки отладки при запуске в отладчике и загружать их вместо этого. Вид сумасшедший, но было бы интересно.

Тем не менее, я просто нене вижу достаточно людей, жалующихся на это, что этостоило бы того в данный момент.

Команда NuGet принимает запросы на извлечение. :)Я'

я не уверен, что понимаю ваше второе предложение - я подозреваю, что OP (до того, как я отредактировал) делал ручные изменения в SymbolSource для отладочных сборок. Предусматриваете ли вы значительные проблемы, еслирелиз версия'PDB заканчивается в SymbolSource вместо отладочной версии? Или это то, что вы защищали, а я просто неправильно понял? Jon Skeet
Я хочу пожаловаться на это, где мне зарегистрироваться? Alex
Я согласен, это было бы хорошим улучшением продукта. htm11h
Тем не менее, я просто нене вижу достаточно людей, жалующихся на это, что этостоило бы того ".  Возможно, онине жалуюсь, но если вы спросите выборку пользователей, что они думают об этом, держу пари,Я обнаружил, что большинство людей допускают некоторую путаницу на этом конкретном этапе (что публиковать на NuGet.org и SymbolSource.org). Если вы спросите, что они выбрали в итоге, выя бы, наверное, обнаружил, чтонет единой согласованной практики, каждый просто делает свое дело. gzak
Как только у вас есть внутренние NuGets и вы начинаете развертывать их на сервере символов ... вы неизбежно захотите их отладить .... и даже если вы сможете пройтись по коду, с которым вы в конечном итоге столкнетесь "Невозможно получить значение локальной переменной или аргумента ... оно было оптимизировано ", Как упоминает Фил ... Если в nuget есть способ загрузить отладочные библиотеки в режиме отладки и выпустить библиотеки в режиме выпуска (из пакетов nuget), это будет наилучшим вариантом. До тех пор мы застряли сПереключатель пакетов Nuget felickz
1

Создание и публикация пакета символов ссылается на файлы в каталогах Debug как источники для файлов dll и pdb.

Указание содержимого пакета символов

Пакет символов может быть создан в соответствии с соглашениями из папки, структурированной способом, описанным в предыдущем разделе, или его содержимое может быть указано с помощью раздела файлов. Если вы хотите собрать описанный выше пример пакета, вы можете поместить его в свой файл nuspec:

<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">
</file></file></file></file></file></files>

Поскольку цель публикации символов состоит в том, чтобы позволить другим при пошаговой отладке проходить через ваш код, представляется наиболее целесообразным опубликовать версию кода, предназначенную для отладки, без оптимизации, которая может повлиять на выполнение кода.

В моем случае, если кому-то нужно отладить Noda Time, потому что они там верят »ошибка в Noda Time, ониБыло бы лучше загрузить исходный код (что они могут сделать, конечно). Тем не менее, это 'все еще полезно иметь возможность войти в исходный код Noda Time, просто чтобы посмотреть, чтопродолжается В принципе, я думаю, что есть (по крайней мере) два разных сценария отладки с разными решениями ... Jon Skeet
Да, этос чемпример делает - но яя скорее не получу возможность отлаживать, отвергая желание большинства разработчиков просто запустить релизную версию. Проблема в том, что NuGet неНасколько я могу судить, у меня нет возможности публиковать как релизные, так и отладочные сборки. (Мне также было бы немного неприятно публиковать оба, так как это означает создание еще одного набора конфигураций для подписанных отладочных сборок ...) Jon Skeet
Может быть, все различие между релизом и сборкой отладкиздесь не так? Другими словами, возможно, вместо того, чтобы иметь поддержку NuGet для обоих, Microsoft следует рассмотреть возможность устранения различия и просто опубликовать одну сборку библиотеки (и позволить номеру версии + документация указать, что 'Стабильно и что?нет). gzak
Однако этотакже довольно "закрытый исходный код» склад ума. Я'мы обнаружили, что в мире открытогоОжидается, что он сможет войти в код "стабильные релизы " различных библиотек не потому, что что-то сломано, а потому, что иногда лучшая документация - просто посмотреть, что делает библиотека. gzak
27

Выпуск двоичных пакетов + пакеты содержимого только для nuget.org (или любого другого производственного канала)Отправьте отладочные двоичные пакеты + пакеты контента в канал разработки:на предпосылкена myget.orgна nuget.org как предварительные версии пакетов.Отправьте и выпустите, и отладьте пакеты бинарных + символов в Symbolource.org или любое другое хранилище символов.

В то время как мы'Что касается этого, распространенное заблуждение состоит в том, что сборки выпуска и отладки в .NET действительно сильно отличаются, но я предполагаю, что различие здесь из-за различного кода, который может или не может быть включен в любую сборку, например Debug.Asserts.

Тем не менее, действительно стоит перенести обе конфигурации в SymbolSource, потому что вы просто никогда не знаете, когдаВам нужно будет отладить производственный код. Удаленно в производстве, чтобы сделать его сложнее. Вы'Вам понадобится помощь, которую вы можете получить от своего инструмента, когда это произойдет. Которого я явно никому не желаю.

Есть еще вопрос, который нужно рассмотреть в отношении управления версиями: правильно ли иметь 2 разных пакета (сборка в отладке и в выпуске) с одним номером версии? SymbolSource согласился бы с этим, поскольку он извлекает пакеты и сохраняет двоичные файлы в отдельных ветвях режима сборки, ЕСЛИ ТОЛЬКО NuGet разрешил соответствующим образом помечать пакеты. В настоящее время нет способа определить, находится ли пакет в режиме отладки или в режиме выпуска.

Я понятия не имел, что symbolssource.org существует. Как зуд у меня было много раз необходимость поцарапать, я приветствую это. Remus Rusanu
@TripleEmcoder: Спасибо. Я'Я остановлюсь на выпускной сборке только на данный момент и запишу запрос функциональности вокруг NuGet (кроме всего прочего, документация должна содержать рекомендации по этому поводу :) Jon Skeet
Проблема больше связана с оптимизацией JIT, чем с оптимизацией во время сборки. Поэтому, если вы добавите пакеты в режиме выпуска и порекомендуете использовать COMPLUS_ZapDisable = 1, когда требуется отладка, для меня этого будет достаточно. Тем не менее, NuGet должен разрешать отладку и выпуск вместе. TripleEmcoder
Я имел в виду только то, что вы хотите, чтобы символы были доступны для всех используемых двоичных файлов: если есть как отладочная, так и выпускная сборки, вы 'Я хочу предоставить символы для обоих. Они неКод должен сильно различаться, но они будут различаться по контрольным суммам, что делает невозможной загрузку символов без некоторого взлома. TripleEmcoder

Похожие вопросы