Как справиться с внешними зависимостями в проекте с открытым исходным кодом?

23

Когда кто-то пишет проект с открытым исходным кодом, использует Google Code или GitHub и хочет использовать такую ​​библиотеку, как Lua, как это сделать?

  • Должна ли зависимость быть включена в хранилище?
  • Должна ли зависимость быть построена из того же сценария сборки, что и остальная часть проекта, или из отдельного сценария сборки?

Учитывая, что библиотека не требует установки перед компиляцией.

rightfold
источник

Ответы:

10

Я очень рекомендую прочитать документацию Git по подмодулям ; это решает эту проблему, предполагая, что все ваши источники используют Git. Если они этого не делают, вы всегда можете настроить git-репо для интеграции. Усилия тривиальны, а отдача значительна.

Брайан Эйджи
источник
1
Подмодули - это довольно слабая реализация зависимостей в общем и в Git. По крайней мере, git поддерево - намного лучшая итерация
Lazy Badger
4
-1 Пожалуйста, включите детали ссылки в свой ответ, иначе ответ будет бесполезным, когда ссылка исчезнет - как это происходит сейчас. К сожалению, у меня пока нет представителя, чтобы понизить голос
Precastic
@Precastic: если вы гуглите текст ссылки, вы сразу попадете на новую страницу; Я не уверен, насколько более информативным это может быть.
Брайан Эйджи
1
Пожалуйста, прочитайте stackoverflow.com/help/how-to-answer - в частности, раздел под названием «Обеспечить контекст для ссылок» (цитата: «Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен от сети). . ")
Precastic
17

Должна ли зависимость быть включена в хранилище?

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

Должна ли зависимость быть построена из того же сценария сборки, что и остальная часть проекта, или из отдельного сценария сборки?

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

А почему бы не предоставить опции в скрипте сборки? Простой переключатель, чтобы выбрать, следует ли компилировать зависимости или нет. Если пользователь также решил скомпилировать зависимости, просто вызовите свои собственные сценарии сборки из сценария сборки вашего продукта. Таким образом, пользователь может вызвать сценарии сборки зависимостей вручную или выбрать создание полной сборки всего. Но я бы просто поставил зависимости в виде двоичных файлов, если нет веской причины для их компиляции из исходных текстов. Я думаю, что в мире Open Source некоторые лицензии требуют, чтобы вы распространяли источники вместе с вашим продуктом, но это не значит, что вы не можете предварительно их скомпилировать.

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

сокол
источник
1
@tdammers: Я знаю, если вы устанавливаете программное обеспечение в системе Linux, менеджер пакетов сделает всю работу за вас. Но для этого требуется подключение к Интернету, и пакет должен быть в определенном формате, и я прямо заявил, что инструменты автоматизации могут помочь с этим. Например, вы не можете использовать такую ​​систему для инструментов с открытым исходным кодом .NET. Если вы посмотрите на инструменты sourceforge, такие как NHibernate или Castle Windsor, то увидите, что все зависимости включены в двоичные файлы. И это единственно разумная вещь.
Сокол
1
@tdammers: Кстати, сегодня я должен установить OpenOffice SDK на Linux-машину. Поскольку SDK не может быть установлен через менеджер пакетов, я взял RPM с веб-сайта. Как вы думаете, какое первое сообщение я получаю при попытке запустить rpm --install? ошибка: сбой зависимостей: ooobasis3.3-core01 требуется ooobasis3.3-sdk-3.3.0-9567.x86_64 - О, РАДОСТЬ !
Сокол
2
@tdammers: вы правы, но в случае я хотел бы иметь такую ​​избыточность, если бы установка и установка были простыми. И когда вы хотите увидеть ад зависимостей, взгляните на каталог / usr / lib. Там есть все: избыточность, подрывная деятельность, и вы даже не знаете, какая программа использует какие библиотеки. Конечно, пусть менеджер пакетов справится с этим! Но что, если менеджер пакетов не может справиться с этим, как в случае с открытым офисом, о котором я упоминал. Это в основном означает, что вы облажались, и вам будет сложно установить что-либо.
Сокол
2
@tdammers: И чем больше я думаю об этом и своем опыте: я даже не могу сосчитать, сколько раз мне пришлось создавать символические ссылки в этом каталоге только из-за сбоя зависимостей или из-за того, что какая-то программа отказывалась запускаться, даже если она была установлена ​​через менеджер пакетов. Может быть, сейчас ситуация стала лучше, но зачастую это все еще тяжелая работа, чтобы заставить некоторые вещи работать. Проблемы, которых можно было бы избежать, если бы они просто отправили зависимость с приложением. Я с удовольствием заплачу несколько МБ дополнительного пространства, чтобы избежать этой проблемы.
Сокол
2
@tdammers: свидетелями этой проблемы являются бесчисленные учебники в Интернете о том, как установить конкретную программу в конкретной системе Linux.
Сокол
3

Это может относиться или не относиться к вашему варианту использования, но мы работаем над тем, чтобы в каждой ветви была папка «Ссылки». Мы размещаем сторонние библиотеки DLL здесь. Это вызывает большое дублирование относительно неизменных двоичных файлов в управлении исходным кодом, но хранилище стоит дешево, и в любой момент каждая ветка и тег имеют именно те зависимости (и версию!), Которые они ожидают.

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


Что касается ответа на ваш вопрос сейчас, когда я перечитал его, сделайте то же самое и просто упомяните, что ваш проект использует предварительно скомпилированную версию Lua 1.3.5.

Брайан Бетчер
источник
1

Должна ли зависимость быть включена в хранилище?

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

Должна ли зависимость быть построена из того же сценария сборки, что и остальная часть проекта, или из отдельного сценария сборки?

Не имеет значения вообще. Вы можете выбрать любой метод в соответствии с вашими требованиями (скорость / прозрачность / управляемость / и т. Д.)

Ленивый Барсук
источник
0

Будучи магазином Eclipse, мы только начали использовать Buckminster для управления процессом сборки / сборки / развертывания.

Нашей первой стадией было вытащить все наши существующие зависимые библиотеки и позволить Бакминстеру позаботиться о материализации правильных. Это значительно ускоряет и сокращает развертывание.

Следующим шагом будет перемещение нашего монолитного svnхранилища в серию модульных gitхранилищ.

Я не знаю, насколько хорошо Бакминстер интегрировался бы с gitподмодулями (или ртутными подотчетами в этом отношении), но хорошо, что Бакминстер не зависит от VCS, используемого для любого данного компонента.

Марк Бут
источник