Контроль версий должен содержать код и конфигурацию, необходимые для сборки приложения.
Это значит, что:
Временные элементы, которые вводились в течение короткого промежутка времени (например, времени, необходимого для точного определения местоположения ошибки или эксперимента с функцией языка), не должны находиться в элементе управления версиями: сохраняйте его до тех пор, пока вам не понадобится затем просто удалите его, когда делаете коммит .
Локальные файлы, относящиеся к конкретной машине, могут храниться в ветке.
Я бы не стал хранить их только локально, так как слишком тяжело переделывать все эти вещи, когда ваш ноутбук украден или вирус заставляет вас переустанавливать ОС (и, кстати, вы обнаружите, что ваше последнее резервное копирование было сделано два года назад) ,
С другой стороны, будьте осторожны с файловой структурой: локальная конфигурация в порядке, пока она не станет чрезмерной, и вынуждает вас вносить одно изменение в каждый файл каждого из 42 разработчиков, участвующих в проекте.
Следите за возможностью устранить особенности между машинами. Это может означать:
Предоставление доступа к dev-серверу SQL для замены локальных экземпляров на машинах разработчиков,
Использование служб распространения пакетов, таких как Pypi или npm для общедоступных пакетов и их частных аналогов для внутренних пакетов,
Попросите членов команды установить те же версии программного обеспечения,
Сделать обновления программного обеспечения максимально прозрачными,
Или сделайте возможным развертывание ОС и необходимого программного обеспечения на компьютере одним щелчком мыши (плюс время для каждого разработчика, чтобы установить свой предпочтительный Vim против Emacs, Chrome против Firefox и т. Д.)
Так:
Файлы проекта. Пути, возможно, должны быть отредактированы, чтобы отразить расположение на текущем ПК.
Почему бы не использовать одну и ту же раскладку на каждом ПК? Пути в проекте должны быть связаны с файлом проекта, что означает, что не имеет значения, где находится проект. Версии программного обеспечения и библиотек лучше использовать, чтобы избежать загадочных ошибок, которые появляются только на некоторых компьютерах и которые невозможно воспроизвести для других членов команды.
Пример:
В проекте, созданном с помощью Visual Studio, вы можете найти:
Сами файлы. Пути относительны, не имеет значения, находится ли на моей машине проект, в H:\Development\Hello World Project\
то время как другие члены команды проверяли проект C:\Work\HelloWorld\
.
Зависимости, то есть сторонние и внутренние библиотеки. Оба типа должны обрабатываться NuGet, что делает все обсуждения, связанные с конфликтами, устаревшими. Если у вас нет той же версии библиотеки, что у меня есть, попросите NuGet обновить зависимости. Так просто (когда это работает хорошо, что не всегда так).
Обратите внимание, что крайне важно также хранить собственные библиотеки в частном NuGet. Наличие нескольких библиотек, хранящихся в общей папке или отправленных по электронной почте в рамках группы, приводит к анархии и депрессивным CI-серверам.
Настройки. Очень важно, чтобы у команды были одинаковые настройки. Если половина команды решит рассматривать предупреждения как ошибки, а половина команды будет хранить предупреждения как есть, члены первой части группы будут тратить свое время на удаление предупреждений, сгенерированных разработчиками, из второй части группы.
Настройки утилит. Это сложно, потому что некоторые члены команды, возможно, установили некоторые утилиты, а другие нет.
Настоятельно рекомендуется установить один и тот же набор инструментов. Если некоторые программисты хотят использовать StyleCop, а другие нет, команда не выполнит свою работу. Если некоторые используют контракты Code, а другие нет, у них будут те же проблемы.
Makefiles. Например, оптимизация может потребоваться отключить во время отладки, но не для CI-сервера.
Держите несколько make-файлов в контроле версий. Нет ничего необычного в том, чтобы построить отладочную версию на CI-сервере и отправить ее клиенту, который столкнулся с непростой ошибкой.
Грязные уродливые хаки. Например, верните 7 в середине функции, чтобы протестировать что-либо, в зависимости от функции, и предположительно сломаться при значении 7.
Я бы избежал такого кода в первую очередь. Чтобы что-то проверить, используйте юнит-тесты. Если действительно требуется несколько секунд, чтобы поменять некоторый код с целью отладки , то сделайте это, но вы все равно удалите этот код через несколько минут, поэтому нет необходимости его фиксировать.
Как вы описываете это, вы должны написать тест. Например, если вы хотите быть уверены, что:
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
выдает исключение, когда temperature
оно уступает AbsoluteZero
константе, вы не должны играть с самим кодом. Вместо этого создайте модульный тест, который будет:
- самостоятельно документировать ваш код,
- повысить надежность вашего кода,
- убедитесь, что сопровождающие могут полагаться на регрессионное тестирование при изменении метода выше,
- служить другим разработчикам из вашей команды, которым, возможно, потребуется выполнить тот же тест.