Pull to refresh

Drupal + Git submodules: рецепты

Reading time 4 min
Views 14K
В этой статье будут рассмотрены основные приемы работы с подмодулями гита, если использовать их вместе с друпалом.

Наиболее полезным этот пост будет для тех кто, имея скромный опыт работы с гитом, попал на Drupal-проект где используются подмодули. (Именно так я познакомился с подмодулями и именно такой статьи мне в то время очень не хватало.)


Условия


У нас есть линукс, установлен drush и есть инсталяция седьмого друпала. Основной репозиторий хранит в себе ядро друпала (и, возможно, наши кастомные модули). Все команды выполняются из корневого каталога исталяции друпала, если не указано иное. Модуль — модуль друпала, подмодуль — подмодуль гита.

Минимум информации о подмодулях


Подмодули — это обычные гит репозитории. Они хранятся отдельно от основного репозитория.

В репозитории проекта хранится список используемых подмодулей, их расположение и УРЛы (в файле .gitmodules) и информация о том какое конкретное состояние (версия/релиз/коммит/тег) подмодуля будет использовано (в недрах каталога .git).

Обновление проекта #


Если в вашем проекте используются подмодули, то лучше всего каждый раз после git pull выполнять еще и эти команды:
git submodule sync # обновляем используемые УРЛы репозиториев
git submodule update --init # устанавливаем новые подмодули и обновляем состояние уже установленных

Установка модуля #


Команда драша dl умеет работать с модулями как с подмодулями гита:
drush dl module_name --package-handler=git_drupalorg --gitsubmodule
Драш поддерживает работу только с официальным репозиторием — git.drupal.org.

Что бы постоянно не писать дополнительные параметры команды dl, можно настроить значения параметров драша используемые по умолчанию добавив в drushrc.php следующие строки:
$options['package-handler'] = 'git_drupalorg';
$options['gitsubmodule'] = TRUE;

В этом случае все модули по умолчанию будут скачиваться как подмодули гита и можно писать просто:
drush dl module_name

Если же подмодуль нужно установить вручную, например, не из официального репозитория, тогда пользуемся обычной коммандой гита:
git submodule add git://github.com/example/module_name.git sites/all/modules/module_name
После чего нужно перейти в каталог установленного подмодуля и переключиться на нужный релиз:
git checkout 7.x-1.0

Определение версии модуля #


Если скачать модуль «по старинке» с сайта drupal.org, то версия модуля будет указана в файле module_name.info. Она добавляется в этот файл автоматически при создании релиза, в репозитории ее нет.

Что бы друпал сам мог определять версию модулей нужен модуль git_deploy. Он дополняет информацию полученную друпалом из info-файлов добавляя в нее версию модуля, которую он «добывает» используя различные команды гита. Использовать подмодули без git_deploy можно, но вы не сможете пользоваться обновлением через drush up, потому что друпал не будет знать текущей версии установленных модулей.

Узнать версию модуля можно еще и так:
git submodule status | grep module_name
В скобках будет указан тег который используется в нашем проекте.
UPD: Этот метод не всегда работает корректно, как выяснилось. Лучше из каталога подмодуля запустить:
git describe --all

Обновление модуля #


Команда для обновления используется самая обычная:
drush up module_name
Опять же, она будет работать только если у нас установлен git_deploy.

Если нам нужно обновить модуль вручную, скажем, мы хотим обновится до определенной версии. Тогда из каталога подмодуля запускаем две команды:
git fetch # обновляем информацию из удаленного репозитория
git checkout 7.x-3.5 # переключаем код на требуемый релиз (тег)

После этого не забываем запустить обновления базы данных:
drush updb

Патч модуля #


Сначала желательно переключить подмодуль на определенный бранч потому как
  • патчи в основном пишутся для dev-версий
  • драш «нацеливает» подмодуль на определенный релиз (тег), а это означает что ваш подмодуль находится в состоянии «detached head» и дальнейшая работа может быть затруднена.

Например, если мы использовали версию модуля 7.x-3.5, переключимся на рабочую ветку этого релиза:
git fetch # обновляем информацию из удаленного репозитория
git checkout 7.x-3.x # переключаемся на рабочую ветку
git pull # обновляем ветку

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

Создаем отдельный репозиторий для модуля который мы пропатчили. Например, на гитхабе.

Обновляем УРЛ репозитория вашего подмодуля. Для этого находим соответствующую секцию в файле .gitmodules, например:
 [submodule "sites/all/modules/module_name"]
 	path = sites/all/modules/module_name
-	url = git://git.drupal.org/project/module_name.git
+	url = https://github.com/example/module_name.git

Что бы гит начал использовать новый УРЛ, выполняем:
git submodule sync

Теперь можно закоммитить наши изменения и запушить всё в наш новый репозиторий. Из каталога подмодуля выполняем:
git commit -m "Applied patch from http://drupal.org/node/00000#comment-0000000"
git push

В ваш репозиторий попадет и ваш коммит и вся предыдущая история модуля.

Обновление пропатченого модуля #


Иногда требуется обновить модуль в который мы вносили свои изменения, например, в связи с выходом обновления безопасности или появления новых нужных нам фич.

Самым простым решением будет обновление из рабочей ветки официального репозитория. Например, если ранее мы пропатчили модуль на основе бранча 7.x-3.x, из каталога его подмодуля запускаем:
git pull http://git.drupal.org/project/module_name.git 7.x-3.x

(Если честно, это единственный способ которым я пользовался до этого момента.)

Восстановление репозитория модуля #


Если ваш патч закоммитили или же он больше не нужен, есть смысл вернуть подмодуль на обеспечение git.drupal.org. Для этого обновляем (возвращаем прежний) УРЛ, снхронизируем УРЛы подмодулей, делаем git fetch из каталога подмодуля и чекаутим нужный релиз. Все это описано выше.

Удаление подмодуля #


Простой команды нет, но есть рецепт со stackoverflow:
  1. удаляем секции подмодуля из файлов .gitmodules и .git/config,
  2. выполняем git rm --cached sites/all/modules/module_name,
  3. коммитим изменения и удаляем каталог подмодуля.

Заключение


В контексте друпала использование подмодулей дает ряд преимуществ. Патчить модули становится удобней, а поддерживать их при этом в актуальном состоянии — легко. Вы можете использовать пропатченые или ваши собственные модули в нескольких проектах, при этом централизованно ведя работу над ними. А если учесть, что для работы с подмодулями нужно освоить всего лишь несколько простых приемов, то мы получаем сплошные плюсы и делаем вывод что подмодули — это простой и эффективный инструмент который можно и нужно использовать в Drupal-проектах.
Tags:
Hubs:
+19
Comments 6
Comments Comments 6

Articles