如何管理Drupal网站上的协作发展? -- 7 领域 drupal 相关 的问题

How do I manage collaborative development on a Drupal site?


12
vote

问题

中文

我在Drupal网站上使用另一个开发人员。我们一直在努力在没有彼此的情况下同时找到在网站的不同部分工作的好方法。我们已经尝试过在网站的同一开发实例上工作,但我们经常踩到其他人脚趾,或者用一些不好的代码延续网站,使其无法继续工作,直到它得到解决。所以我们搬到了分开的开发实例。但现在将我们的工作合并到网站的单一实例中是一个很大的痛苦。我们基本上最终重新编写了共享副本的所有内容。

我们现在的最大问题是我们如何合并数据库更改,以及我们如何在源控制系统中包含数据库?文件很容易,只是跟踪所有(我们使用git)并合并我们的工作,解决所需的冲突。但这并没有真正与数据库合作。我们可以拍摄SQL转储并将其包含在Git存储库中,但我们无法真正合并数据库。 功能模块有助于一点,让我们将一些数据库转发成代码,然后可以是版本的并合并。但是,甚至没有接近一切支持功能。所以...

  • 我们可以轻松地合并数据库更改的哪些步骤?

  • 我们应该如何版本数据库(将转储文件放在git中的好方法)?

  • 是否有可用的模块,有助于其中一些问题?

  • ,或者,我们是否陷入了在网站的相同副本上工作? (请否)


编辑:在评论中,我们讨论了无法使用功能导出的东西,其中一个是分类。还有另一个涉及它的问题,这些问题涉及。

英文原文

I work with another developer on a Drupal site. We have struggled to find a good way to work on different parts of the site at the same time without getting in each others way. We've tried working on the same development instance of the site, but we often step on each others toes, or bring down the site with some bad code making it impossible for the other to continue working until it's resolved. So we've moved to separate development instances. But now it's a big pain to merge our work into a single instance of the site. We basically end up redoing everything on a shared copy.

The biggest problem we have now is how do we merge database changes, and how do we include the database in our source control system? The files are easy, just track them all (we use git) and merge our work, resolving conflicts where needed. But this doesn't really work with the database. We can take a SQL dump and include that in our git repository, but we can't really merge the databases. The Features module helps a little, letting us export some of our database work into code which can then be versioned and merged. However, not even close to everything supports Features. So...

  • What steps can we take to easily merge our database changes?

  • How should we version the database (is putting a dump file in git a good way to do it)?

  • Are there any modules available that help with some of these problems?

  • Or, are we stuck with working on the same copy of the site? (please so no)


Edit: In the comments we discussed what things can't be exported with Features and one of them was Taxonomies. There's another question that deals with that.

  
         
         

回答列表

5
 
vote
vote
最佳答案
 

是一个工作流程,但你应该习惯于在现场DB的新鲜转储上工作。有三种方法可以将变化变为dB。

  1. 功能。这不会为一切工作,但是对于您需要的很多东西都会适用。
  2. 更新挂钩。当功能不起作用时,您可以将代码内容硬于您拥有的模块的更新挂钩。
  3. 手动变化。使用谨慎使用。有些事情并非自然而然地用于特征或更新挂钩,并且手动更容易。这是一个最后的度假胜地,但有时是唯一的矛盾方式。

如果可以。每天几次获得新鲜的转储并测试您的构建,您应该具有较少的集成问题。

 

It is a workflow change but you should get used to working on a fresh dump of the live DB. There are three ways to get changes into the DB.

  1. Features. This won't work for everything but will for a lot of things you need.
  2. update hooks. When features won't work you can hard code things into an update hook of a module you own.
  3. Manual changes. Use sparingly. Some things don't come naturally to features or update hooks and are just much easier to do manually. This is a last resort but sometimes is the only piratical way.

If you can. Several times a day get a fresh dump and test your build, you should have less integration problems.

 
 
4
 
vote

