Чи є гарною практикою зберігати рамкові режими роботи під контролем джерел?


9

Я знаю, що багато програмних магазинів тримають двійкові файли під контролем джерел . Однак наш магазин прийшов для зберігання цілих фреймворків у сховищі: DirectX runtime, CUDA, nVidia Optix, будь-що інше.

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

Я ніколи не бачив такої схеми використання. Ви вважаєте це гарною практикою?

[EDIT:] У мене немає проблем із джерелами, що контролюють джерело, ізольованих сторонніх бінарних файлів. Питання стосується цілих циклів виконання, які зазвичай складаються з 10+ двійкових файлів. Як крайній приклад, візьміть Windows SDK (який ми не зберігаємо у сховищі, слава богу, але я не бачу різниці в принципі).


1
Ви можете створити скрипт, який завантажує останню або відповідну програму виконання, і поставити цей сценарій під контроль версій.
Базиле Старинкевич

2
Чому ви вважаєте, що це обтяжує [сховище] нерелевантною історією ? Більш конкретно, чому ви вважаєте, що історія не має значення ? Якщо ваш код посилається на ці рамки та бібліотеки, дуже корисно знати, які версії використовувались під час певної редакції в сховищі.
Джеймс Мак-Нілліс

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

Чи не було б простіше створити зображення машини розробника, коли з’являються оновлення?
Рамхаунд

@Ramhound: саме такий напрямок я намагаюся просунути. Мені було цікаво, чи є недоліки, яких я пропускаю.
Офек Шилон

Відповіді:


6

Бінарні файли, як правило, не підходять для системи управління версіями, оскільки:

  • вони не користуються функціями контролю версій (злиття, відмінність)
  • вони збільшують розмір репо ...
  • ... що важливо, оскільки ви не можете легко видалити версію з VCS (VCS створені для зберігання історії), на відміну від сховищ артефактів, таких як Nexus , які є простими спільними каталогами (легко очистити: cd+ rm!)
  • на них слід посилатися у VCS як текст , декларація шляху + версії: ви можете зберігати відповідну історію таким чином , записуючи будь-яку зміну бінарної версії як зміну цього текстового файлу (наприклад, pom.xml, якщо ви використовуєте Nexus наприклад)

1
Останній пункт дуже цінний.
Нуфал Ібрагім

Дякую! Чи знаєте ви схоже сховище артефактів для проектів C ++? Ще краще - можливо, такий, який інтегрується з TFS?
Офек Шилон

2
@OfekShilon: Nexus теоретично може зберігати будь-який артефакт. Але для зберігання та управління залежностями для .NET / C ++ ви також маєте NuGet: nuget.codeplex.com . Приклад .Net: lostechies.com/derekgreer/2011/09/20 / ... . Він також повинен підтримувати проекти C ++: nuget.codeplex.com/discussions/280649 .
VonC

@OfekShilon Ви можете зв’язати TFS з NuGet (наприклад: coolthingoftheday.blogspot.com/2011/08/… , hanselman.com/blog/… ). Дивіться також TFSNuGetter: nugetter.codeplex.com
VonC

6

Я добре з версією, що контролює бінарні активи. Я проти контролю за версіями згенерованих файлів.

Крім того, налаштування навколишнього середовища дещо відрізняється від розробки. Ми в основному розробляємо в Python, і він має інструмент під назвою virtualenv, який дозволяє створити легке ізольоване середовище (включаючи бібліотеки) для проекту. Коли ми перевіряємо наші джерела, у нас є сценарій налаштування, який будує цей virtualenv. Використовуючи маніфест, це вказує, які версії бібліотек потрібні та інші подібні речі. Нічого з цього не контролюється версіями. Лише сценарій налаштування є.

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


3

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

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

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


2

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

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


Я уточнив питання, щоб вирішити це.
Офек Шилон

1

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


1

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

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

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

Це питання пріоритету чи політики. Поки рішення обдумане, я б із цим добре.


2
Якщо ви зберігаєте свою бібліотеку третьої сторони у сховищі артефактів, як-от ваш власний сервер Nexus або NuGet, вам не доведеться боятися, що сервер "постачальника" відійде. Отож, будь ласка, зберігайте їх на місцях. Просто не використовуйте VCS. Вони не призначені для збереження такого роду файлів.
VonC

@VonC залежить від вашої інфраструктури та діючої методології. Для "просто збереження одного двійкового файлу один раз" VCS може бути таким же чудовим, як повне сховище артефактів. Він також забезпечує просту інфраструктуру. Я не виступаю - ОП запитала, чи хтось бачив таку схему використання.

Добре. Я бачив таку схему використання. І мені довелося адмініструвати такі репозиції (в основному централізувати VCS, наприклад SVN або ClearCase, ніколи не бачив такого використання для DVCS, як Git). І це взагалі безлад. Перезавантажуючи бібліотеки постачальників, ви рідко зберігаєте один двійковий файл один раз. Ви повинні мати справу з патчами. Багато їх. Плюс зберігання не є єдиною метою (якби вона була, VCS, можливо, може бути потенційним рішенням). Управління залежністю є. І це те, що пропонують Nexus або NuGet (крім простого адміністрування та очищення).
VonC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.