Контроль версій повинен містити код та конфігурацію, необхідну для складання програми.
Це означає що:
Тимчасові матеріали, які були введені за короткий проміжок часу (час, необхідний для визначення місця помилки або експерименту з особливістю мови, наприклад), не повинні знаходитись у контролі версій: зберігайте його, поки вам не потрібно його, а потім просто видаліть, виконуючи фіксацію .
Локальні файли, що відповідають певній машині, можуть зберігатися у відділенні.
Я б уникав зберігати їх лише локально, оскільки надто болісно переробляти всі ці речі, коли ваш ноутбук викрадений або вірус змушує вас перевстановити ОС (і, до речі, ви виявите, що остання резервна копія була зроблена два роки тому) .
З іншого боку, будьте обережні зі структурою файлів: локальна конфігурація в порядку, поки вона не стане переважною, і змусить вас внести одну зміну в кожен файл кожного з 42 розробників, які беруть участь у проекті.
Слідкуйте за можливістю усунути особливості між машинами. Це може означати:
Надаючи доступ до розробленого SQL-сервера для заміни локальних примірників на машинах розробників,
Використовуючи послуги розповсюдження пакетів, такі як Pypi або npm, для публічних пакетів та їх приватних аналогів для внутрішніх пакетів,
Попросіть членів команди встановити однакові версії програмного забезпечення,
Зробіть оновлення програм максимально прозорими,
Або дозволити розгортання ОС та необхідного програмного забезпечення на машині за один клік (плюс час для кожного розробника встановити бажані Vim vs. Emacs, Chrome проти Firefox тощо)
Так:
Файли проекту. Шляхи, можливо, потрібно буде відредагувати, щоб відобразити макет на поточному ПК.
Чому б не використовувати однаковий макет на кожному ПК? Шляхи в межах проекту повинні бути відносно файлу проекту, а це означає, що не має значення, де знаходиться проект. Версії програмного забезпечення та бібліотек краще бути однаковими, щоб уникнути криптованих помилок, які з’являються лише на деяких машинах і неможливо відтворити для інших членів команди.
Приклад:
У проекті, створеному за допомогою Visual Studio, ви можете знайти:
Самі файли. Шляхи відносні, не має значення, чи є на моїй машині проект, H:\Development\Hello World Project\а інші члени команди перевіряли проект C:\Work\HelloWorld\.
Залежності, тобто сторонні та власні бібліотеки. Обидва типи повинні вирішуватися NuGet, що робить усі дискусії, пов'язані з конфліктами, застарілими. Якщо у вас немає тієї самої версії бібліотеки, яку я, попросіть NuGet оновити залежності. Настільки ж просто (коли це працює добре, що не завжди так).
Зауважте, що важливо зберегти власні бібліотеки і в приватному NuGet. Маючи купу бібліотек, що зберігаються у загальній папці або надсилаються електронною поштою по команді, призводить до анархії та депресивних серверів CI.
Налаштування. Важливо, що команда ділиться однаковими налаштуваннями. Якщо половина команди вирішує трактувати попередження як помилки, а половина команди зберігає попередження як такі, що є, члени першої частини команди витратять свій час на видалення попереджень, створених розробниками з другої частини команди.
Налаштування, пов'язані з утилітами. Вони складні, адже деякі члени команди, можливо, встановили деякі утиліти, а інші - ні.
Настійно рекомендується встановити той же набір інструментів. Якщо деякі програмісти хочуть використовувати StyleCop, а інші - ні, команда не виконає роботу. Якщо деякі використовують контракти з кодексом, а інші не мають, вони матимуть ті самі проблеми.
Makefiles. Наприклад, оптимізацію може знадобитися вимкнути під час налагодження, але не для сервера CI.
Тримайте кілька файлів у контролі версій. Незвичайно також створити налагоджувальну версію на сервері CI та передати її клієнту, який відчуває хитру помилку.
Брудні некрасиві хаки. Наприклад, поверніть 7 посередині функції, щоб тестувати щось, залежно від функції, і підозрюється, що він зламається за значенням 7.
Я б уникав такого коду в першу чергу. Для того щоб щось перевірити, використовуйте одиничні тести. Якщо вам дійсно потрібно кілька секунд, щоб поміняти якийсь код з метою налагодження , тоді зробіть це, але ви видалите цей код все-таки за кілька хвилин, тому не потрібно його вводити.
Описуючи це, ви повинні написати тест. Наприклад, якщо ви хочете бути впевнені, що:
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
кидає виняток, коли temperatureвін поступається AbsoluteZeroпостійному, не слід грати з самим кодом. Натомість створіть одиничний тест, який буде:
- самодокументуйте свій код,
- підвищити надійність вашого коду,
- переконайтесь, що обслуговуючий персонал може покластися на тест регресії при модифікації вищевказаного методу
- служити іншим розробникам вашої команди, яким може знадобитися зробити те саме тестування.