我回答了类似的问题,我将在这里稍微调整它以回答你的问题。我的根建议是您有一个开发/登台服务器,其中使用持续的集成系统频繁地检查代码更改(例如,每5分钟)。因此,在您的本地机器上,您一次只能在一个功能请求/错误报告上工作,肯定会清楚地描绘其他人可能正在努力和沟通您正在努力的队友(Redmine或Redmine或其他错误跟踪对于此而言很棒)。然后,您将定期提交更改,并将其拉到DEV / Staging Server,如您的队友。理想情况下,您的持续集成系统内置单元测试(顺便推荐Luntbuild或Quickbuild,但Hudson也有效)。 CI系统或测试可以自动接收您在您的代码中尽快引入的冲突。如果您需要制作内容(非代码)更改,则在DEV / Stage Server上执行此操作。

到数据库部分,我基本上采用了两所思想学校(第三所思想,做数据库差异,我不会讨论,因为复杂性相当高)。

1)通过删除生产数据库,然后导入开发数据库的MySqldump。可选地,在任何硬编码的绝对链接上运行Regex查找/替换,在SQL转储中引用DEV URL的任何硬编码的绝对链接。将DEV DB导入PROD后,之后自动运行SQL语句(通常通过脚本)以便更改PROD的任何设置,而不是dev(例如,您在变量中有一些连接设置,用于连接您需要的外部系统更改为Prod外部系统而不是DEV版本)。

2)使用特征模块,如budda为管理设置,并使用节点导出模块与删除所有模块组合的内容导出/导入。所以工作流程是:

使用node_export和功能将节点/功能导出到文件 可选(和希望)版本控制 在Prod系统上加载文件 使用DRUSH或ADMAD接口加载功能 使用DRUSH DELETE-ALL或ADMAD接口删除要导入的类型的所有节点 使用DRUSH NE-导入或管理界面从导出的节点文件中导入节点。 一个注意事项,我很高度建议采用标准工作流程,其中内容仅进行一个方向。 dev - >刺激或刺激 - >开发(我更喜欢这个)。

我已经完成了这一点,我在一些大系统上做到这一点,结果相当好,但总会有很多方法切片这个苹果,选择哪种方式最适合你。

 

I answered a similar question and am going to adjust it slightly to answer your question here. My root suggestion is that you have a development/staging server where code changes are checked out using a Continuous integration system on a frequent basis (e.g., every 5 minutes). Thus, on your local machine, you only work on one feature request/bug report at a time, being sure to clearly delineate this task from others that people might be working on and communicating to your teammates that you are working on it (redmine or other bug tracking is great for this). Then, you commit changes on a regular basis, and they get pulled down to the dev/staging server, as do your teammates. Ideally, you have unit tests built into your continuous integration system (highly recommend luntbuild or QuickBuild for this by the way, but Hudson also works). The CI system or tests can automatically pick up on any conflicts you might have introduced as soon as you check in your code. If you need to make content (non-code) changes, you do so on the dev/staging server.

As to the database portion, I've adopted basically two schools of thought here (a 3rd school of thought, doing database diffs, I won't discuss because the complexity is quite high).

1) Deploy by dropping the production database, and importing a mysqldump of the development database. Optionally, run a regex find/replace beforehand on any hard-coded absolute links which reference the dev URL in the SQL dump. After importing the dev db into prod, automatically run SQL statements (usually via script) afterwards to change any settings that are different for prod than dev (e.g., maybe you have in variables table some connection settings for connecting to external systems that you need to change to point at prod external systems instead of at the dev version).

2) Use the Features module, as mentioned by budda, for admin settings, and use the Node Export module for content export/import in combination with the Delete All module. So workflow is:

use node_export and features to export nodes/features to files Optionally (and hopefully) version control Load files on prod system Use drush or admin interface to load features Use drush delete-all or admin interface to delete all nodes of the types you want to import Use drush ne-import or the admin interface to import the nodes from the nodes file you exported. One note, I would highly suggest adopting a standard workflow, where content goes one direction only. Either Dev -> Prod or Prod -> Dev (I prefer this one).

I've done this, and am doing this on some big systems, with fairly good results, but there will always be many ways to slice this apple, choose whichever way works best for you.

 
 
0
 
vote

虽然这是一个旧的问题,具有接受的答案,我相信另一个仍有空间。

首先,让我说到前面我不认为功能是这个任务的合适工具,并建议替代的工具组。

