如何在Drupal网站上管理协作开发?


12

我在Drupal网站上与另一位开发人员一起工作。我们一直在努力寻找一种同时在站点的不同部分上工作而不互相干扰的好方法。我们曾尝试在该网站的同一开发实例上工作,但我们经常互相踩脚,或使用一些错误的代码关闭该网站,从而使其他人无法继续工作,直到解决为止。因此,我们已移至单独的开发实例。但是现在将我们的工作合并到该站点的单个实例中是一个很大的痛苦。我们基本上最终会重做共享副本上的所有内容。

我们现在面临的最大问题是如何合并数据库更改,以及如何将数据库包含在源代码控制系统中?这些文件很简单,只需跟踪所有文件(我们使用git)并合并我们的工作,即可在需要时解决冲突。但这实际上不适用于数据库。我们可以提取一个SQL转储并将其包含在git存储库中,但是我们无法真正合并数据库。该功能模块可以帮助一点,让美国出口我们的一些数据库工作纳入然后可以进行版本和合并代码。但是,并非所有功能都支持功能。所以...

  • 我们可以采取什么步骤轻松合并数据库更改?

  • 我们应该如何对数据库进行版本控制(将转储文件放入git中是一种很好的方式)吗?

  • 是否有可用的模块来解决其中一些问题?

  • 或者,我们是否坚持使用网站的同一副本?(请不要)


编辑:在评论中,我们讨论了无法使用功能导出的内容,其中之一是分类法。还有另一个问题要解决


我很好奇,您不能通过功能特别做什么?更好的问题可能是询问如何将这些东西导出为带有或不带有功能的代码,而不是沿数据库合并路线进行。
Decipher

@Decipher我可以想到标志,分类法,菜单,块和实际内容(尽管我相信还有其他模块可以执行此操作)...我认为编写自己的代码导出这些内容是不现实的。然后,每次我想使用不支持功能的新模块时,都必须首先添加对此功能的支持。我没有时间这样做。
Chaulky 2011年

我认为我们应该在Drupalcon进行“功能”冲刺,以尝试为某些缺失的事物增加支持。
coderintherye11年

1
@Decipher好,所以我同意你的说法,有一些方法可以将所有块存储在代码中。但是我仍然认为,必须为我想使用的每个尚不具备的功能添加功能支持。
Chaulky 2011年

1
我从来没有建议过,我只是建议您已经为建议的模块提供了功能支持(假设Flag可通过Strongarm导出)。我并不是要强迫您走这条路,它只是走更艰难的路,比使用数据库方法更容易维护团队中基于代码的方法。在我的团队中,我竭尽所能地劝阻非功能/代码方法。我知道Feature不能做很多事情,除非它是Drupal的核心部分,但它可以做很多事情。
解密

Answers:


5

这是工作流程的更改,但是您应该习惯于处理实时数据库的新转储。有三种方法可以将更改添加到数据库中。

  1. 特征。这并不能解决所有问题,但可以解决您需要的许多事情。
  2. 更新挂钩。当功能无法使用时,您可以将代码硬编码到您拥有的模块的更新挂钩中。
  3. 手动更改。谨慎使用。有些功能或更新钩子并不自然,只有手动操作容易得多。这是不得已的手段,但有时是唯一的方法。

如果你可以的话。一天几次获得一个新的转储并测试您的构建,您应该减少集成问题。


4

我回答了类似的问题,并将稍作调整以在这里回答您的问题。我的根本建议是您有一台开发/登台服务器,其中经常使用连续集成系统(例如,每5分钟)签出代码更改。因此,在您的本地计算机上,您一次只能处理一个功能请求/错误报告,请确保清楚地将这一任务与其他人可能正在处理的任务区分开来,并与您正在研究该任务的队友进行沟通(redmine或其他错误跟踪对此非常有用)。然后,您定期提交更改,并且您的队友也将这些更改下拉到开发/登台服务器。理想情况下,您要在连续集成系统中内置单元测试(顺便提一下,强烈建议为此使用luntbuild或QuickBuild,但Hudson也可以使用)。检入代码后,CI系统或测试可以自动处理可能引入的任何冲突。如果需要更改内容(非代码),请在开发/登台服务器上进行。

