Зберігання сторонніх бібліотек у контролі джерел


83

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

Що роблять інші люди?

Відповіді:


28

Окрім того, що у вашому сховищі є сторонні бібліотеки, варто робити це таким чином, щоб було легко відстежувати та об’єднувати майбутні оновлення бібліотеки (наприклад, виправлення безпеки тощо). Якщо ви використовуєте Subversion, використання належної гілки постачальника варто.

Якщо ви знаєте, що в пеклі буде холодний день, перш ніж ви будете модифікувати код третьої сторони, тоді (як сказав @Matt Sheppard) зовнішній сенс має сенс і дає вам додаткову перевагу, завдяки якій стає дуже легко перейти найновіша версія бібліотеки, якщо оновлення безпеки або обов’язкова нова функція роблять це бажаним.

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

@Stu Thompson згадує про зберігання документації тощо у контролі джерел. У більших проектах я зберігав цілу папку "клієнти" у контролі джерел, включаючи рахунки / рахунки / протоколи засідань / технічні характеристики тощо. Хоча, пам’ятайте, пам’ятайте зберігати їх у РОЗДІЛЬНОМ сховищі від того, який ви зробите доступним для: інших розробників; клієнт; ваш "вигляд джерела браузера" ... кашель ... :)


3
А як щодо того, коли сторонні бібліотеки повинні мати ліцензію на кожній робочій станції розробників через інсталятор?
jpierson

+1, але як щодо розподілених SC, таких як git або hg? PS: найкраща піктограма аватари SO .... коли-небудь
slf

@slf Два способи розгалуження постачальників у git у цій статті: happygiraffe.net/blog/2008/02/07/vendor-branches-in-git
MattCan

48

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

Редагувати за 2017 рік: Ця відповідь погано постаріла :-). Якщо ви все ще використовуєте щось старе, як мураха або макіяж, вищезазначене все ще стосується. Якщо ви використовуєте щось більш сучасне, наприклад maven або graddle (або Nuget на .net, наприклад), з управлінням залежностями, вам слід запустити сервер управління залежностями, на додаток до вашого сервера управління версіями. Поки у вас є хороші резервні копії обох, і ваш сервер управління залежностями не видаляє старі залежності, ви повинні бути в порядку. Приклад сервера керування залежностями див., Наприклад, Sonatype Nexus або JFrog Artifcatory , серед багатьох інших.


18
То чи включає це, скажімо, Eclipse або Visual Studio?
jpierson

2
немає. не знаю про vs, але мені не потрібно eclipse для побудови проектів, а лише правильний JDK. Останнім часом це стало набагато легше застосувати за допомогою рішення Гудзона / Дженкінса або іншого рішення CI. Кожен проект автоматично будується раз на місяць, незалежно від того, скільки років ...
Тоні БенБрахім,

1
Тож питання залишається, чи зберігаєте ви JDK також у сховищі джерел керування? Де ви проводите межу?
jpierson

5
@jperson, звик. З автоматизованою періодичною збіркою, поки вона будує / проходить тести на поточному JDK, мені не потрібен оригінальний JDK. Я
підвожу

20

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


У деяких рідкісних випадках використання, де вам потрібно будувати SW десь без підключення до Інтернету, зберігати його (тобто мати його доступним локально після, наприклад, "git clone") є необхідним злом. Ви не хочете повідомляти клієнту, що день втрачений, тому що ви не можете побудувати ПЗ "у полі".
radix

18

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


13

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


Ніколи не кажи ніколи - див. Мій коментар вище. Хоча я був би радий будь-якого кращого рішення.
radix

Є організації, коди яких написані 20-30 років тому з використанням тонн дивних речей, які більше не доступні на Інтернеті. Я б запропонував, якщо вам потрібно створити старий вихідний код, найкраще, щоб там було все, що є непросто доступним. Хто знає, чи ваш процес maven запрацює через 20 років. Я стикався з цим сценарієм у реальному житті.
AminM

8

Я зазвичай зберігаю їх у сховищі, але я співчуваю вашому бажанню зменшити розмір.

