33

在标准 php 或基于源代码的项目中,我们可以轻松地将所有代码保存在 SVN 中,每个开发人员都可以签出他们自己的副本并就相同的代码进行协作。

然而,在开发 Drupal 站点时,大部分工作都在“设置”中。除了主题和模块之外,您实际上没有任何“源代码”。您如何运行同一站点的多个实例,以便开发人员可以同时工作并共享他们的工作?

示例场景:

我们启动了一个 Drupal 站点的初始版本,其中创建了内容类型“X”。我们最初还在网站上启动了一个视图,该视图按时间顺序列出了所有类型为“X”的节点。客户开始使用网站,添加内容、菜单项等。

下一个版本计划为该视图添加用户搜索功能。但是,该设置包含在数据库中。我们可以将生产数据库复制到我们的开发版本,以在我们更改视图时获取最新数据。然而,在那段时间里,客户端仍然可以更新站点,使我们的开发数据库不同步。当我们准备将新视图推送到生产环境时,除了手动重复在生产安装中设置它的步骤之外,还有更简单的方法吗?

4

7 回答 7

12

我认为这里的一个好策略是使用安装配置文件 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;
} 
于 2009-01-05T20:43:50.197 回答
11

不久前,我写了一篇关于使用 CVS 和 Subversion最佳实践的无痛 Drupal 修订控制的文章。

不幸的是,正如您所指出的,仍然存在源代码控制数据库的问题。有一些建议的方法,我在另一篇文章中提到。

于 2008-11-12T03:33:37.980 回答
7

将 Drupal 设置从数据库转换到代码中一直在突飞猛进。在这个领域真正有帮助的两个模块是:

功能- 允许您将内容类型、分类法、视图甚至提要等实体聚集在一起。我们非常成功地使用了它,并且可以在开发人员之间共享这些更改。

Strongarm - 允许使用上述模块存储和导出变量。我已经用这个模块做了一些测试,但我们没有使用它,很简单,因为我们真的不需要这个功能。

这些解决了将站点设置保存在数据库中的最大问题。然而,它们并不完美。. . 我们发现不支持或不正确支持的模块。

于 2010-07-10T00:30:51.427 回答
1

如果您使用svn:externals属性,您可以免去一些配置和使用 SVN 的痛苦,如 Nick 的文章中所述。这将使您的本地版本的 Drupal 自动与指定的 Drupal 分支保持同步,并且您可以对模块使用完全相同的机制。此外,因为 SVN 会从文件中读取外部定义,所以您也可以将它们置于版本控制之下!

我不认为 CVS 具有等效的功能。然而,很容易编写一个简单的脚本来自动安装 Drupal 模块,只需要一个 URL(我这样做是为了让我自己的 Drupal 站点保持最新)。

就数据库版本控制而言,这是一个更棘手的问题。我建议将“库存” Drupal 数据库导出到 SQL 文件并将其置于版本控制之下。每个开发人员都可以使用自己的本地私有数据库服务器。然后,您可以提供一个脚本,将指定的数据库恢复为 SQL 文件中包含的库存版本。

作为如何以其他方式解决此问题的示例,我将描述工作中的情况。我在一个网络应用程序上工作;它不使用数据库,因此不会遇到这些问题。我们解决站点重复设置的方法是从源代码控制中重建,并提供一个程序来实现站点的自动部署。我们的客户也使用该程序作为他们创建网站的方式。

于 2008-11-13T21:12:33.000 回答
1

CCK 和 Views 等一些模块允许将其设置数据作为文本导出和导入。您可以将这些文本表示形式保存在源代码控制系统下。

于 2008-12-16T15:42:58.223 回答
1

不幸的是,这里没有一个好的/简单的解决方案。这个问题不仅是 Drupal 架构的一个不幸的副作用,而且是所有框架类型的 CMS,其中应用程序通过配置(即存储在数据库中的数据)与通过源代码定义一样多。管理配置数据的两个选项都不是很好。首先是您正在做的事情:将单个数据库定义为规范(即生产数据库)并让开发人员在本地使用生产数据库的快照并通过生产站点的手动配置将新配置信息“合并”到生产数据库中管理界面。在定义良好的子系统(即视图)的情况下,您可能能够利用为简化这种配置迁移而开发的导入/导出功能。第二种选择——即 我认为您正在寻找的自动化 - 很困难但可能值得 - 或需要 - 对于具有复杂项目自动化预算的大型项目:深入研究系统/模块数据库结构并开发自定义脚本以合并新的配置数据例如,作为最新数据库的夜间“构建”的一部分,表/记录级别进入生产数据库。恐怕没有任何中间解决方案。

在配置数据历史跟踪的版本控制方面,像 backup_migrate 这样的模块允许您执行数据库的自动 SQL 转储。您可以通过定义备份“配置文件”来选择转储哪些表,并且可以创建一个将大内容、日志记录和缓存表(例如节点、缓存内容、看门狗)留在转储之外的表,这样您就剩下一个更易于管理的版本控制块. 服务器或其他地方的一些简单脚本可以获取最新的转储并将其添加到您的存储库中。

于 2011-04-07T16:11:25.820 回答
0

Drupal 现在支持可导出配置,允许您将大部分站点配置移动到代码中。借助features模块,可导出配置变量、视图、内容类型、字段、输入格式等。

您还可以通过中央控制器配置文件或模块管理初始的、不可导出的配置和配置更改。使用它来启用模块、创建用户等。

请参阅Drupal 中的开发 -> 暂存 -> 生产工作流程问题代码驱动的开发:在 Drupal 6 和 7演示文稿中有效使用功能。

于 2011-04-07T18:58:58.153 回答