2008-11-26 4 views
6

У меня есть возможность создавать веб-сайты Drupal с использованием среды разработки, промежуточной и производственной среды. Сохранение кода в синхронизации между сайтами - простая задача с использованием подрывной работы. Не так просто распространять изменения в данных базы данных (а не только на схему) между установками.Как синхронизировать данные во время развертывания?

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

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

Есть ли инструмент, который будет делать это? Каков ваш процесс для работы с одним или несколькими разработчиками в таком проекте?

+0

возможно дубликат [Drupal Стратегия управления Источник?] (Http://stackoverflow.com/questions/282858/drupal-source-control-strategy) – gnat 2012-11-16 13:41:29

+0

См [предыдущие ответы на этот вопрос] (http://stackoverflow.com/questions/282858/drupal-source-control-strategy) – Eli 2008-11-26 17:36:36

ответ

2

Вокруг здесь мы довольно сильно отклонили CCK для использования в прототипах и v.simple типах узлов. Не стоит головной боли пытаться отделить «конфигурацию» от «контента» в базе данных. Там есть всевозможные способы, чтобы вы могли синхронизировать вещи, но, короче говоря, если он не находится в файле или не дает вам возможность экспортировать его в один, вам будет больно. (В качестве дополнительного бонуса экспорт ваших представлений в файл будет немного быстрее, чем вытаскивание его из базы данных каждый раз при его использовании.)

Вы упомянули Dev, Staging & Живые серверы - если у вас есть разработчики недокументированные изменения в постановке, вы ввернуты. Если вы регулярно выполняете синхронизацию с Live &, то проверяйте (здравый смысл), что только изменения, внесенные в Staging, проверяются до того, как они были обработаны в Dev &, вы можете добиться большего успеха.

5

Для синхронизации основных данных: я использую mysqldump для вывода всех данных в файл .sql в ночное время. Затем скрипт проверяет его на систему управления версиями. Это вызвано простым сценарием bash, но вы можете сделать что-то подобное практически на любой платформе ...

Я только что прочитал немного, и я не уверен, поможет ли мой метод. Мне никогда не приходилось объединять дамп SQL, поэтому я не могу прокомментировать, насколько эффективно он управляется.

В то время как вы должны иметь возможность выталкивать изменения (схемы, новые данные) на сервер промежуточной/производственной деятельности, у вас может возникнуть больше проблем с переносом изменений в dev. Как я говорю - слияние может быть или не быть возможно. Я просто не знаю.

0

Используйте систему управления версиями баз данных. Для этого вам нужна таблица VersionInfo в базе данных и все ваши запросы sql ddl и dml в формате xml вместе с информацией о версии. Теперь вы просто простой инструмент .net, который будет проверять таблицу VersionInfo и запускать все запросы из xml, которые добавляются после этой версии, и обновлять версию до текущей версии versionInfo.

1

Я попытался ответить, как я это делаю в другом вопросе. Я также опубликую его здесь

Я думаю, что хорошая стратегия здесь заключается в использовании 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 и виды поддерживают этот подход. Смотрите этот фрагмент кода

// 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; 
}