С трудом завоеванный опыт научил меня, что почти все относится к контролю над источниками. (Мои комментарии здесь окрашены в течение полутора десятилетий разработки для встраиваемых / телекоммуникационных систем на проприетарном оборудовании с проприетарными, а иногда и труднодоступными инструментами.)
Некоторые из ответов здесь говорят «не помещайте двоичные файлы в систему контроля версий». Это неверно. Когда вы работаете над продуктом с большим количеством стороннего кода и множеством двоичных библиотек от поставщиков, вы включаете двоичные библиотеки . Потому что, если вы этого не сделаете, то в какой-то момент вы собираетесь выполнить обновление, и у вас возникнут проблемы: сборка будет прервана, потому что сборочная машина не имеет последней версии; кто-то дает новому парню старые компакт-диски для установки; в вики проекта есть устаревшие инструкции относительно того, какую версию устанавливать; и т.д. Хуже того, если вам нужно тесно сотрудничать с поставщиком для решения конкретной проблемы, и они отправляют вам пять наборов библиотек в неделю, вы должныбыть в состоянии отследить, какой набор двоичных файлов показал, какое поведение. Система контроля версий - это инструмент, который решает именно эту проблему.
Некоторые из ответов здесь говорят «не переводите инструментальную цепочку в систему контроля версий». Я не скажу, что это неправильно, но лучше всего поместить инструментальную цепочку в систему контроля версий, если у вас нет для этого надежной системы управления конфигурацией (CM) . Опять же, рассмотрите вопрос обновления, как указано выше. Хуже того, я работал над проектом, в котором было четыре отдельных варианта набора инструментов, которые я получил при найме на работу - все они в активном использовании ! Одним из первых, что я сделал (после того, как мне удалось заставить сборку работать), была поставлена цепочка инструментов под контроль исходного кода. (Идея надежной системы CM была вне надежды.)
А что происходит, когда разные проекты требуют разных наборов инструментов? Пример: через пару лет один из проектов получил обновление от поставщика, и все Makefile сломались. Оказывается, они полагались на более новую версию GNU make. Так что мы все обновились. Упс, все файлы Makefile другого проекта сломались. Урок: зафиксируйте обе версии GNU make и запустите версию, которая поставляется вместе с вашим проектом.
Или, если вы работаете в месте, где все остальное совершенно неконтролируемо, у вас возникают разговоры типа: «Эй, новый парень начинается сегодня, где CD для компилятора?» «Не знаю, не видел их с тех пор, как Джек ушел, он был хранителем компакт-дисков». "Э-э, разве не до того, как мы поднялись со 2-го этажа?" «Может быть, они в коробке или что-то в этом роде». И поскольку инструментам уже три года, нет надежды получить этот старый CD у продавца.
Все ваши сценарии сборки принадлежат системе контроля версий. Все! Все вплоть до переменных среды. Ваша сборочная машина должна иметь возможность запускать сборку любого из ваших проектов, выполняя один скрипт в корневом каталоге проекта. ( ./build
является разумным стандартом; ./configure; make
почти так же хорош.) Скрипт должен настроить среду как требуется, а затем запустить любой инструмент, который собирает продукт (make, ant и т. д.).
Если вы думаете, что это слишком много работы, это не так. Это на самом деле экономит массу работы. Вы фиксируете файлы один раз в начале времени, а затем при каждом обновлении. Ни один одинокий волк не может обновить свою машину и зафиксировать кучу исходного кода, который зависит от последней версии какого-либо инструмента, нарушая сборку для всех остальных. Когда вы нанимаете новых разработчиков, вы можете сказать им, чтобы проверить проект и запустить ./build
. Когда версия 1.8 имеет много настроек производительности, и вы настраиваете код, флаги компилятора и переменные среды, вы хотите убедиться, что новые флаги компилятора не будут случайно применены к сборкам патчей версии 1.7, потому что им действительно нужен код изменения, которые сопровождают их, или вы видите некоторые волосатые расы.
Лучше всего , это когда-нибудь спасет вашу задницу: представьте, что вы отправите версию 3.0.2 вашего продукта в понедельник. Ура, празднуем. Во вторник утром VIP-клиент звонит на горячую линию поддержки, жалуясь на эту сверхкритическую, срочную ошибку в версии 2.2.6, которую вы отправили 18 месяцев назад. И вам по-прежнему приходится поддерживать его по контракту, и они отказываются обновляться, пока вы не сможете точно подтвердить, что ошибка исправлена в новом коде, и они достаточно велики, чтобы заставить вас танцевать. Есть две параллельные вселенные:
Во вселенной, где у вас нет библиотек, наборов инструментов и сценариев сборки в управлении исходным кодом, и у вас нет надежной системы CM ... Вы можете проверить правильную версию кода, но она дает Вы все виды ошибок, когда вы пытаетесь построить. Посмотрим, обновили ли мы инструменты в мае? Нет, это были библиотеки. Хорошо, вернитесь к старым библиотекам - подождите, были ли два обновления? Ах да, это выглядит немного лучше. Но теперь эта странная ошибка компоновщика выглядит знакомой. О, это потому, что старые библиотеки не работали с новым набором инструментов, поэтому нам пришлось обновляться, верно? (Я избавлю вас от агонии остальных усилий. Это займет две недели, и никто не доволен в конце этого, ни вы, ни руководство, ни клиент.)
Во вселенной, где все находится под контролем исходного кода, вы проверяете тег 2.2.6, готовите отладочную сборку примерно через час, тратите день или два на воссоздание «VIP ошибки», отследите причину, устраните ее текущий выпуск, и убедить клиента обновить. Напряженный, но не такой ужасный, как в другой вселенной, где ваша волосная линия на 3 см выше.
С учетом сказанного, вы можете зайти слишком далеко:
- У вас должна быть установлена стандартная ОС, у вас есть «золотая копия». Документируйте это, вероятно, в README, который находится в системе контроля версий, чтобы будущие поколения знали, что версия 2.2.6 и более ранние версии построены только на RHEL 5.3 и 2.3.0, а позднее - только на Ubuntu 11.04. Если вам легче управлять цепочкой инструментов таким образом, сделайте это, просто убедитесь, что это надежная система.
- Проектная документация громоздка в системе контроля версий. Документы по проектам всегда опережают сам код, и нередко приходится работать с документацией для следующей версии, работая над кодом для текущей версии. Особенно, если все ваши проектные документы являются бинарными документами, которые вы не можете изменить или объединить.
- Если у вас есть система, которая контролирует версии всего, что используется в сборке, используйте ее ! Просто убедитесь, что синхронизировать всю команду легко, чтобы все (включая сборочную машину) использовали один и тот же набор инструментов. (Я имею в виду такие системы, как pbuilder в Debian и ответственное использование python's virtualenv.)