Drupal专业开发指南 第21章 Drupal开发最佳实践(2)

利用版本控制

             

                      译者:老葛        ESKALATE 科技公司

 

 

版本控制对于任何软件项目都是必须的,同样对于Drupal社区也不例外。版本控制追踪Drupal中的每个文件的所有的修改。它保存了每个版本的历史信息以及作者。你可以明确的得到一个,关于谁修改了在什么时间以及为什么修改的报告。版本控制也可以简化向公众发布一个新版本的流程。Drupal社区使用经过锤炼的可靠的CVS软件来维护它的版本历史。

版本控制的好处不仅仅适用于管理Drupal工程。你也可以利用Drupal的CVS来帮助维护你的基于Drupal的工程并且能极大的提高你的维护成本。首先,你需要改变一下你安装Drupal的方式。

 

安装带有CVS的Drupal

当你从drupal.org的下载页面下载了Drupal的压缩包时,代码的这一副本完全没有了版本信息,而版本信息可以用来通知你关于你的代码的当前状态。

 

使用CVS的开发者可以快速的找到关于版本问题和应用更新的答案,而其他的开发者仍然需要下载新的版本。

 

 

注意 两种下载Drupal的方式的唯一看得见的区别是,使用CVS检出的版本包含了一个名为“CVS”的额外的文件夹,Drupal中的所有目录里面都包含一个这样的文件夹,用来存放CVS信息。Drupal的.htaccess文件包含了一组规则,如果你使用的是Apache的话,这些规则可用来自动屏蔽掉这些文件夹(一些CVS客户端比如TortoiseCVS能够自动隐藏CVS文件夹)。

 

可能会有人告诉你CVS版本的Drupal用起来并不安全,而且使用CVS获取的最新代码也不稳定。这是一个常见的误解,也是对两个概念的混淆。这些人在这里提到的是一个工程的HEAD版本,在这一Drupal版本中(或者使用CVS的其他工程),正在测试新的特性以准本发布下一个版本。而CVS可用来同时维护一个软件的HEAD版本和所有的稳定版本。

 

使用带有CVS的Drupal

 

那么使用Drupal的这个奇特的CVS检出版本能够带给你哪些好处呢?

 

你可以对Drupal内核应用安全更新,在官方的安全通知发布以前你就可以进行了。我们不是已经提到了更新是件很容易的事情么?不需要下载Drupal完整的最新版本,你只需要简单的运行一个简洁的CVS命令就可以了。

 

能够维护对Drupal代码的定制化修改。修改Drupal的内核是最不应该做的事情,但是如果你必须修改它的话,那么修改时要用CVS。即便是你修改了核心文件,CVS也将聪明的帮你更新代码,这样在更新流程中你就不会在不经意间将你定制的修改覆盖掉了。

 

你也可以使用CVS来发现其他开发者对Drupal核心文件所做的修改。如果你的Drupal工作拷贝与Drupal服务器上干净的代码相比,存在任何不同的话,你可使用一个简单的命令,为这些不同生成一个逐行的列表。

 

使用CVS:安装一个CVS客户端

在命令行中运行下面的命令来测试是否安装了CVS客户端:

$ cvs

 

