Стратегия контроля версий Drupal?

В стандартных проектах, основанных на php или исходном коде, мы легко сохраняем весь код в SVN, и каждый разработчик может проверить свою копию и совместно работать над одним и тем же кодом.

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

Пример сценария:

Мы запускаем начальную версию сайта Drupal с созданным типом контента «X». Мы также изначально запускаем представление на сайте, в котором перечислены все узлы типа «X» в хронологическом порядке. Клиент начинает использовать сайт, добавлять контент, пункты меню и т. д.

В следующем выпуске планируется добавить в это представление возможность поиска пользователей. Однако настройки для этого содержатся в базе данных. Мы можем скопировать производственную базу данных в нашу разрабатываемую версию, чтобы получить последние данные, пока мы работаем над изменением представления. Однако в течение этого времени клиент все еще может обновлять сайт, что приводит к рассинхронизации нашей базы данных разработчиков. Когда мы будем готовы продвигать новое представление в производственную среду, есть ли более простой способ сделать это, кроме ручного повторения шагов по его настройке при производственной установке?

хм, можешь немного уточнить? Вы в основном говорите о настройке, например, о настройках определенных модулей?

Owen 12.11.2008 06:19

действительно хороший вопрос, спасибо.

sepehr 01.02.2010 00:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
33
2
5 288
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

Ссылки мертвы, и я даже не могу найти кешированную в Google версию второй (re: source, управляющий базой данных). Вы знаете, когда статья будет загружена в резервную копию или где еще я смогу ее просмотреть? Ваше здоровье.

jackocnr 29.07.2010 18:20

Похоже, что статья переместилась на nicksergeant.com/2007/…, а дополнительная публикация - на nicksergeant.com/2008/….

Caroline Orr 03.02.2011 12:26

Честно говоря, я не нашел статьи настолько полезными, хотя это хороший совет попробовать использовать пользовательские модули (чтобы содержать ваши настройки / dev в коде), но если вы ищете решение для слияния Drupal Database - это не т там.

electblake 17.02.2011 19:29

кастомная установка svn? так олдскул -1

Kzqai 25.07.2013 05:33

