Системы управления версиями

индекс
161,00

Mercurial для параллельной работы с несколькими похожими проектами, часть 1

Введение


В статье рассматриваются несколько проблем (и полезных возможностей) при работе с mercurial и предлагаются варианты их решения.

Несколько проектов на одном фреймворке

Предположим, мы используем какой-то фреймворк сразу в нескольких проектах. Для этого мы, как правило, клонируем базовый репозиторий и начинаем менять в нём файлы, связанные только с нашим проектом, тестируем, коммитим, пушим — всё как обычно.
Внезапно… мы обнаруживаем, что в самом фреймворке есть баг или нам, ну просто сил нет, нужно добавить какую-то функциональность, да заодно потестировать её с текущим проектом.
При этом мы понимаем, что эти изменения должны рано или поздно попасть в репозиторий фреймворка.

Что же делать?

Самым очевидным решением является использование патчей. Написали, проверили, выбрали только файлы относящиеся к фреймворку, сделали патч, применили патч к репозиторию проекта, закоммитили и запушили куда следует, обновились в остальных проектах по мере необходимости.

А если нужно это делать постоянно?

А теперь представим ситуацию, когда мы одновременно работаем над несколькими похожими проектами, базирующимися на одном фреймворке, или пишем собственный фреймворк. Мы создадим отдельный репозиторий для разработки, в котором будем разрабатывать и тестировать обобщённые части для всех проектов. Например:

Локальный репозиторий разработки:
  • core — файлы фреймворка
  • shared — общие файлы для проектов
  • custom — файлы необходимые для тестирования

А ещё у вас будет репозиторий-хранилище обобщённых частей (или фреймворка):
  • core — файлы фреймворка
  • shared — общие файлы для проектов

Папка custom в данном репозитории естественно отсутствует, иначе при любых изменениях, они будут попадать в репозитории отдельных проектов, что недопустимо.

Изменения распостраняются по такой схеме:

репозиторий разработкирепозиторий-хранилище → репозитории проектов → (патчами) репозиторий разработки

Как же такое организовать с минимумом нервов?

Во-первых, симлинки с mercurial работать не будут, и все варианты связанные с разделением файлов между рабочими копиями лучше отбросить. (хардлинки работали бы, если бы их можно было делать на директории)

Итого, нам нужно заигнорить папку «custom». В mercurial для репозитория существует два основных метода «игнорирования»:
  1. Использование файла .hgignore в корне репозитория
  2. Использование .hg/hgrc игнорирования

Первый способ нам не подходит, так как .hgignore помещается в репозиторий и испортит жизнь при разработке отдельных проектов.

А вот второй способ — то, что нужно:

1. Создаём файл, аналогичный .hgignore, кладём его в удобное место (например в папку .hg или вообще вне репозитория).

2. В секции [ui] файла .hg/hgrc создаём опцию:
ignore.whatever = <абсолютный путь к файлу с правилами для игнорирования>
(Кстати таких опций с разными «whatever» может быть сколько угодно)

Заключение


Конечно, можно было существенно сократить текст статьи, и ограничиться упоминанием о «втором способе игнорирования», но это статья является лишь вводной, для более серьёзного разговора о разработке такого рода проектов.

В принципе описанная модель вполе работоспособна, однако имеет и существенные недостатки, избавиться от которых мы постараемся в следующий раз, а заодно даже научимся писать плагины для mercurial.
+2
17 декабря 2009, 06:12
20

комментарии (9)

+2
hardtop #
Было бы здрово разобрать на мааааленьком примере. А так — спасибо!
+10
harrier #
Извините, но статья ни о чем.

Краткое содержание:
HG лучше чем просто патчи.
Как игнорить файлы в HG репозиториях.

0
cblp #
+ общий код надо выносить в отдельные модули и хранить в отдельных репозиториях
0
krig #
Я пока что не сильно опытен в Mercurial, последние несколько лет сидел исключительно под SVN'ом, но даже простейшее гугление подсказало аналог svn:externals — Subrepositories, и, насколько понимаю, это именно то, что можно применять как раз в случае с общим ядром.

Другой вариант — hgforrest
0
mou #
Задача. которую вы решаете называется dependency management. И решается она совершенно другими средствами.
0
sovnarkom #
Управление зависимостями ≠ уплавление циклами и ветками разработки
0
mou #
все сводится к управлению артефактами. А ваши ветки и есть суть артефакты. Если посмотреть на конфигурации достойных систем управления зависимостями, там можно встретить возможность указать и branch и status и еще с десяток параметров для каждого артефакта.
0
sovnarkom #
ну и замечательно, когда буду разрабатывать свою мультиплатформенную операционку тогда изучу системы управления зависимости с идиотским термином «артефакт», на который нужно указывать десяток параметров.

А пока у меня есть git, mercurial и куча проектов средней сложности, где мне нужно быстро реагировать на изменения. Меня вполне устраивают инструменты, которыми я пользуюсь.

Ну и если вы уж затеяли это — давайте говорить предметно, с названиями систем, а не «есть другое, есть системы, всё иначе», бесите.
0
mou #
Диалоги в таком тоне не строятся.
ant.apache.org/ivy/

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.