探讨Drupal模块目录组织方式

我们都知道在Drupal系统目录下模块可以放在很多目录下,Drupal会按照一定的次序扫描所有的符合规范的目录下的模块。但是并不意味着我们可以随意放置模块,比如系统的modules目录下放的都是核心自带的模块,为了以后的升级方便,我们不应该将模块放在/modules目录里面,那么Drupal的模块应该怎样放置呢?

多站点模式

如果你的网站是以Drupal多站点方式运作的,意思是多个网站共享一套Drupal代码,这时我们的第三方模块一般都放在/sites/all/modules目录。而其他模块则分网站放到/sites/网站名/modules目录下,如果你的自定义模块想要跨多站共享的话,也需要放到/sites/all/modules里,这时为了区分,你需要在/sites/all/modules目录里建子目录,例如contrib代表第三方模块目录,custom代表自定义共享模块目录。

Drupal多站点其实还有一种不共享代码,只共享数据库的情况,但这与本文要讨论的主题无关,就不做过多说明了。

单站点模式

单站点模式是我们最常见的情况,我们就是要用一套Drupal代码建一个站,如果是一个比较大型的网站,需要使用的模块众多,我们就需要做一些规划了,以下是我在开发过程中的一些心得,希望对大家有所帮助。(下文的目录都放在/sites/all/modules目录下,以保证/sites目录下的站点目录干净清爽)

contrib

毫无疑问,这个目录是放置第三方模块的

custom_contrib/patched

放置的也是第三方模块,但是有一点点与我们的需求不符,又没有提供足够的钩子做扩展,所以我们就需要硬编码了,放在这个目录可以提醒你哪些模块是被修改过的,升级时要多加小心,不要遗漏之前打过的补丁。

custom

存放自定义模块

features

存放我们经过规划从后台导出的一批features,每个feature一般是要围绕一个功能特性进行打包,不过如何规划features每个人可能有不同的理解,只要能有清晰的思路,并且以后便于维护即可。

development

存放所有开发相关,而与网站业务逻辑无关的模块,比如devel, schema等,这些模块也不一定是只能在本地使用,但一般是不建议在生产服务器启用的,将这些模块放在一起,对生产服务器的问题排查和优化有一定的帮助。

localhost

这是一个特殊的目录,里面存放的是不放入版本控制的模块,可以是第三方模块,也可以是自定义模块,一般我会在里面继续细分一些子目录,但localhost目录则需要根据版本控制软件设置目录的ignore属性,这样不管里面放了多少代码都不会因为误操作上传到代码库。

第三方模块,之所以有第三方模块放到localhost是因为在团队开发过程中,你不能任> 意的提交模块到版本库,而有些开发相关的模块对本地开发又很有帮助,所以我将版本库里没有,但对我有用,对其他人未必有用的第三方模块,主要是开发相关的模块,放到localhost下,以提高本地开发调试效率。

自定义模块,自定义模块放到localhost当然也是不希望代码被上传到版本库,但为什么有这样的自定义模块呢,当然也是为了本地开发效率的提高,这也是一些开发相关的模块,但大多数情况下,都是对业务逻辑和数据做一些CRUD,比如一键插入删除测试数据,比如一键删除近期测试用户等等,这对本地开发效率有极大的提升,或者可以保证本地数据库的精简。

not_in_use

这个目录里的模块来自于custom目录,因为一些自定义的模块可能因为某些原因,比如需求变更,模块功能不再需要,这时如果封装良好的话,需要把模块禁用掉,但由于自定义代码里包含许多业务逻辑,删除肯定不是一个好办法,我们以后可能需要把这个功能拿回来重新使用,或者需要参考里面的代码,所以我们会需要把这样的模块放到一个单独的目录,从而哪些模块正在被使用,哪些模块目前已经不用了,就是一目了然的了。

总结

从以上目录划分可以看出,我们就是在通过多放几个子目录让代码结构,主要是模块结构,变得更有条例,在实际项目中,由于业务逻辑的不同,我绝对相信大家有需要新建除了上文提到目录以外的其他目录,而且根据项目大小的不同,以上的目录建议也不是都必须存在的,大家可以根据实际情况进行调整。

总之由于网站一般都需要长期维护,而随着时间的推移很多项目相关的信息你可能都有所遗忘,因此我们开发过程中总要想一些办法让今后项目可以比较容易的理解和维护,从小的方面是代码符合规范,注释良好,代码精炼易懂,从大的方面就是项目的目录结构,技术架构,文档,任务管理等等。