Якщо ви не зберігаєте їх у сховищі, їх абсолютно потрібно якось архівувати та версувати, а ваша система збірки повинна знати, як їх отримати. Багато людей у ​​світі Java, здається, використовують Maven для автоматичного отримання залежностей, але я не використовував I, тому я не можу порекомендувати за чи проти.

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


Подобається ідея окремого сховища. Вирішує проблему, коли віддалені користувачі мають ТОЛЬКИ доступ до керування джерелами (тобто вони не можуть дістатися до анонімного FTP або де-небудь ще, де ви розміщуєте сторонні матеріали). Я визнаю, що це якось пошкоджено, коли гігантські незмінні двійкові файли контролюються джерелом, але це принаймні ізолює їх до одного репо.
передумати

5

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

  1. навіщо зберігати файли, які не змінюються, у систему, спеціально розроблену для управління файлами, які змінюються?
  2. це різко закріплює виїзди
  3. кожного разу, коли я бачу "something.jar", що зберігається під контролем джерела, я запитую "і яка це версія?"

4

Я ставлю все, крім JDK та IDE, у керування джерелами.

Філософія Тоні - це звук. Не забувайте сценарії створення бази даних та сценарії оновлення структури даних. Перш ніж виходити вікі, я навіть зберігав нашу документацію в контролі джерел.


4

Я вважаю за краще зберігати сторонні бібліотеки у сховищі залежностей (наприклад, Artifactory з Maven ), а не зберігати їх у Subversion.

Оскільки сторонні бібліотеки не керуються і не керуються версіями, як вихідний код, не має сенсу змішувати їх. Віддалені розробники також оцінюють відсутність необхідності завантажувати великі бібліотеки за повільним посиланням WPN, коли вони можуть отримати їх простіше з будь-якої кількості загальнодоступних сховищ.


2

У попереднього роботодавця ми зберігали все необхідне для створення додатків у контролі джерел. Обертання нової версії машини було питанням синхронізації з джерелом управління та встановлення необхідного програмного забезпечення.


1
Мені здається, є якась сіра зона між "необхідним програмним забезпеченням" і "всім необхідним для побудови програми". Чи не потрібен компілятор для побудови програми? Також багато SDK та сторонні бібліотеки вимагають встановлення на робочій станції розробників. Де ми проводимо лінію і як зберігаються сторонні бібліотеки .NET у елементі керування джерелом, коли, як правило, вони мають бути у GAC?
jpierson

1

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

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


1

Зберігайте бібліотеки! Сховище має бути знімком того, що потрібно для побудови проекту в будь-який момент часу. Оскільки проект вимагає іншої версії зовнішніх бібліотек, ви захочете оновити / перевірити новіші версії цих бібліотек. Таким чином, ви зможете отримати всю потрібну версію зі старим знімком, якщо вам доведеться виправити старіший випуск тощо.


1

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

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

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

Сказавши це, я вважаю, що більшість бібліотек, на які я посилаюся, відносно невеликі, важать близько декількох сотень кб, рідко бувають більшими, що робить для мене меншою проблемою просто закріпити їх за контролем джерел.


1

Використовуйте підпроекти git та посилання з головного сховища git сторонніх бібліотек, або (якщо у нього немає) створіть нове сховище git для кожної необхідної бібліотеки. Немає жодної причини, чому ви обмежуєтесь лише одним сховищем git, і я не рекомендую використовувати чужий проект як лише каталог у своєму власному.


0

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

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


0

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


0

Особисто те, що я зробив і мені до цього часу сподобались результати, - це зберігати бібліотеки в окремому сховищі, а потім посилатися на кожну бібліотеку, яка мені потрібна в інших сховищах, за допомогою функції Subversion svn: externals. Це чудово працює, тому що я можу зберігати версійні копії більшості наших бібліотек (в основному керованих .NET-збірок) у вихідному контролі, не збільшуючи при цьому розмір нашого основного сховища вихідного коду. Маючи збірки, що зберігаються у сховищі, таким чином, це робить так, що на сервері збірки їх не потрібно встановлювати для створення збірки. Я скажу, що отримання збірки для успіху за відсутності встановлення Visual Studio було справжньою справою, але тепер, коли ми працюємо, ми цим задоволені.

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

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