Хранение сторонних библиотек в системе контроля версий

Должны ли библиотеки, на которые опирается приложение, храниться в системе контроля версий? Одна часть меня говорит, что должен, а другая часть говорит "нет". Неправильно добавлять библиотеку в 20 Мб, которая затмевает все приложение только потому, что вы полагаетесь на несколько функций из него (хотя и довольно сильно). Стоит ли просто хранить jar/dll или, может быть, даже распределенный zip/tar проекта?

Что делают другие люди?

17 ответов

Решение

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

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

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

@Stu Thompson упоминает хранение документации и т. Д. В системе контроля версий. В более крупных проектах я сохранял всю нашу папку "клиенты" в системе контроля версий, включая счета-фактуры / счета / протоколы заседаний / технические характеристики и т. Д. Весь матч стрелял. Хотя, хм, не забудьте сохранить их в отдельном хранилище от того, которое вы сделаете доступным для: других разработчиков; клиент; ваш "вид из браузера"... кашель...:)

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

Изменить на 2017 год: Этот ответ не очень хорошо стареет:-). Если вы по-прежнему используете что-то старое, например, ant или make, вышеупомянутое применимо Если вы используете что-то более современное, такое как maven или graddle (или Nuget на.net, например), с управлением зависимостями, вы должны запустить сервер управления зависимостями, в дополнение к вашему серверу контроля версий. Пока у вас есть хорошие резервные копии обоих, и ваш сервер управления зависимостями не удаляет старые зависимости, вы должны быть в порядке. Пример сервера управления зависимостями см., Например, среди прочего Sonatype Nexus или JFrog Artifcatory.

Не храните библиотеки; строго говоря, они не являются частью вашего проекта и бесполезно занимают место в вашей системе контроля версий. Однако используйте maven (или Ivy для сборок ant), чтобы отслеживать, какие версии внешних библиотек использует ваш проект. Вы должны запустить зеркало репо в вашей организации (которое резервируется), чтобы убедиться, что у вас всегда есть зависимости под вашим контролем. Это должно дать вам лучшее из обоих миров; внешние банки за пределами вашего проекта, но все еще надежно доступны и централизованно доступны.

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

Никогда не храните ваши сторонние двоичные файлы в системе контроля версий. Системы контроля версий - это платформы, которые поддерживают одновременный обмен файлами, параллельную работу, объединение усилий и историю изменений. Контроль версий не является FTP-сайтом для двоичных файлов. Сторонние сборки НЕ являются исходным кодом; они меняются, может быть, дважды за SDLC. Желание очистить ваше рабочее пространство, вытащить все из системы контроля версий и сборки не означает, что сторонние сборки должны быть заблокированы в системе контроля версий. Вы можете использовать сценарии сборки для управления извлечением сторонних сборок с сервера распространения. Если вас беспокоит контроль над тем, какая ветвь / версия вашего приложения использует конкретный сторонний компонент, то вы можете также контролировать это с помощью сценариев сборки. Люди упоминали Maven для Java, и вы можете сделать что-то подобное с MSBuild для.Net.

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

Если вы не сохраняете их в репозитории, абсолютно необходимо как-то их заархивировать и создать версии, а ваша система сборки должна знать, как их получить. Многие люди в мире Java, кажется, используют Maven для автоматической загрузки зависимостей, но я не использовал I, поэтому не могу рекомендовать "за" или "против".

Хорошим вариантом может быть сохранение отдельного хранилища сторонних систем. Если вы работаете в Subversion, вы можете использовать внешнюю поддержку Subversion, чтобы автоматически извлекать библиотеки из другого хранилища. В противном случае я бы предложил сохранить внутренний анонимный FTP (или аналогичный) сервер, с которого ваша система сборки может автоматически получать требования. Очевидно, вы захотите убедиться, что вы сохранили все старые версии библиотек и сделали все резервные копии вместе с вашим хранилищем.

У меня есть репозиторий, похожий на интранет Maven, в котором хранятся все сторонние библиотеки (не только библиотеки, но и их соответствующие исходные коды с документацией, Javadoc и всем остальным). Причина в следующем:

  1. зачем хранить файлы, которые не изменяются, в системе, специально предназначенной для управления файлами, которые изменяются?
  2. это резко закрепить кассы
  3. каждый раз, когда я вижу, что "что-то.

Я предпочитаю хранить сторонние библиотеки в репозитории зависимостей (например, Artifactory с Maven), а не хранить их в Subversion.

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

Я помещаю все, кроме JDK и IDE в систему контроля версий.

Философия Тони здорова. Не забудьте сценарии создания базы данных и сценарии обновления структуры данных. До выхода вики я даже хранили нашу документацию в системе контроля версий.

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

Используйте подпроекты git и либо ссылайтесь на основной репозиторий git сторонней библиотеки, либо (если он отсутствует) создайте новый репозиторий git для каждой необходимой библиотеки. Нет никаких причин, по которым вы ограничены только одним git-репозиторием, и я не рекомендую вам использовать чужой проект в качестве своего собственного каталога.

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

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

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

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

Храните сторонние библиотеки в системе контроля версий, чтобы они были доступны, если вы проверяете свой код в новой среде разработки. Любые команды "include" или build, которые могут быть в сценариях сборки, также должны ссылаться на эти "локальные" копии.

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

Храните библиотеки! Хранилище должно быть моментальным снимком того, что требуется для создания проекта в любой момент времени. Поскольку для проекта требуются разные версии внешних библиотек, вам необходимо обновить / зарегистрировать более новые версии этих библиотек. Таким образом, вы сможете получить все нужные версии для старого снимка, если вам нужно будет установить более раннюю версию и т. Д.

Лично то, что я сделал и до сих пор любил результаты, - это хранить библиотеки в отдельном репозитории, а затем ссылаться на каждую библиотеку, которая мне нужна в других моих репозиториях, с помощью функции Subversion svn:externals. Это хорошо работает, потому что я могу хранить версионные копии большинства наших библиотек (в основном управляемых сборок.NET) в системе контроля версий, не увеличивая при этом размер нашего основного хранилища исходного кода. Хранение сборок, хранящихся в репозитории таким способом, делает так, чтобы на сервере сборки не было необходимости их устанавливать для сборки. Я скажу, что получить успешную сборку в отсутствие установленной Visual Studio было довольно непросто, но теперь, когда она заработала, мы довольны.

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

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

Храните все, что вам нужно, чтобы построить проект, чтобы вы могли проверить его и построить, ничего не делая.

(и, как кто-то, кто испытал боль - пожалуйста, сохраните копию всего необходимого, чтобы установить элементы управления и работать на платформе dev. Однажды я получил проект, который можно было собрать, но без установочного файла и ключей reg, вы не могли не вносить никаких изменений в сторонний макет управления. Это было весело переписать)

Другие вопросы по тегам