Должны ли мы включить папку Nuget PACKAGE в систему контроля версий?

68

я бы хотел знать

В проекте C # или VB.NET мы должны включить папку PACKAGE (папку пакета nugget, которая создается в корне моего проекта, содержащего файлы nupkg и другое содержимое) в наш репозиторий контроля версий (например, Git).

Бастьен Вандамме
источник
Абсолютно Да , потому что эти файлы являются частью вашего кода, и ваш проект не будет построен без них.
Sharky
Я задал похожий вопрос по SO довольно давно. Вы также можете посмотреть ответы здесь: stackoverflow.com/questions/1710027/… :)
cwap
Интересно, почему никто в мире Maven не спрашивает, «должны ли мы включать сторонних библиотек в систему контроля версий». Найдите какой-то серьезный контраргумент для НЕ совершения библиотек, хотя и не очень убедительно.
Hoàng Long

Ответы:

28

Прошло много времени, и NuGet изменился, поэтому вот новый ответ.

NuGet больше не создает папку пакетов внутри вашей исходной структуры. Вместо этого есть один в вашем пользовательском каталоге ( %HOME%\.nuget\packagesесли быть точным), куда он помещает все загружаемые пакеты, и проекты просто ссылаются на них.

Итак, простой ответ в эти дни - нет, вы не должны. Если вы беспокоитесь о пакетах, которые нужно удалить, вам следует создать локальное зеркало NuGet, резервное копирование которого производится отдельно.

Себастьян Редл
источник
6
Я на VS2015 (учтите, что VS2017 был выпущен всего за 3 дня до того, как вы написали этот ответ), и папка пакета присутствует в корне моего решения. Мне интересно, как и когда изменился NuGet.
Teejay
NuGet изменился с версией 3, которая была выпущена вне группы в течение периода VS2015.
Себастьян Редл
Я только что проверил на своем рабочем компьютере и пакеты, где вы упомянули. Но на моем домашнем компьютере они находятся в каталоге проекта. Оба находятся на VS2015 (professional @ work, community @ home), а домашняя - совсем недавно ... Это странно.
Teejay
12
Только что установил VS 2017 на прошлой неделе, вчера создал новый проект и в моем проекте есть каталог с пакетами.
Джереми
2
Что ты делаешь для КИ? Вы делаете это Загружать все пакеты nuget снова и снова? (TBH: я сам, очень неясно, каково мое мнение)
Томер W
50

По-разному.

Посмотрите ответ Барта ван Ингена Шенау, чтобы определить, можно ли packagesвообще игнорировать папку.

По сути: да, NuGet спроектирован так, что вы можете игнорировать packagesпапку, и NuGet будет извлекать все из Интернета, если он отсутствует.

Но стоит ли это игнорировать? Я говорю: это зависит.
ИМО, это вопрос "можем ли мы продолжать работать, если репозиторий пакетов недоступен" (будь то временно или постоянно)

Для моих личных проектов OSS у меня packagesпапка игнорируется во всех них.
Когда nuget.org не в сети, я просто подожду и продолжу еще один день.

Но это что-то другое на работе.
Конечно, вы, вероятно, все еще имеете пакеты локально на каком-то компьютере, но экономит ли вам место, которое стоит хлопот, когда ваши сборки ломаются, потому что ваш сервер сборки не может достичь nuget.org?

Мы решили, что пространство дешево, и нам не нужны хлопоты, поэтому мы передаем packagesпапку в систему контроля версий.

Кристиан Шпехт
источник
1
Как часто nuget.org недоступен?
Бартош
4
Вероятно, не очень часто. Но, возможно, я должен был сказать «недоступен» вместо «офлайн». Несколько лет назад на работе произошел инцидент, когда экскаватор случайно перерезал интернет-кабель к нашему зданию. На ремонт ушло больше суток. Если бы мы полагались на nuget.org, мы бы не смогли построить наши проекты. (да, я знаю, в настоящее время NuGet кэширует пакеты локально ... но не тогда)
Кристиан Шпехт
Я скажу, что время сборки намного больше, когда вы не регистрируете папку с пакетами, потому что она тратит большую часть времени на сборку пакетов во время восстановления пакетов.
AaronLS
29

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

Другими словами, если вы можете выбросить папку PACKAGE и ее содержимое, не влияя на ваши возможности, продолжить работу над проектом (сборка может занять больше времени, но вам не нужно искать и устанавливать что-либо самостоятельно), тогда папка может быть в безопасности из хранилища.
Если в папке содержатся сторонние пакеты, загрузка которых может занять много времени или которые могут стать недоступными, это может быть причиной для добавления их в ваш репозиторий в любом случае.

Барт ван Инген Шенау
источник
20
Я хотел бы добавить, что вы должны хранить версию любого стороннего кода, используемого в проекте, в безопасном месте, на случай, если сторонний проект удален, сайт, на котором он размещен, исчез и т. Д. Хорошее место для этого есть в вашем хранилище контроля версий. , Это также дает вам возможность откатиться к предыдущей версии этого кода, если это необходимо.
согнут