Якщо ви будете дотримуватися моїх рекомендацій нижче (я роками), ви зможете:
- покладіть кожен проект де-небудь у керування джерелами, якщо ви збережете структуру з кореневого каталогу проекту вниз
- будуйте кожен проект у будь-якому місці на будь-якій машині, з мінімальним ризиком та мінімальною підготовкою
- будуйте кожен проект повністю автономним, якщо у вас є доступ до його бінарних залежностей (локальні каталоги "бібліотека" та "вихід")
- будувати та працювати з будь-якою комбінацією проектів, оскільки вони незалежні
- будувати та працювати з декількома копіями / версіями одного проекту, оскільки вони незалежні
- уникайте захаращування вашого сховища керування джерелом з генерованими файлами чи бібліотеками
Рекомендую (ось яловичина):
Визначте кожен проект для отримання єдиного основного результату, такого як .DLL, .EXE або .JAR (за замовчуванням для Visual Studio).
Структуруйте кожен проект як дерево каталогів з одним коренем.
Створіть автоматичний сценарій збірки для кожного проекту в його кореневому каталозі, який буде створювати його з нуля, без залежностей від IDE (але не заважайте будувати його в IDE, якщо це можливо).
Розглянемо проекти nAnt для .NET в Windows або щось подібне на основі вашої ОС, цільової платформи тощо.
Зробіть, щоб кожен сценарій побудови проекту посилався на його зовнішні (сторонні) залежності від однієї локальної спільної бібліотеки "бібліотека", при цьому кожен такий бінарний ПОЛІТКО визначається версією: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Зробіть, щоб кожен сценарій побудови проекту публікував основний доступ до однієї локальної спільної "вихідної" каталогу: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Зробіть, щоб кожен сценарій побудови сценарію посилався на його залежність за допомогою настроюваних та повністю перетворених абсолютних шляхів (див. Вище) в каталогах "бібліотека" та "вихід", і НЕ БУДЕ, де інше.
НІКОЛИ не дозволяйте проекту безпосередньо посилатися на інший проект або будь-який його вміст - дозволяйте посилатися лише на основні результати у каталозі "вихід" (див. Вище).
Зробіть для кожного сценарію побудови проекту посилання на його необхідні інструменти побудови за допомогою настроюваного та повністю перетвореного абсолютного шляху: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Зробіть кожен проект збірки сценарій змісту посилання джерело за абсолютним шляху щодо кореневої директорії проекту: ${project.base.dir}/src
, ${project.base.dir}/tst
(синтаксис варіюється в залежності від інструменту збірки).
ЗАВЖДИ потрібен сценарій побудови проекту для посилання на кожен файл або каталог через абсолютний конфігуруваний шлях (коріння у каталозі, визначеному конфігуруемою змінною): ${project.base.dir}/some/dirs
або ${env.Variable}/other/dir
.
НІКОЛИ не дозволяйте сценарію побудови проекту посилатись на ЯКЩО з відносним шляхом, як-от .\some\dirs\here
або ..\some\more\dirs
, ЗАВЖДИ використовуйте абсолютні шляхи.
НІКОЛИ не дозволяйте сценарію побудови проекту посилатися на будь-яке, використовуючи абсолютний шлях, що не має настроюваного кореневого каталогу, як C:\some\dirs\here
або \\server\share\more\stuff\there
.
Для кожного настроюваного кореневого каталогу, на який посилається сценарій побудови проекту, визначте змінну середовища, яка буде використовуватися для цих посилань.
Спроба мінімізувати кількість змінних середовища, які ви повинні створити для налаштування кожної машини.
На кожній машині створіть скрипт оболонки, який визначає необхідні змінні середовища, специфічні для ТОМУ машині (і, можливо, специфічні для цього користувача, якщо це доречно).
НЕ кладіть сценарій оболонки конфігурації для машини в управління джерелом; натомість для кожного проекту виконайте копію скрипту в кореневому каталозі проекту як шаблон.
ЗАПИТАТИ кожен сценарій побудови проекту, щоб перевірити кожну зі змінних його середовища, і скасувати змістовне повідомлення, якщо вони не визначені.
ЗАПИТАТИ кожен сценарій побудови проекту, щоб перевірити кожен з його залежних виконуваних інструментів збирання, зовнішні файли бібліотеки та залежні файли, доступні для проекту, і скасувати змістовне повідомлення, якщо цих файлів не існує.
ПІДТРИМКУЙТЕ спокусу запустити будь-які файли, створені у керування джерелами - ніяких результатів проекту, жодного згенерованого джерела, жодних згенерованих документів тощо.
Якщо ви використовуєте IDE, генеруйте будь-які файли управління проектом, які ви можете, і не змушуйте їх керувати джерелом (це включає файли проектів Visual Studio).
Створіть сервер з офіційною копією всіх зовнішніх бібліотек та інструментів, який слід копіювати / встановлювати на робочих станціях розробника та створювати машини. Створіть резервну копію разом із сховищем керування джерелом.
Створіть сервер безперервної інтеграції (побудуйте машину) без будь-яких інструментів розвитку.
Розглянемо інструмент для керування своїми зовнішніми бібліотеками та результатами, наприклад Ivy (використовується з Ant).
НЕ використовуйте Maven - це спочатку зробить вас щасливими, а з часом змусить вас плакати.
Зауважте, що нічого з цього не є специфічним для Subversion, і більшість з них є загальним для проектів, націлених на будь-яку ОС, апаратне забезпечення, платформу, мову тощо. Я використовував трохи синтаксису, орієнтованого на ОС та інструменти, але лише для ілюстрації- -Я впевнений, що ви переведете на вашу ОС або інструмент за вибором.
Додаткова примітка щодо рішень Visual Studio: не покладіть їх на контроль джерел! При такому підході вони вам взагалі не потрібні або ви можете їх генерувати (як і файли проектів Visual Studio). Однак я вважаю, що найкраще залишити файли рішення окремим розробникам для створення / використання, як вони вважають за потрібне (але не зареєстроване у контролі джерела). Я зберігаю Rob.sln
файл на своїй робочій станції, з якого я посилаюсь на свій поточний проект. Оскільки мої проекти є автономними, я можу додавати / видаляти проекти за бажанням (це означає, що відсутні посилання на залежність від проектів).
Будь ласка, не використовуйте Subversion зовнішні (або подібні в інших інструментах), вони є анти-шаблоном і, отже, непотрібними.
Коли ви впроваджуєте безперервну інтеграцію або навіть коли ви просто хочете автоматизувати процес випуску, створіть для нього сценарій. Створіть єдиний скрипт оболонки, який: приймає параметри назви проекту (як зазначено у сховищі) та ім'я тегу, створює тимчасовий каталог у налаштованому кореневому каталозі, перевіряє джерело для вказаного імені проекту та імені тега (конструюючи відповідна URL-адреса у випадку Subversion) до цього тимчасового каталогу, виконує чисту збірку, яка запускає тести та пакує доставлені. Цей скрипт оболонки повинен працювати над будь-яким проектом і повинен бути перевірений у контролі джерела як частини проекту "інструменти побудови". Ваш сервер безперервної інтеграції може використовувати цей скрипт як основу для побудови проектів, а може навіть надавати його (але ви все ще можете хотіти свого).
@VonC: Ви не хочете працювати завжди з "ant.jar", а не з "ant-abcdjar" після того, як ви отримаєте опік, коли ваш сценарій збірки зламається, оскільки ви несвідомо запустили його з несумісною версією Ant. Особливо часто це зустрічається між мурахами 1.6.5 та 1.7.0. Узагальнюючи, ВИНАГИ хочете дізнатися, яка конкретна версія КОЖНОГО компонента використовується, включаючи вашу платформу (Java ABCD) та інструмент побудови (Ant EFGH). В іншому випадку ви з часом зіткнетеся з помилкою, і ваша перша проблема BIG буде відслідковувати, які версії різних ваших компонентів задіяні. Просто краще вирішити цю проблему наперед.