团队协作的先决条件是具有用于测试与生产服务器分开的项目的开发版本的暂存服务器。所有驱动器代码都在暂存服务器上进行了测试,只有在稳定并准备部署时才被推到生产服务器。但是,开发人员无法直接在登台服务器上工作。每个开发人员在自己的工作站上工作,使用修订控制和源代码管理(SCM)来协调他或她与团队的其余部分工作。

SCM系统允许团队成员在代码的不同分支上并行工作,而不会互相干扰。只有 master 分支部署在暂存服务器上以进行测试。

要镜像生产,暂存和工作站之间的数据库,有一个名为备份和迁移如果您在共享托管并且不管理自己的数据库中,可以使用。如果您正在管理自己的数据库服务器,这是该服务器唯一的项目,您使用 MySQL ,以下命令是方便的:

转储:

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

要恢复:

  mysql -u root -p < DUMP.sql   

如果您的服务器不是该服务器上唯一的数据库,则脚本某些版本的 mysqldump (或者如果您不使用 MySQL ),则只能转储数据库。

制作它是Master的生产服务器上的数据库。暂存服务器和工作站应该是生产数据库的副本,而不是反之亦然。

请注意,Drupal 7保留数据库中的所有管理设置。这意味着镜像生产站点,暂存站点和工作站之间的数据库将迁移Admim设置而不功能

现在,用于共享代码:

开发团队成员之间共享代码的标准方式是使用SCM系统。 Drupal恰好被默认使用这样一个名为 git

git 允许使用本地或远程存储库。如果团队成员位于同一物理空间中,则可以在暂存服务器上设置本地存储库。如果它们正在地理位置地传播,您可以设置远程代码库。如果您不介意在开发中的代码中读取访问权限,则可以使用 沙箱 在drupal.org作为远程存储库。您还可以在 github 上使用项目区域。 github 不仅是一个存储库,而且还配有一些协作工具,并允许公共和私人存储库。

基本上,SCM系统允许团队成员从团队成员共享的催名应用程序中提取源代码和文档,并在处理它后再次推回。 SCM会跟踪更改,如果存在冲突(即某人试图推送不包含更改的代码另一个团队成员承诺),它将告诉您并建议解决这一冲突的方法。

通常,通过一些关于任务在团队成员之间分割的态度,不会发生冲突。但随着SCM系统跟踪事物,即使进行错误或通信失败,冲突也可以管理。

在使用 git (giyf)开始时存在大量教程。我将推荐两个我是: git-scm 网站和 pro git 由斯科特·卡卡逊。

 

While this is an old question with an accepted answer, I believe that there is still room for another one.

First, let me say up front that I don't think Features is the right tool for this task, and shall propose an alternative set of tools.

A prerequisite for team collaboration is to have a staging server for testing out development versions of the project that is separate from your production server. All devlopment code is tested at the staging server, and only pushed to production server when it is stable and ready for deployment. However, the developers doesn't work directly at the staging server. Each developer work at his or her own workstation, using a revision control and source code management (SCM) to coordinate his or her work with the rest of the team.

The SCM system allow team members to work in parallel on different branches of the code without interfering with each other. Only the master branch is deployed on the staging server for testing purposes.

To mirror the database between production, staging and workstations, there is a module named Backup and migrate that can be used if you're on shared hosting and not managing your own database. If you're managing your own database server, this is the only project on that server, and you use mysql, the following pair of commands are handy:

To dump:

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

To restore:

mysql -u root -p < DUMP.sql 

