NuGet Package Restore или хранение исходников в VCS
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 26.12.14 11:25
Оценка:
Возник у нас тут спор, что делать с зависимостями и сторонними библиотеками. Разделились на два лагеря: одни за хранение всего и вся в VCS (Mercurial, чтобы быть конкретным), другие -- за то, чтобы полагаться на NuGet Package Restore.

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

Аргументы сторон следующие.

Против NPR:

  • После клонирования репозитория у меня уже самодостаточная копия всего окружения и соединения с Интернетом мне не требуется
  • Я всегда могу выполнить hg update до любой версии и все зависимости гарантированно будут на месте
  • От билд-сервера не требуется ничего особенного (яркий пример: даже TFS нужно настраивать отдельно)
  • Не все зависимости и сторонние библиотеки есть в NuGet
  • Ненадежная работа NPR, особенно в случаях, когда hg update'ишся между древними и новыми версиями
  • Местами интеграция VS и NuGet сломана (игнорируется nuget.config, например)

    За NPR:

  • Бинарники могут сильно раздувать размер репозитория
  • С точки зрения разработчика всё очень просто и "Just Works"
  • Microsoft рекомендует

    Честно сказать, не самые убедительные доводы. У кого какое мнение на этот счет?
  • HgLab: Mercurial Server and Repository Management for Windows
    Re: NuGet Package Restore или хранение исходников в VCS
    От: andyag  
    Дата: 26.12.14 12:48
    Оценка:
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Возник у нас тут спор, что делать с зависимостями и сторонними библиотеками. Разделились на два лагеря: одни за хранение всего и вся в VCS (Mercurial, чтобы быть конкретным), другие -- за то, чтобы полагаться на NuGet Package Restore.


    Н>Я, со своей стороны, придерживаюсь мнения, что все, что нужно для сборки проекта должно храниться в репозитории.


    Однозначно package restore. Есть очень негативный опыт чистки Git-репозитория после того, как в него на протяжении года складывали бинарные зависимости. Репозиторий разросся до нескольких гигабайт и чудовищно тормозил. Настолько, что git pull стал занимать десятки минут после очередного обновления тех самых зависимостей. Наверняка можно было как-то "подкрутить", но это уже костыль. Если есть какие-то причины не доверять официальному репозиторию NuGet, свой поднимается за 2 клика мышкой.
    Re[2]: NuGet Package Restore или хранение исходников в VCS
    От: Нахлобуч Великобритания https://hglabhq.com
    Дата: 26.12.14 13:39
    Оценка:
    Здравствуйте, andyag, Вы писали:

    A>Однозначно package restore. Есть очень негативный опыт чистки Git-репозитория после того, как в него на протяжении года складывали бинарные зависимости. Репозиторий разросся до нескольких гигабайт и чудовищно тормозил. Настолько, что git pull стал занимать десятки минут после очередного обновления тех самых зависимостей.


    Вот перед глазами пример -- проекту 2 года, 5 Мб исходников, объем довольно интенсивно обновляемой директории /lib -- 302 Мб, она же в репозитории -- 33 Мб, весь репозиторий -- 92 Мб. Может быть, не самый большой проект, но и распухания репы тоже не ощущается.

    A>Если есть какие-то причины не доверять официальному репозиторию NuGet, свой поднимается за 2 клика мышкой.


    Вопрос не в недоверии, а в том, что решение с NuGet'ом -- довольно хрупкое и привносит гораздо большие проблемы, чем простое распухание репозитория.
    HgLab: Mercurial Server and Repository Management for Windows
    Re[3]: NuGet Package Restore или хранение исходников в VCS
    От: andyag  
    Дата: 26.12.14 14:10
    Оценка: +2
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Здравствуйте, andyag, Вы писали:


    A>>Однозначно package restore. Есть очень негативный опыт чистки Git-репозитория после того, как в него на протяжении года складывали бинарные зависимости. Репозиторий разросся до нескольких гигабайт и чудовищно тормозил. Настолько, что git pull стал занимать десятки минут после очередного обновления тех самых зависимостей.


    Н>Вот перед глазами пример -- проекту 2 года, 5 Мб исходников, объем довольно интенсивно обновляемой директории /lib -- 302 Мб, она же в репозитории -- 33 Мб, весь репозиторий -- 92 Мб. Может быть, не самый большой проект, но и распухания репы тоже не ощущается.


    Видимо Mercurial более непробиваемый в этом сценарии. Не возьмусь тогда предсказывать, когда у вас случится конец света. В любом случае, бест прэктис — разделять бинарные зависимости и код. В .NET NuGet появился сравнительно недавно, а в той же Java, например, аналогичным инструментам (Maven) уже сто лет в обед, поэтому желания хранить библиотеки вместе с кодом обычно не возникает. Аналогичные подходы используются ещё в куче случаев: у серверного NodeJS есть NPM, у клиентского JS есть Bower, у Ruby есть Gems, у Python — pip. С другой стороны в C++, например, приходится хранить библиотеки рядом с кодом, т.к. у них вообще систем управления зависимостями нет.

    A>>Если есть какие-то причины не доверять официальному репозиторию NuGet, свой поднимается за 2 клика мышкой.

    Н>Вопрос не в недоверии, а в том, что решение с NuGet'ом -- довольно хрупкое и привносит гораздо большие проблемы, чем простое распухание репозитория.

    А опишите в чём по-вашему хрупкость. ИМХО, единственная ситуация, когда всё пропало — это желание поработать с новым проектом (для которого restore ещё не запускался) при отсутствие интернета. Но даже к таким ситуациям можно подготовиться подняв локальный NuGet и сложив туда всё что нужно.
    Re[4]: NuGet Package Restore или хранение исходников в VCS
    От: Нахлобуч Великобритания https://hglabhq.com
    Дата: 26.12.14 14:51
    Оценка: +1 -1
    Здравствуйте, andyag, Вы писали:

    A>А опишите в чём по-вашему хрупкость.


  • Банальное отсутствие интернета -- и оппа! Это самая тривиальная проблема, но все же стоит упомянуть.
  • Я не могу быть до конца уверенным, что в -- нашем или в "публичном" -- NuGet-сервере всегда будут присутствовать все когда-либо использованные в проекте версии библиотек.
  • Нет гарантии, что пакеты не сервере не будут изменены "задним числом".
  • Нужны дополнительные нетривиальные приседания при конфигурировании билд-серверов
  • Опять же, не всё есть в NuGet'ах
  • Не работает Restore для Content File'ов ( https://nuget.codeplex.com/workitem/2094 )
  • Связка Azure и Private Feeds не работает от слова вообще -- некуда пхать логин и пароль
  • Private Feed'ы могут требовать наличия доступа в корпоративную сеть
  • Плюс, для работы Package Restore рекомендуют держать nuget.exe в репозитории с проектом, что как-то странно на фоне заветов "Нет бинарникам в репе!"
  • HgLab: Mercurial Server and Repository Management for Windows
    Re[5]: NuGet Package Restore или хранение исходников в VCS
    От: andyag  
    Дата: 26.12.14 15:50
    Оценка:
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Здравствуйте, andyag, Вы писали:


    A>>А опишите в чём по-вашему хрупкость.


    Н>
  • Банальное отсутствие интернета -- и оппа! Это самая тривиальная проблема, но все же стоит упомянуть.
    Интернет нужен только 1 раз — когда делается собственно restore. После restore интернет не нужен.

    Н>
  • Я не могу быть до конца уверенным, что в -- нашем или в "публичном" -- NuGet-сервере всегда будут присутствовать все когда-либо использованные в проекте версии библиотек.
    Н>
  • Нет гарантии, что пакеты не сервере не будут изменены "задним числом".
    Вы уже подписались на Microsoft, завязавшись на дотнет. Почему именно теперь такие сомнения возникают?

    Н>
  • Нужны дополнительные нетривиальные приседания при конфигурировании билд-серверов
    В Тимсити package restore настраивается в 2 клика мышкой без всяких плясок с бубном.

    Н>
  • Опять же, не всё есть в NuGet'ах
    В этом случае хорошим решением будет поднять свой NuGet и самостоятельно сложить туда нужные штуки. Свои пакеты делаются за 15 минут гугла и ещё 10 минут экспериментов.

    Н>
  • Не работает Restore для Content File'ов ( https://nuget.codeplex.com/workitem/2094 )
    Это проблемы локального масштаба. Если они помешают вашей работе, нужно либо искать обходные пути, либо подождать пока починят. Вообще я пока не встречал инструментов, в которых не было бы багов.

    Н>
  • Связка Azure и Private Feeds не работает от слова вообще -- некуда пхать логин и пароль
    Здесь не могу ничего сказать — видимо какой-то конкретный сценарий, с которым я не сталкивался.

    Н>
  • Private Feed'ы могут требовать наличия доступа в корпоративную сеть
    Серверная часть NuGet — это обычный веб-сервис, поэтому как настроите права доступа, так и будет работать. Если вы смотрите только на официальный подход (это где IIS и возня руками), советую ещё посмотреть на Nexus — у нас замечательно работает.

    Н>
  • Плюс, для работы Package Restore рекомендуют держать nuget.exe в репозитории с проектом, что как-то странно на фоне заветов "Нет бинарникам в репе!"
    Это один единственный бинарник очень маленького размера, который будет меняться не чаще пары раз в год. В Java один из инструментов сборки (Gradle) в приказном порядке рекомендую класть в репозиторий. Но он тоже маленький и проблем не вызывает. Утверждение "Нет бинарникам в репе!" посвящено не тому, что их нельзя туда класть, а тому, что нужно осознавать к чему это может привести. Хранить 1 мегабайт — скорее всего никогда не станет проблемой. Хранить пачку нативных DLL общим объёмом 200 мегабайт и раз в день их все обновлять — скорее всего станет проблемой очень скоро.

    28.12.14 23:16: Удалено модератором из 'Философия программирования'.
    30.12.14 18:46: Восстановлено модератором.
  • Re[6]: NuGet Package Restore или хранение исходников в VCS
    От: Нахлобуч Великобритания https://hglabhq.com
    Дата: 26.12.14 16:13
    Оценка:
    Здравствуйте, andyag, Вы писали:

    Н>Банальное отсутствие интернета -- и оппа! Это самая тривиальная проблема, но все же стоит упомянуть.

    A>Интернет нужен только 1 раз — когда делается собственно restore. После restore интернет не нужен.

    А так же при каждом hg update, когда меняются версии зависимостей. Нечасто, но тем не менее.

    Н>>Я не могу быть до конца уверенным, что в -- нашем или в "публичном" -- NuGet-сервере всегда будут присутствовать все когда-либо использованные в проекте версии библиотек.

    Н>>Нет гарантии, что пакеты не сервере не будут изменены "задним числом".
    A>Вы уже подписались на Microsoft, завязавшись на дотнет. Почему именно теперь такие сомнения возникают?

    Не подменяйте предмет. Вероятность того, что по тем или иным причинам что-то не то станет с пакетами -- ненулевая. Могут отъехать DLL'ки, с Symbol Server'
    а могут пропасть PDB-файлы -- может многое произойти.

    Н>>Нужны дополнительные нетривиальные приседания при конфигурировании билд-серверов

    A>В Тимсити package restore настраивается в 2 клика мышкой без всяких плясок с бубном.

    Да, там попроще. В TFS же тоска-печаль.

    Н>>Опять же, не всё есть в NuGet'ах

    A>В этом случае хорошим решением будет поднять свой NuGet и самостоятельно сложить туда нужные штуки. Свои пакеты делаются за 15 минут гугла и ещё 10 минут экспериментов.

    См. ниже. И в некоторых сов на глобус NuGet никак не натянуть

    Н>>Private Feed'ы могут требовать наличия доступа в корпоративную сеть

    A>Серверная часть NuGet — это обычный веб-сервис, поэтому как настроите права доступа, так и будет работать. Если вы смотрите только на официальный подход (это где IIS и возня руками), советую ещё посмотреть на Nexus — у нас замечательно работает.

    Например, сервер NuGet доступен только извне. Требуется VPN.
    HgLab: Mercurial Server and Repository Management for Windows
    Re: NuGet Package Restore или хранение исходников в VCS
    От: Sharov Россия  
    Дата: 26.12.14 16:25
    Оценка: -1
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Возник у нас тут спор, что делать с зависимостями и сторонними библиотеками. Разделились на два лагеря: одни за хранение всего и вся в VCS (Mercurial, чтобы быть конкретным), другие -- за то, чтобы полагаться на NuGet Package Restore.


    А я все бинарники всегда кладу в git. А про NuGet Package Restore узнал только сейчас.
    Кодом людям нужно помогать!
    Re: NuGet Package Restore или хранение исходников в VCS
    От: AlexRK  
    Дата: 26.12.14 16:33
    Оценка:
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Возник у нас тут спор, что делать с зависимостями и сторонними библиотеками. Разделились на два лагеря: одни за хранение всего и вся в VCS (Mercurial, чтобы быть конкретным), другие -- за то, чтобы полагаться на NuGet Package Restore.


    Я абсолютно всё нужное храню в своей системе контроля версий. Код, бинарники, ресурсы — всё.
    Re[2]: NuGet Package Restore или хранение исходников в VCS
    От: Слава  
    Дата: 26.12.14 17:18
    Оценка: -2 :)
    Здравствуйте, andyag, Вы писали:

    A>Однозначно package restore. Есть очень негативный опыт чистки Git-репозитория после того, как в него на протяжении года складывали бинарные зависимости. Репозиторий разросся до нескольких гигабайт и чудовищно тормозил.


    Это потому что гит таки убог.
    Re[3]: NuGet Package Restore или хранение исходников в VCS
    От: andyag  
    Дата: 26.12.14 19:31
    Оценка:
    Здравствуйте, Слава, Вы писали:

    С>Здравствуйте, andyag, Вы писали:


    A>>Однозначно package restore. Есть очень негативный опыт чистки Git-репозитория после того, как в него на протяжении года складывали бинарные зависимости. Репозиторий разросся до нескольких гигабайт и чудовищно тормозил.

    С>Это потому что гит таки убог.

    А есть какой-то VCS, официально утверждающий, что хранение больших бинарных файлов для него не проблема, как и хранение маленьких текстовых?
    Re[4]: NuGet Package Restore или хранение исходников в VCS
    От: iZEN СССР  
    Дата: 26.12.14 19:36
    Оценка: :)
    Здравствуйте, andyag, Вы писали:


    A>А есть какой-то VCS, официально утверждающий, что хранение больших бинарных файлов для него не проблема, как и хранение маленьких текстовых?


    Да — CVS.
    Re[5]: NuGet Package Restore vs. VCS
    От: Qbit86 Кипр
    Дата: 27.12.14 10:01
    Оценка: 3 (1) +1
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Банальное отсутствие интернета -- и оппа!


    Так без интернета ты и удалённый репозиторий не склонируешь. Если же у тебя центральный репозиторий содержится локально, то и папку с пакетами можно держать локально. Версионирование библиотек — специфическая, частная задача; не очень практично для её решения использовать инструменты версионирования общего назначения (мерджи, диффы, ветки, etc.)
    Глаза у меня добрые, но рубашка — смирительная!
    Re[5]: NuGet Package Restore или хранение исходников в VCS
    От: andyag  
    Дата: 27.12.14 10:12
    Оценка:
    Здравствуйте, iZEN, Вы писали:

    ZEN>Здравствуйте, andyag, Вы писали:



    A>>А есть какой-то VCS, официально утверждающий, что хранение больших бинарных файлов для него не проблема, как и хранение маленьких текстовых?


    ZEN>Да — CVS.


    Вы используете CVS?
    Re[7]: NuGet Package Restore или хранение исходников в VCS
    От: andyag  
    Дата: 27.12.14 10:34
    Оценка:
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Здравствуйте, andyag, Вы писали:


    Н>>Банальное отсутствие интернета -- и оппа! Это самая тривиальная проблема, но все же стоит упомянуть.

    A>>Интернет нужен только 1 раз — когда делается собственно restore. После restore интернет не нужен.
    Н>А так же при каждом hg update, когда меняются версии зависимостей. Нечасто, но тем не менее.

    Я не понимаю ваши доводы. Если вы можете скачать код, вы с таким же успехом можете и бинарные зависимости скачать в случае корпоративного/проектного NuGet репозитория. Если же код лежит где-то на BitBucket, а интернет кончился, проблемы начнутся ещё на этапе hg update
    Опишите вашу ситуацию чуть более конкретно, очень может быть, что мои утверждения для вашего случая реально полный бред. Например какое-то закрытое предприятие, где один общий компьютер с доступом к интернет в DMZ.

    Н>>>Я не могу быть до конца уверенным, что в -- нашем или в "публичном" -- NuGet-сервере всегда будут присутствовать все когда-либо использованные в проекте версии библиотек.

    Н>>>Нет гарантии, что пакеты не сервере не будут изменены "задним числом".
    A>>Вы уже подписались на Microsoft, завязавшись на дотнет. Почему именно теперь такие сомнения возникают?
    Н>Не подменяйте предмет. Вероятность того, что по тем или иным причинам что-то не то станет с пакетами -- ненулевая. Могут отъехать DLL'ки, с Symbol Server'
    Н>а могут пропасть PDB-файлы -- может многое произойти.

    Ни в коем случае не пытался подменить предмет разговора. Дело в том, что когда вы делаете выбор в пользу какой-то платформы/языка, вы автоматически подписываетесь на существующие best practices. В ситуации с .NET ("в мире .NET"), когда вы хотите использовать сторонние библиотеки, вы используете NuGet. Это просто подход по умолчанию — со всеми рисками, плюсами и минусами. Если у вас есть причины не использовать подход по умолчанию, не используйте его. В этом случае непонятен смысл топика.

    Н>>>Опять же, не всё есть в NuGet'ах

    A>>В этом случае хорошим решением будет поднять свой NuGet и самостоятельно сложить туда нужные штуки. Свои пакеты делаются за 15 минут гугла и ещё 10 минут экспериментов.
    Н>См. ниже. И в некоторых сов на глобус NuGet никак не натянуть

    Сорри — не смог прочитать что вы написали.

    Н>>>Private Feed'ы могут требовать наличия доступа в корпоративную сеть

    A>>Серверная часть NuGet — это обычный веб-сервис, поэтому как настроите права доступа, так и будет работать. Если вы смотрите только на официальный подход (это где IIS и возня руками), советую ещё посмотреть на Nexus — у нас замечательно работает.
    Н>Например, сервер NuGet доступен только извне. Требуется VPN.

    Доступ к своему NuGet должен быть таким же, как доступ к репозиторию с кодом (опять же — по умолчанию, если нет причин делать иначе).
    Re[6]: NuGet Package Restore или хранение исходников в VCS
    От: iZEN СССР  
    Дата: 27.12.14 10:36
    Оценка:
    Здравствуйте, andyag, Вы писали:

    A>Вы используете CVS?


    Нет, не использую.
    Re[7]: NuGet Package Restore или хранение исходников в VCS
    От: andyag  
    Дата: 27.12.14 11:16
    Оценка:
    Здравствуйте, iZEN, Вы писали:

    ZEN>Здравствуйте, andyag, Вы писали:


    A>>Вы используете CVS?


    ZEN>Нет, не использую.


    Я тоже. Как думаете — почему?
    Re[8]: NuGet Package Restore или хранение исходников в VCS
    От: iZEN СССР  
    Дата: 27.12.14 11:51
    Оценка:
    Здравствуйте, andyag, Вы писали:

    A>Я тоже. Как думаете — почему?


    Мне без надобности. А вам — не знаю.
    Re: NuGet Package Restore или хранение исходников в VCS
    От: Wolverrum Ниоткуда  
    Дата: 27.12.14 16:05
    Оценка:
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Возник у нас тут спор

    У нас он решен компромиссно. Бинарные зависимости хранятся в виде nuget, исходный же код хранится в VCS: это и гибкое распределение трафика между серверами, и нормальный diff между ревизиями.

    Н>Я, со своей стороны, придерживаюсь мнения, что все, что нужно для сборки проекта должно храниться в репозитории.

    Н>После клонирования репозитория у меня уже самодостаточная копия всего окружения и соединения с Интернетом мне не требуется
    Мнение добротное для маленьких проектиков, и морально устаревшее в эпоху безлимита / интранетов.

    Н>Я всегда могу выполнить hg update до любой версии и все зависимости гарантированно будут на месте

    Иррелевантно.

    Н>От билд-сервера не требуется ничего особенного (яркий пример: даже TFS нужно настраивать отдельно)

    А вот в TeamCity интеграция с nuget изкаробки Что, конечно же не отменяет плясок с ТФС Тем не менее, тоже не аргумент ввиду того, что с минимальными (нет, серьезно!) усилиями выкачку бинарных зависимостей можно встроить в билдскрипт или проект.
    Из практики: Package Restore бесполезен.

    Н>Не все зависимости и сторонние библиотеки есть в NuGet

    О_о Что мешает создать свои пакеты для своих проектов в своем (см. выше) репозитории?! Принципиальная опенсорсность проекта разве что?

    Н>Ненадежная работа NPR, особенно в случаях,

    Н>когда hg update'ишся между древними и новыми версиями
    Н>Местами интеграция VS и NuGet сломана (игнорируется nuget.config, например)
    Есть кой-какие глюки и с nuget, но не настолько регулярные и болезненные, чтобы стать аргументом "Против".
    Из практики: интеграция вообще нафиг не нужна.

    Н>Бинарники могут сильно раздувать размер репозитория

    Этот аргумент будет недооценен теми, у кого в зависимостях не встречалось чего-нибудь типа дистрибудива Castle или там EL5 с исходниками.

    Н>С точки зрения разработчика всё очень просто и "Just Works"

    В целом так и есть.

    Н>Microsoft рекомендует

    Не аргумент

    Н>Честно сказать, не самые убедительные доводы

    Согласен, доводы были приведены совершенно неубедительные, и, скорее демонстрирующие недостаточное знание матчасти.
    Re[3]: NuGet Package Restore или хранение исходников в VCS
    От: Wolverrum Ниоткуда  
    Дата: 27.12.14 16:29
    Оценка:
    Здравствуйте, Нахлобуч, Вы писали:

    Н>Вот перед глазами пример -- проекту 2 года, 5 Мб исходников, объем довольно интенсивно обновляемой директории /lib -- 302 Мб, она же в репозитории -- 33 Мб, весь репозиторий -- 92 Мб. Может быть, не самый большой проект, но и распухания репы тоже не ощущается.



    Все-таки, ваш опыт не включает еще ничего, кроме маленьких проектиков
    А вот у меня перед глазами одна компонента подсистемы одной из систем, в состоянии "до компиляции" весит что-то около гигабайта, из которых метров 100 — исходные коды...
    Понятно, боюсь тогда, что мой посыл
    Автор: Wolverrum
    Дата: 27.12.14
    не будет воспринят с должным пониманием, так как у нас с вами сильно разные "весовые категории".

    Н>Вопрос не в недоверии, а в том, что решение с NuGet'ом -- довольно хрупкое и привносит гораздо большие проблемы, чем простое распухание репозитория.

    Все-таки бенефиты nuget на мелких масштабах сложно оценить по достоинству.
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.