如果你收到了一个“Command not found ”(“命令不存在”)的错误,你可能就需要安装一个CVS客户端。Windows用户可以看一下TortoiseCVS(http://tortoisecvs.sourceforge.net/)。而Mac用户可参看这篇文章http://developer.apple.com/internet/opensource/cvsoverview.htmlLinux用户,你应该自己知道做什么。

 

如果运行了这个cvs命令以后,你看到输出了下面的CVS文档,那么说明你已经安装了CVS客户端!

Usage: cvs [cvs-options] command [command-options-and-arguments]

 

 

CVS检出Drupal

 

我们将如何在命令行中使用CVS。现在有许多图形化的CVS客户端,学会了这些基本的指令以后,你应该很容易的操纵这些基于图形化的CVS客户端。

 

CVS行话来说,你将需要从集中的CVS资源库中检出一个Drupal的工作拷贝。这可能有点唠叨,但是我们想为你多准备几个新的术语。使用下面的命令就能从CVS服务器上获取Drupal5:

 

cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout –d

~/www/drupal5 -r DRUPAL-5 drupal

 

让我们来分解这个命令。cvs执行一个CVS客户端;也就是说它在你的计算机上运行一个名为cvs的程序:

 

cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout –d

~/www/drupal5 -r DRUPAL-5 drupal

 

cvs中的选项 –d代表着“目录”(“directory”),它用来声明CVS资源库的位置:

 

cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout –d

~/www/drupal5 -r DRUPAL-5 drupal

 

一个资源库,用CVS的话来说,就是一个使用CVS维护的所有文件的文件树所在的位置。现在,如果资源库位于同一台计算机上的话,那么 -d选项可以简洁成这样cvs -d /usr/local/myrepository。然而Drupal的资源库位于远方的服务器上,所以我们需要生命更多的连接参数。让我们更详细的分析一下这个命令。

 

-d选项的每一个参数使用冒号(:)进行分割。pserver代表着“passwordauthenticated server”(密码验证服务器),它也是用来连接到Drupal资源库的连接方法。然而,CVS也可以连接到其他协议,比如SSH。

 

接着声明了用户名和密码。对于Drupal CVS资源库来说两者都是:anonymous。接着符号(@)指出要连接的主机:cvs.drupal.org。最后,我们需要声明在远方的主机上资源库所在的位置:/cvs/drupal。

 

现在所有的参数已经全了,现在我们可以使用它来执行实际的cvs命令了,在这里checkout命令用来从资源库中取出一个Drupal工作拷贝:

cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout d

~/www/drupal5 -r DRUPAL-5 drupal

 

不要将这里的-d与cvs命令部分全局选项的-d混淆了:

 

cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout –d

~/www/drupal5 -r DRUPAL-5 drupal

 

这个-d用来,将资源库的一个工作拷贝放到你计算机的根目录下面的www目录下的名为drupal5的目录里。这是一个可选的参数,如果没有这个参数,那么就使用资源库中原有的名字来复制工作拷贝。所以,此时,它将创建一个名为drupal的文件夹来存放你的来自于资源库的工作拷贝,因为资源库的名字就叫drupal。

 

-r参数代表着版本(“revision.”)。一般来说,它应该是一个标签或者分支。我们将在接下来讨论什么是标签和分支(tags and branches)。在前面的命令中,我们请求名为DRUPAL-5的版本。

 

cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout –d

~/www/drupal5 -r DRUPAL-5 drupal

 

不幸的是,在CVS中,没有一个简单的方式来得到关于所有的标签或者分支的列表(所以你应该知道要请求的版本)。最简单的做法是从Drupal资源库中检出一个版本并运行以下命令:

 

cvs status -v CHANGELOG.txt

 

(或者将CHANGELOG.txt替换为其它的存在的文件)。这将列出所有用到该文件的标签和分支,这将很好的为你给出一个当前可用的分支和标签。

最后,drupal要检出的资源库的名字。

cvs -d:pserver:anonymous:anonymous@cvs.drupal.org:/cvs/drupal checkout –d

~/www/drupal5 -r DRUPAL-5 drupal

 

注意 当你通过验证登录到一个CVS服务器以后,你将不需要再次验证了,因为在你的根目录下将创建一个名为.cvspass的文件用来存储登录信息。而接下来的针对这个资源库的CVS命令就不再需要这个全局的-d参数了。

 

 

标签和分支

当一个新的Drupal版本发布时,社区将在CVS中创建一个分支,它将是当前HEAD代码基础的一个重要的复制。这将允许在原始的HEAD代码上继续开发新特性,而同时允许社区来完善一个新的版本。例如, Drupal 5就是这样创建的。实际规范的分支名有DRUPAL-4-6-0, DRUPAL-4-7-0, 和 DRUPAL-5(注意,Drupal5 的命名规范改变了;删除了第3个参数)(译者注:现在有了DRUPAL-6)。

 

标签不是代码的复制;实际上,它们是一个特定分支某一时间的一个快照。在Drupal世界中,标签是用来标记beta,bug-fix,和稳定版的。我们使用它来得到更细的版本比如Drupal 5.1 和 5.2。规范的标签名有DRUPAL-4-7-1,DRUPAL-4-7-2, 和 DRUPAL-5-1(注意,在这里Drupal5的命名规范也改变了)。有时,如果将标签和分支比作树中的一部分会更好理解,HEAD看做树干,分支看做树支,而标签可看作是树叶,如图21-1所示。

21-1. 一个CVS树,其中分支为代码自己的直系,而叶子为该直系的快照。树枝代表着CVS分支,树叶代表着CVS标签

 

使用CVS更新代码

如果你想为你的站点更新到最新的Drupal代码上,甚至更新到下一个闪光的新版本上,你可以使用update命令来完成这些工作。首先测试一下update命令将产生哪些改变,运行下面的命令:

 

cvs –n update –dP

 

这将为你展示哪些将被修改,而实际上并未修改。要运行实际的更新操作,使用下面的命令:

cvs update –dP

 

这将使得你的Drupal工作拷贝与你正在使用的分支的最新修改保持同步。CVS通过查看存储在CVS文件夹里的CVS元数据来获取你所使用的分支,所以你不需要每次都声明它。当资源库中存在的目录在你的工作拷贝中不存在时,-d选项奖为你创建相应得目录。-P将清除掉所有它们不需要的目录。

 

注意 在运行任何可能修改你的文件的CVS命令以前,一定要先备份你的数据。另一种最佳实践是,在将这些修改放到已上线的站点以前,先在一个实验站点进行CVS更新并解决任何潜在的文件冲突,之后再转移到线上站点。

 

更新到一个不同的Drupal版本上,仅需要修改一下CVS update命令就可以了。我们假定你现在用的是Drupal 4.7。再提醒一次,在运行下面的命令以前,一定要保证你位于Drupal的根目录下。

 

更新已存在的分支,Drupal 4.7。在下面的命令中你实际上不需要声明DRUPAL-4-7(因为cvs将知道你的当前分支),但是罗嗦一点也有好处,它能让你确保所做的修改就是你想要的:

 

cvs update -dP -r DRUPAL-4-7

 

 

警告 如果你正在更新到一个新的Drupal版本上,你应该首先禁用掉所有的非核心模块和主题,然后在运行cvs更新命令来更新Drupal核心。

 

接着,将核心代码更新到Drupal 5:

cvs update -dP -r DRUPAL-5

 

对于其它的部分你仍然需要使用原有的更新流程,比如更新第3方模块和主题,以及通过访问update.php更新数据库,但是现在你不需要下载Drupal核心的新的版本并覆盖你的核心文件了。

 

追踪Drupal代码修改

想检查拟开发小组中的成员中是否有人修改核心文件?想为对核心文件所做的任何修改生成一个报告?CVS的diff命令生成一个用户可读的逐行的关于代码不同之处的输出,也就是关于更新了的和修改了的部分。下面的例子使用cvs diff –up运行diff命令所得的输出:

 

Index: system.module

===================================================================

RCS file: /cvs/drupal/drupal/modules/system/system.module,v

retrieving revision 1.402

diff -u -r1.402 system.module

--- system.module 21 Mar 2007 20:55:35 -0000 1.402

+++ system.module 27 Mar 2007 19:56:18 -0000

@@ -1505,7 +1505,7 @@ function theme_system_modules($form) {

$modules = $form['validation_modules']['#value'];

foreach ($modules as $module) {

if (!isset($module->info['package'])) {

-       $module->info['package'] = 'Uncategorized';

+       $module->info['package'] = 'Other';

}

$packages[$module->info['package']][$module->name] = $module->info;

}

 

 

以单个加号(+)开头的行是添加进来的,而以减号(-)开头的行是被删除了的。上面的文本提示我们有人将模块的启用/禁用页面的“Uncategorized”分类改成了了“Other”。

 

-u选项意味着,Drupal使用了统一的diffs。这里也是用–p选项;这将在修改的总结段落之后输出函数的名字。当阅读这个报告时,它能帮你快速的找到代码所在的函数位置,因为并不是所有的Drupal开发者都能够记住该函数出现的行数:

@@ -1505,7 +1505,7 @@ function theme_system_modules($form) {

 

解决CVS冲突

 

如果你修改了Drupal的核心代码,那么当你更新CVS时就有产生冲突的风险。运行完cvs更新命令以后,将会使用一个“C”来标出带有冲突的文件,由于这些冲突的存在,你的站点也将无法继续运行(由CVS插入的标记冲突的文本不是合法的PHP)。CVS试图合并文件的新版本和旧版本,但它没有成功的完成合并,现在需要人工干预以手工的检查该文件。发生冲突时,包含冲突的文件就像下面的这样:

 

<<<<<<< (filename)

your custom changes here

=======

the new changes that from the repository

>>>>>>> (latest revision number in the repository)

 

你需要删除你不想要的,并通过删除通途指示字符来清理代码。

 

 

干净的修改核心代码

你应该尽可能的做到永不修改核心代码。但是有时候,你可能必须修改。如果你需要修改,确保能有一种方式让你精确的追踪你所做的修改。让我们看一个简单的例子,我们将编辑edit sites/default/settings.php。在132行,你将看到下面一行代码:

ini_set('session.cookie_lifetime', 2000000);

 

这个值控制着cookies的生存时间(单位为秒)。让我们假定我们数据库中的sessions表膨胀的太快了,所以我们需要减少这些会话的生命周期。我们可以直接修改这个值,但是如果修改了这个值,那么在接下来的CVS更新中我们将得到一个冲突并需要手工的解决该问题。

 

一个干净的解决方案是将我们想要修改的那行代码注释掉,复制该行代码并将其放在文件中原来代码的下面,然后再修改该值:

 

/* 原始值 -通过修改来减少cookie的生命周期

ini_set('session.cookie_lifetime', 2000000);

*/

ini_set('session.cookie_lifetime', 1000000); // 我们添加了该行。

 

由于原始的代码没有被修改,所以运行CVS就不会在此处产生一个冲突了。

 

获得一个Drupal的CVS帐号

 

Drupal有两个CVS资源库。其中一个是Drupal核心资源库,只有很少的经过挑选的一小部分开发者才具有提交权限;另一个是第3方的资源库,用来存放位于drupal.org上的第3方的模块,翻译,主题,以及一些文档和为开发者存储代码片段的沙箱文件夹。如果你有一个模块、主题、或者翻译,你想把它贡献给社区的话,你需要申请一个CVS帐号,从而能够访问Drupal CVS的第3方资源库,以将你的代码贡献给社区。关于申请的更所细节,参看http://drupal.org/cvs-account。关于提交和分支化你贡献的模块的优秀文档,位于Drupal站点的http://drupal.org/handbook/cvs/quickstart

 

还有许多其它的方式为Drupal做出贡献,比如编写文档,参与论坛;更多方式可参看http://drupal.org/node/22286

 

 

创建和应用补丁

 

如果你想修理bug,或者项测试一下其他人的bug修理情况,或者由于这个或者那个原因需要修改核心代码,那么此时你需要创建或者应用一个补丁。一个补丁就一个人和计算机都可读的文本文件,它展示了针对Drupal核心资源库所做修改的逐行报告。补丁有diff程序生成,你已经在前面的“追踪Drupal代码修改”部分里的例子中看到了一个例子。

 

创建一个补丁

下面是一个补丁的例子,它用来清理includes/common.inc中t()函数的文档:

 

Index: includes/common.inc

===================================================================

RCS file: /cvs/drupal/drupal/includes/common.inc,v

retrieving revision 1.591

diff -u -r1.591 common.inc

--- includes/common.inc 28 Mar 2007 07:03:33 -0000 1.591

+++ includes/common.inc 28 Mar 2007 18:43:18 -0000

@@ -639,7 +639,7 @@

*

* Special variables called "placeholders" are used to signal dynamic

* information in a string, which should not be translated. Placeholders

- * can also be used for text that that may change from time to time

+ * can also be used for text that may change from time to time

* (such as link paths) to be changed without requiring updates to translations.

*

* For example:

 

当修改产生以后,开发者在Drupal根路径下运行以下命令:

cvs diff -up > common.inc.patch

 

这个命令得到cvs diff的输出并将其放到名为common.inc.patch的新文件中。接着开发者访问drupal.org,并在这里报告bug:http://drupal.org/node/100232

 

 

应用一个补丁

补丁是由cvs diff或者diff命令的输出所创建的文件。在你创建或者下载了一个补丁以后,导航到Drupal的根目录并运行以下命令:

 

patch -p0 < path_to_patchfile/file.patch

 

如果你应用一个补丁时遇到了问题,可以在http://drupal.org/node/60116寻找相关帮助。

 

 

提示 有时,你可能想为你的已上线的站点应用一个补丁,来提高速度或者添加新的功能。做这件事的最佳实践是,创建一个补丁文件夹,用来存放应用了的补丁。如果你还没有做这件事,你可以对文件运行“cvs diff –up”命令从而重新创建补丁。在同一个文件夹下,你还需要创建一个文本文件来说明应用每个补丁的原因。

 

 

为了工程管理混合使用SVN和CVS

Drupal的核心代码是使用了CVS的,然而你工程的其它部分可能完全没有使用版本控制或者可能使用了一个不同的版本控制系统。

 

通常的实践是,使用另一个不冲突的版本控制系统比如Subversion(SVN),来将整个工程(包括Drupal和它的CVS元数据)存放在它自己的资源库中。它的想法是,你首先对Drupal核心进行CVS更新操作(从cvs.drupal.org获取更新),接着你切换到SVN,使用SVN提交命令提交这些修改(这将它们放进你的SVN资源库中)。你可以使用这个SVN资源库存放任何定制的模块、主题、图片、甚至你的工程的数据库schema。

 

注意 更多关于Subversion的信息可参看http://subversion.tigris.org

 

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值