Все ссылки сейчас мертвы :(

zkent 08.05.2015 17:33

Вы можете избавить себя от некоторых проблем с настройкой SVN и работой с ним, как описано в статье Ника, если вы используете свойство svn: externals. Это позволит автоматически обновлять вашу локальную версию Drupal с указанной веткой Drupal, и вы можете использовать точно такой же механизм для своих модулей. Кроме того, поскольку SVN будет читать внешние определения из файла, вы также можете поместить их в систему контроля версий!

Я не думаю, что в CVS есть аналогичная функция. Однако довольно легко написать простой скрипт, который автоматически установит модуль Drupal, используя только URL-адрес (я сделал это для поддержания моего собственного сайта Drupal в актуальном состоянии).

Что касается версионирования базы данных, решить эту проблему гораздо сложнее. Я бы посоветовал экспортировать "стандартную" базу данных Drupal в файл SQL и поместить его под контроль версий. У каждого разработчика будет свой собственный локальный частный сервер базы данных. Затем вы можете предоставить сценарий, который вернет указанную базу данных к вашей стандартной версии, содержащейся в файле SQL.

В качестве примера того, как эта проблема решается другими способами, я опишу ситуацию на работе. Я работаю над веб-приложением; он не использует базу данных, поэтому не испытывает этих проблем. Наш способ обойти повторяющуюся настройку сайтов - перестроить систему из системы управления версиями и предоставить программу для автоматического развертывания сайтов. Наши клиенты также используют эту программу как способ создания сайтов.

Некоторые модули, такие как CCK и Views, позволяют экспортировать и импортировать свои данные настройки в виде текста. Вы можете сохранить эти текстовые представления в системе управления версиями.

Ответ принят как подходящий

Я думаю, что здесь хорошая стратегия - использовать API профиля установки. С помощью API профиля установки вы можете делать большинство вещей, которые делают инструменты администратора Drupal. Большинство основных форм просто устанавливают переменные в таблице переменных. Чтобы иметь возможность разумно версировать содержимое базы данных, не являющееся содержимым, т.е. конфигурацию, целесообразно использовать функции обновления.

На моем сайте есть модуль "ec", который мало что делает, кроме того, что файл ec.install содержит функции обновления, например. ec_update_6001 ()

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

function ec_install() {
  $ret = array();
  $num = 0;
  while (1) {
   $version = 6000 + $num;
   $funcname = 'ec_update_' . $version;
   if (function_exists($funcname)) {
     $ret[] = $funcname();
     $num++;
   } else {
     break;
   }
  }
return $ret;
}

Теперь следуют несколько примеров функции обновления из нашего фактического файла.

// Create editor role and set permissions for comment module
function ec_update_6000() {
  install_include(array('user'));
  $editor_rid = install_add_role('editor');
  install_add_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
  install_add_permissions(DRUPAL_AUTHENTICATED_RID, array('access comments', 'post comments', 'post comments without approval'));
  install_add_permissions($editor_rid, array('administer comments', 'administer nodes'));
  return array();
}
// Enable the pirc theme.
function ec_update_6001() {
  install_include(array('system'));
  // TODO: line below is not working due to a bug in Install Profile API. See http://drupal.org/node/316789.
  install_enable_theme('pirc');
  return array();
}

// Add the content types for article and mtblog
function ec_update_6002() {
  install_include(array('node'));
  $props = array(
    'description' => 'Historical Movable Type blog entries',
  );
  install_create_content_type('mtblog', 'MT Blog entry', $props);
  $props = array(
    'description' => 'Article',
  );
install_create_content_type('article', 'Article', $props);
return array();
}

По сути, это в основном решает проблему управления версиями баз данных и кода Drupal. Мы широко его используем. Это позволяет нам продвигать новый код, который изменяет конфигурацию базы данных, без необходимости повторно импортировать базу данных или вносить изменения в реальном времени. Это также означает, что мы можем правильно тестировать выпуски, не опасаясь скрытых изменений в базе данных.

Наконец, cck и views поддерживают этот подход. См. Этот фрагмент кода

// Enable CCK modules, add CCK types for Articles in prep for first stage of migration,
// enable body for article, enable migration modules.
function ec_update_6023() {
  $ret = array();
  drupal_install_modules(array('content', 'content_copy', 'text', 'number', 'optionwidgets'));
  install_include(array('content', 'content_copy'));
  install_content_copy_import_from_file(drupal_get_path('module', 'ec') . '/' . 'article.type', 'article');
  $sql = "UPDATE {node_type} SET body_label='Body', has_body=1
  WHERE type = 'article'";
  $ret[] = update_sql($sql);
  return $ret;
} 

Внедрение настроек Drupal из базы данных в код продвигалось семимильными шагами. Два модуля, которые действительно помогают в этой области:

Функции - позволяет собирать вместе такие объекты, как типы контента, таксономия, представления и даже каналы. Мы используем это очень успешно, и это позволило поделиться этими изменениями между разработчиками.

Сильная рука - позволяет сохранять и экспортировать переменную с помощью указанного выше модуля. Я провел некоторое тестирование с этим модулем, но мы его не используем, просто потому, что нам действительно не нужна функциональность.

Это решает самые большие проблемы с сохранением настроек сайта в базе данных. Однако они не идеальны. . . мы обнаружили модули, которые не поддерживались или поддерживались некорректно.

К сожалению, здесь просто нет хорошего / простого решения. Проблема заключается в нежелательном побочном эффекте архитектуры не только Drupal, но и всех CMS каркасного типа, где приложения определяются как через конфигурацию (т.е. данные, хранящиеся в базе данных), так и через исходный код. Ни один из двух вариантов управления данными конфигурации не подходит. Первое - это то, что вы делаете: определите одну базу данных как каноническую (т. Е. Производственную базу данных) и попросите разработчиков работать локально с моментальным снимком производственной базы данных и «объединить» новую информацию о конфигурации с производственной базой данных с помощью ручной настройки через производственный сайт. интерфейс администратора. В случае четко определенных подсистем, то есть представлений, вы можете воспользоваться преимуществами функций импорта / экспорта, разработанных для упрощения переноса конфигурации именно такого типа. Второй вариант - то есть автоматизация, которую, как я думаю, вы ищете - сложен, но может того стоить - или необходим - для крупных проектов с бюджетом на комплексную автоматизацию проектов: глубоко погрузиться в структуру базы данных системы / модуля и разработать собственные сценарии для объединить новые данные конфигурации на уровне таблицы / записи в производственную базу данных, например, как часть ночной «сборки» последней базы данных. Боюсь, что промежуточного решения просто нет.

Что касается контроля версий для исторического отслеживания данных конфигурации, такой модуль, как backup_migrate, позволяет выполнять автоматические дампы SQL базы данных. Вы можете выбрать, какие таблицы будут выгружаться, указав резервный «профиль», и можете создать такую, которая оставила бы большой контент, таблицы журналирования и кэширования (например, node, cache_content, watchdog) из дампа, чтобы у вас остался более управляемый фрагмент для управления версиями . Некоторые простые сценарии на сервере или в другом месте могут захватить последний дамп и добавить его в ваш репозиторий.

Drupal теперь поддерживает конфигурация экспортируемых файлов, что позволяет вам перенести большую часть конфигурации сайта в код. Возможности экспорта поддерживаются для переменных конфигурации, представлений, типа контента, полей, форматов ввода и т. д. С помощью модуля Особенности.

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

См. Разработка -> Постановка -> Проблема рабочего процесса в Drupal и представление Разработка на основе кода: эффективное использование функций в Drupal 6 и 7.

Другие вопросы по теме