2008-11-26 45 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 &實時服務器 - 如果您有開發人員在舞臺上沒有記錄的變化,你被搞砸了。如果您的Staging定期與Live &同步,則必須遵守(常識)政策,對Staging進行的唯一更改是在Dev &中制定的內容在移至Live之前進行測試,您可能會獲得更多成功。

5

對於基本數據同步:我使用mysqldump將所有數據在夜間轉儲到.sql文件。該腳本然後將其檢入到版本控制系統中。這是在一個簡單的bash腳本cronned,但你可以在幾乎任何平臺上做類似的事情...

我剛讀了一點,我不知道如果我的方法會幫助。我從來不需要合併SQL轉儲,因此我無法評論它的管理效率。

儘管您應該能夠將更改(模式,新數據)推送到暫存/生產服務器,但您可能會有更多麻煩將更改拖回到開發中。正如我所說 - 合併可能或不可能。我只是不知道。

0

使用數據庫版本控制系統。爲此,您需要數據庫中的VersionInfo表以及xml格式的所有sql ddl和dml查詢以及版本信息。現在,您只需一個簡單的.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和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; 
} 
相關問題