Підтримка двох окремих версій програмного забезпечення з тієї ж бази коду в контролі версій


45

Скажімо, я пишу дві різні версії одного програмного забезпечення / програми / програми / сценарію і зберігаю їх під контролем версій. Перша версія - це безкоштовна версія "Basic", а друга - платна версія "Premium", яка бере кодову базу безкоштовної версії та розширює її за допомогою декількох додаткових додаткових цінностей. Будь-які нові виправлення, виправлення чи функції повинні знайти свій шлях в обох версіях.

Наразі я розглядаю можливість використання masterта developгілок для основної кодової бази (безкоштовної версії) поряд із стороною master-premiumта develop-premiumгілок для платної версії. Коли зміни вносяться до безкоштовної версії та об'єднуються до masterгілки (після ретельного тестування, developзвичайно), вона копіюється в develop-premiumгілку за допомогою cherry-pickкоманди для додаткового тестування, а потім об'єднується в master-premium.

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

Ваші відгуки високо оцінені!

PS Це для сценарію PHP, що зберігається в Git, але відповіді повинні стосуватися будь-якої мови або VCS.

Відповіді:


83

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

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

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


2
Так, про це я почав думати минулої ночі, перш ніж лягати спати. Дякую!
Джозеф Ліді

3
сучасна Windows розроблена таким чином, всі версії мають однаковий код і мають розблоковані функції залежно від використання ліцензійного ключа.
Mooing Duck

39

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

Натомість підтримуйте одну загальну версію вихідного коду та використовуйте умовну компіляцію (наприклад, #ifdefу C / C ++, не впевнений, що еквівалент PHP), щоб включити або виключити розділи коду, які відрізняються між "базовим" та "преміальним".

Схоже, що в PHP може бути не вбудована така умовна компіляційна функція, тож ви можете використовувати препроцесор C ( cppви, мабуть, у вас уже є) для попередньої обробки вашого загального вихідного коду, і з цього виробляти "базовий" і "преміальний" версія без директив препроцесора. Звичайно, якщо ви вирішите це зробити, вам слід скористатися makeчимось подібним для автоматизації процесу запуску препроцесора.


Те, що ви говорите про гілки, має повний сенс! Можливо, замість цього я міг би створити окреме репо, що містить лише код Premium, і використовувати якийсь скрипт випуску чи підмодуль, щоб поєднати його з базовим кодом? Це, можливо, зробить TDD складніше ...
Джозеф Леді

14
Створення іншого сховища ще гірше, ніж створення гілок! Ви напевно хочете вибрати рішення, яке передбачає найменше дублювання версійного коду.
Грег Хьюгілл

2
Сенс другого репо полягає в тому, щоб розмістити лише додатковий код - не іншу копію всього додатка.
Джозеф Леді

1
Я бачу, це було б більше схоже на модель "плагін", де ваш базовий код має можливість завантажувати та запускати плагіни (якщо вони існують). Код плагіна є окремим і забезпечує преміальні функції.
Грег Х'югілл

4
@Joseph: використання двох репостів доцільно лише в тому випадку, якщо версія двох кодових баз майже не залежить одна від одної. Якщо це не так, я б настійно рекомендував робити те, що написав Грег, і тримати все в одному репо. Єдине, що я хотів би переосмислити - це використання "препроцесора C". Я думаю, невеликий сценарій, написаний на обраній вами мові (сам PHP чудовий, Perl або Python ще кращий), який робить копію вашого коду без (дещо помічених) функцій преміум-класу.
Док Браун

8

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


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

1
в загальному випадку вам потрібні 3 проекти: загальна частина, часто організована як бібліотека, і спеціальні частини для двох різних версій.
Андрій Тиличко

3

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

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

Відповідь Грега запропонувала вам "розглянути гілки для речей, які згодом (або можуть бути) знову об'єднані разом". При підході я тільки що описав це так, за винятком того, що остаточне відділення для всіх фіксацій буде master-premiumНЕ master(що насправді master-basic).

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


0

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

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

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

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

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