If yours is not the only database on that server, script some version of mysqldump (or equivalent if you're not using mysql) that dumps your databases only.

Make a policy that it is the database on the production server that is master. The staging server and workstations should be a copy of the production database, not vice versa.

Note that Drupal 7 keeps all its admin setting in the database. This means that mirroring the database between the production site, staging site and workstations will migrate admim settings without Features.

Now, for sharing the code:

The standard way for sharing code among the members of a development team is to use SCM system. Drupal happens to be default be managed with such a system named git.

Git allows the use of local or remote repositories. If the team members are located in the same physical space, you can set up a local repository on your staging server. If they're spread geographically, you can set up a remote repositiory. If you don't mind others having read access at your code under development, you can use a sandbox at Drupal.org as a remote repository. You can also use a project area on GitHub. GitHub is not only a repository, but comes with a some tools for collaboration, and allows both public and private repositories.

Basically, a SCM system allow team members to pull source code and documentation from the respository shared by the team members, and push it back in again after having worked on it. The SCM keeps track of changes and if there is a conflict (i.e. somebody tries to push code that doesn't the contain the changes another team member has committed), it will tell you and also suggest a way to resolve this conflict.

Usually, with some cordial communication about how the tasks are divided among the members of the team, there will be no conflicts. But with the SCM system keeping track of things, conflicts become manageable even if mistakes are made or communication fails.

There exists a lot of tutorials on getting started with and using git (GIYF). Two I will recommend are: the git-scm website and Pro Git by Scott Chacon.

 
 

相关问题

4  如何使用子主题覆盖主题的Template.php的单一函数?  ( How to override single function of themes template php using sub theme ) 
目标: drupal 7子主题开发 我不想覆盖整个template.php文件。我只是想覆盖template.php文件的单一函数。 ...

5  使用数据库的良好做法  ( Good practices working with databases ) 
我正在学习drupal,我想开发一个网站,主要是它的数据库。 我已经拥有数据库的扩展实体关系模型(类型的复杂)。 在创建要由drupal使用的数据库时,采取的正确方向是什么,创建它手动,并使用php在drupal中进行查询,因为它是从头开始的php + mysql站点? Drupal是否提供了更容易的方法来做这件事?...

17  如何在有多个功能有多个功能时选择要使用的模块?  ( How do i choose which module to use when there are several options for the same ) 
它并不罕见,找到提供基本相同的功能的多个模块。例如,有许多垃圾邮件控制模块提供极为相似的功能(例如, spamicide 和)。并且有很多不同的分类模块可以做类似的事情。因此,当多个模块满足我的要求时,我应该如何选择使用哪一个? ...

5  如何每次查看节点时执行操作?  ( How to perform an operation every time a node is viewed ) 
在编写模块时,我如何每次用户查看节点时执行一次操作? ...

0  如何生成一个列表,其中包含哪些空格?  ( How to generate a list of which features are enabled in which spaces ) 
我正在使用有机组,特征和空格运行一个Drupal 6.x站点,我对生成一个空格启用的空格的列表有兴趣。优选地,具有沿Y轴的空间的表,以及沿X轴的特征。 关于如何生成此的任何想法?我可以使用视图生成组空间列表,但无法找到已启用功能的字段。 ...

5  批量保存节点与文件字段  ( Bulk saving nodes with a file field ) 
我正在为笨拙网站创建批量上载函数的进度。使用Flash我能够将文件上传到应该能够处理文件的特定URL。 我想做什么,不仅仅是上传文件,而是使用保存到已使用CCK设置的文件字段的文件创建特定类型的节点。由于这些是音频文件,因此文件字段处理文件是重要的,因此可以使用GetID3模块提供其他元数据。 我看了代码/ doc,...

3  如何处理博客标签在贡献主题中?  ( How to handle blog tags in a contrib theme ) 
在博客或博客的网站中,分类通常用于标签和类别。 在Drupal 6中,Node.TPL.php文件可以使用$分类系统,如果它们需要访问与当前节点相关联的UnRended分类链接数组。该变量通常是通过Control主题假设来包含帖子标记和或类别,并且相应地呈现。 在Drupal 7中,$分类学不再可用。 是什么选择...

11  hook_preprocess_page():如何讲述视图页面?  ( Hook preprocess page how to tell a views page ) 
im写一个需要在视图页面中插入一些javascript和css文件的自定义模块。 im使用hook_preprocess_page,但我无法判断当前页面是否来自视图: function mymodule_preprocess_page(&vars) { var_dump($vars); //outpu...

5  Field API与自定义代码  ( Field api versus custom code ) 
如果我需要仅为用户配置文件添加自定义字段,它是否更好地创建使用字段API的模块,或者使用自己的代码以自定义URL显示自定义字段的模块,并保存数据在自己的数据库表中? 字段API无法实现决定哪些字段可对其用户可见的权限;是足以实现自定义代码的原因? ...

5  视图幻灯片VS列表视图+ jQuery Cycle Lite?  ( Views slideshow vs list viewjquery cycle lite ) 
在我的工作站主页上的旋转图像是以列表格式的视图创建。我正在使用 jquery循环Lite 插件,用于旋转效果。 CycliT.Lite.js文件在我的主题的.info文件中的脚本数组中设置,页面中有一点代码.TPL.php检查这是否是主页,如果是,则设置旋转器。< / p> 现在我正在第二个旋转器用于另一个部分,我一...

3  如何使功能仅适用于某些空格?  ( How to make a feature available only to certain spaces ) 
对于Drupal 6开放式庭院站点(即,功能,空格,有机组)我正在运行,我创建了一些自定义功能,只能真正适用于站点上的数百个群体。 它代表,"自定义功能" 配置屏幕显示所有的功能,包括那些我想故意限制到几个特殊群体的那些。 预防每个小组提供这些特殊功能的最佳方法,同时保留了特殊组上的这些功能? ...

4  在子域之间共享登录  ( Login shared between subdomains ) 
如果我应该允许用户使用相同的用户名/密码登录,在以下解决方案之间选择时,我应该考虑什么? 安装,并使用面包店单点登录系统在主站点上,以及所有子域。 共享包含用户数据的数据库表。 ...

3  如何追溯应用Mollom垃圾邮件过滤?  ( How to retroactively apply mollom spam filtering ) 
我被要求清理几年运行的网站,除了大量有效内容之外还累积了一些垃圾邮件。 我刚刚在网站上安装了Mollom,以帮助减少未来的垃圾邮件帖子;但是有些方法可以让Mollom过程已经发布到网站上的内容,并为我的评论销售潜在的垃圾内容(而不是单独查看全部有效内容的所有)? ...

4  直接调用Mollom Captcha  ( Invoke mollom captcha directly ) 
我在ctools form向导中有一个自定义表单,我想使用mollom。有没有API函数,我可以用来将它放在该页面上的表单API中? ...

2  gmap视图模块 - 弹出窗口太大了  ( Gmap views module popups are too big ) 
我正在使用gmap模块及其视图对应。我拥有的问题是,我正在使用自定义文本字段来显示以我从查询中删除的HTML包裹的字段。但是,弹出窗口不会正确尺寸;它最终太大了。这是我的自定义文本字段的代码: <div id="col1"> [field_thtr_img_fid] </div> <div id="col2"...

2  在哪里插入额外的注销功能的最佳位置?  ( Where is the best place to insert additional logout functionality ) 
在用户注销的情况下插入附加逻辑可能会在user.pages.inc中查看 function user_logout() .inc。此代码在核心模块中,您不应该编辑它,但工作得很好...例如,通过将以下代码添加到'user_logout()'函数的顶部... $last_run = variable_get('...

9  以编程方式冒充另一个用户,而不会导致当前登录用户退出  ( Programmatically impersonating another user without causing the currently logged ) 
如何更改全局 $user 的值,执行自己的代码,并恢复 99887664 的原始值,而不会导致当前用户注销如果发生错误? ...

16  模块如何检测输出“访问拒绝”页面?  ( How can a module detect when the access denied page is output ) 
模块如何检测Drupal输出"访问被拒绝" 页面时? 我知道如何用Drupal 6来做;我需要知道如何用Drupal 7进行。 ...

3  如何自动突出显示页面上显示的代码的语法?  ( How to automatically highlight syntax of code displayed on page ) 
我正在开发一个网站,用于从不同的编程语言发布我的代码。我想突出用不同颜色的代码语法。但是,手动这样做是耗时的。 是否有任何模块或方法可以自动执行此操作?严格,它应该以CSS方式完成。 ...

1  自定义SQL:NodeReference Joins和最新视频  ( Custom sql nodereference joins and latest vid ) 
我有一个构成自定义SQL查询的时间。 查询有多个Nodereference,需要返回最新的节点修订版。 我理解得很好,但由于某种原因,返回最新版本的额外复杂性正在绊倒我。 我宁愿通过创建视图并以编程方式执行它们,仅仅因为 WHERE 条款的复杂性,就会以编程方式执行它们。 我已经尝试翻译等同的视图的输出,但是对视图粘...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.