Як би вирішити зовнішні залежності у проекті з відкритим кодом?


23

Коли хто пише проект з відкритим кодом і використовує Google Code або GitHub і хоче використовувати бібліотеку на зразок Lua, як це робити?

  • Чи слід включати залежність до сховища?
  • Чи має бути залежність побудована з того самого сценарію збірки, що й решта проекту, або з окремого сценарію збірки?

Враховуючи, що бібліотеці не потрібна установка перед компіляцією.

Відповіді:


10

Я б дуже рекомендував ознайомитися з документацією Git про підмодулі ; він вирішує цю проблему, припускаючи, що всі ваші джерела використовують Git. Якщо цього немає, ви завжди можете встановити git repo з метою інтеграції. Зусилля банальні, а окупність - значна.


1
Підмодулі є досить слабкою реалізацією управління залежностями спільно та в Git. Принаймні, git subtree - це набагато краща ітерація
Lazy Badger

4
-1 Будь ласка, включіть у відповідь деталі посилання, інакше відповідь марна, коли посилання зникає - як це зараз. На жаль, у мене поки що немає відповіді, щоб сказати,
Predcastic

@Precastic: Якщо ви перейдете в Google текст посилання, він перенесе вас прямо на нову сторінку; Я не впевнений, наскільки може бути більш інформативним.
Брайан Агей

1
Будь ласка, прочитайте stackoverflow.com/help/how-to-answer - зокрема розділ під назвою "Надайте контекст для посилань" (цитата: "Завжди цитуйте найрелевантнішу частину важливої ​​посилання, на випадок, якщо цільовий сайт недоступний або виходить постійно в режим офлайн. . ")
Прекастичний

17

Чи слід включати залежність до сховища?

Я думаю, що залежність завжди повинна бути включена у сховище до тих пір, поки включення їх не порушує жодних умов використання. Мало що дратує, ніж потрібно вручну знайти правильні версії правильних залежностей, перш ніж ви зможете скласти збірку. Звичайно, це легко, якщо у вас є автоматизовані інструменти для цього, які можуть знайти та завантажити потрібну залежність, але що робити, якщо ви зараз не підключені до Інтернету або сервер не працює або проект залежності було повністю припинено та прийнято в автономному режимі? Завжди включайте залежності, якщо можливо.

Чи має бути залежність побудована з того самого сценарію збірки, що й решта проекту, або з окремого сценарію збірки?

Якщо немає поважних причин для компіляції з джерела, використовуйте попередньо складені версії.

А чому б не надати варіанти в сценарії збірки? Простий перемикач, щоб вибрати, чи слід також складати залежності чи ні. Якщо користувач також вирішив скласти залежності, тоді просто запускайте власні сценарії побудови із сценарію збірки вашого продукту. Таким чином, користувач може викликати сценарії збирання залежностей вручну або вибрати, щоб створити повне складання всього. Але я б просто поставив залежності як бінарні файли, якщо немає вагомих причин складати їх із джерел. Я думаю, що у світі з відкритим кодом деякі ліцензії вимагають від вас розповсюдження джерел разом із вашим продуктом, але це не означає, що ви не можете їх докомпілювати.

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


1
@tdammers: Я знаю, якщо ваше встановлення програмного забезпечення в системі Linux менеджер пакунків зробить всю роботу за вас. Але для цього потрібне підключення до Інтернету, і пакет повинен бути у певному форматі, і я прямо заявив, що засоби автоматизації можуть допомогти у цьому. Ви не можете використовувати таку систему, наприклад, для інструментів з відкритим кодом .NET. Якщо ви подивитесь на такі джерела інструментів, як NHibernate або Castle Windsor, то побачите, що всі залежності включені як бінарні файли. І це єдине розумне робити.
Сокіл

1
@tdammers: Навпаки, сьогодні я маю встановити SDK OpenOffice на машину 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-файли. Це спричиняє багато дублювання відносно незмінних бінарних файлів у керуванні джерелами, але зберігання є дешевим, і в будь-який момент кожна гілка та тег мають саме такі залежності (і версію!), Яких вона очікує.

Ми попередньо компілюємо залежності самостійно і переміщуємо складені бінарні файли у цю папку. Наша власна спільна бібліотека також трактується таким чином. Таким чином, ця сама техніка працює для попередньо складених власницьких бібліотек, відкритих джерел і власних бібліотек.


Що стосується насправді відповіді на ваше запитання зараз, коли я його перечитав, зробіть те саме, і лише зауважте, що у вашому проекті використовується попередньо складена версія 1.3.5 Lua.


1

Чи слід включати залежність до сховища?

На нього можна посилатись у сховищі (будь-яким придатним для методу SCM), якщо ця залежність є невід'ємною частиною продукту (джерельна залежність), а не бінарною залежністю, яку можна вирішити окремо

Чи має бути залежність побудована з того самого сценарію збірки, що й решта проекту, або з окремого сценарію збірки?

Це зовсім не має значення. Ви можете віддати перевагу будь-якому методу відповідно до ваших вимог (швидкість / прозорість / керованість / тощо)


0

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

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

Наступним кроком буде переміщення нашого монолітного svnсховища до серії модульних gitсховищ.

Я не знаю, наскільки добре бакмінстер міг би інтегруватися з gitпідмодулями (або ртутними підрепортами з цього приводу), але приємно, що бакмінстер є агностичним щодо VCS, який використовується для будь-якого компонента.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.