至于数据库部分,我在这里基本上采用了两种思想流派(第三种思想流派,进行数据库比较,由于复杂度很高,我不予讨论)。

1)通过删除生产数据库并导入开发数据库的mysqldump进行部署。(可选)预先在引用SQL转储中的dev URL的任何硬编码绝对链接上运行正则表达式查找/替换。将dev db导入prod中后,之后自动运行SQL语句(通常通过脚本)以更改prod与dev不同的任何设置(例如,可能变量表中有一些连接设置,用于连接到您需要的外部系统)更改以指向产品外部系统而不是开发版本)。

2)如budda所述,将功能模块用于管理员设置,并将节点导出模块与内容删除模块一起用于内容导出/导入。所以工作流程是:

使用node_export和features将节点/功能导出到文件中(可选)(希望是)版本控制在产品系统上加载文件使用drush或admin界面加载功能使用drush delete-all或admin界面删除要导入类型的所有节点使用drush ne-import或管理界面从导出的节点文件中导入节点。值得一提的是,我强烈建议您采用一种标准的工作流程,其中的内容只能朝一个方向发展。开发->产品或产品->开发(我更喜欢这个)。

我已经这样做了,并且正在某些大型系统上这样做,效果相当不错,但是总会有很多方法可以切成这个苹果,选择哪种方法最适合您。


0

虽然这是一个老生常谈的问题,但答案仍然可以接受,但我认为仍然有另一个问题。

首先,让我先说一下,我认为“ 功能”并不是完成此任务的正确工具,而是应提出一套替代工具。

团队协作的先决条件是拥有一个临时服务器,用于测试与生产服务器分开的项目开发版本。所有开发代码都在登台服务器上进行测试,并且只有在稳定并准备好部署时才推送到生产服务器。但是,开发人员不能直接在登台服务器上工作。每个开发人员都在自己的工作站上工作,使用版本控制和源代码管理(SCM)将其工作与团队的其他成员协调。

SCM系统允许团队成员在代码的不同分支上并行工作,而不会互相干扰。为了测试目的,只有分支部署在登台服务器上。

为了在生产,暂存和工作站之间镜像数据库,有一个名为“ 备份和迁移”的模块,如果您在共享主机上而不管理自己的数据库,则可以使用该模块。如果您要管理自己的数据库服务器,则这是该服务器上的唯一项目,并且使用mysql,以下命令对非常方便:

转储:

mysqldump --all-databases --opt -u root -p > DUMP.sql

恢复:

mysql -u root -p < DUMP.sql

如果您的数据库不是该服务器上唯一的数据库,请对仅转储数据库的某个版本的脚本mysqldump(如果不使用mysql,则编写等效脚本)。

制定一个策略,使它是生产服务器上的主数据库。登台服务器和工作站应该是生产数据库的副本,反之亦然。

请注意,Drupal 7将其所有管理员设置保留在数据库中。这意味着在生产站点,登台站点和工作站之间镜像数据库将迁移没有功能的 admim设置。

现在,共享代码:

在开发团队的成员之间共享代码的标准方法是使用SCM系统。Drupal碰巧默认使用git这样的系统进行管理。

Git允许使用本地或远程存储库。如果团队成员位于相同的物理空间中,则可以在登台服务器上设置本地存储库。如果它们在地理上分布,则可以设置一个远程存储库。如果您不介意其他人对正在开发的代码具有读取权限,则可以使用Drupal.org上的沙箱作为远程存储库。您还可以在GitHub上使用项目区域。 GitHub不仅是一个存储库,而且还提供了一些协作工具,并允许公共和私有存储库。

基本上,SCM系统允许团队成员从团队成员共享的存储库中提取源代码和文档,并在对其进行处理后再次将其推回。SCM会跟踪更改,如果发生冲突(例如,有人试图推送不包含其他团队成员已进行的更改的代码),它将告诉您并提出解决此冲突的方法。

通常,通过与团队成员之间如何分配任务的亲切沟通,不会有冲突。但是,通过SCM系统跟踪事件,即使发生错误或通信失败,也可以解决冲突。

有很多关于git(GIYF)入门和使用的教程。我将推荐两个:git-scm网站和Scott Chacon的Pro Git

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.