Drupal模块的Composer安装及第三方库依赖开发处理

yunke 提交于 周日, 05/02/2021 - 10:28

用Composer安装Drupal模块:

通常来说我们安装一个Drupal模块只需要到官网下载,然后放入模块目录,进入后台开启安装即可,但有些模块由于依赖了第三方库,事情就没有那么简单了

比如经常会用到的邮件发送模块“smtp”就需要第三方库“PHPMailer”的支持 ,此时传统安装方法只能得到模块文件,而没有第三方库,即便我们自己下载了第三方库放入vendor目录也是不行的(因为类自动加载器没有添加该库),此时就需要用到Composer了

关于Composer的安装和使用请见(本篇不赘述):https://getcomposer.org/

注意:如果遇到众所周知的墙问题,可以使用阿里云的镜像,使用命令:

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

取消阿里云镜像:

composer config -g --unset repos.packagist

回到上面的问题,这里以smtp模块为例,看看如何通过Composer安装:
首先用“cd”命令进入Drupal系统的安装根目录,然后执行以下命令:

composer require drupal/smtp

此时Composer将自动下载smtp模块到“modules\contrib”目录下,并下载该模块composer.json中声明的依赖到系统vendor目录
最后更新系统根目录的composer.json文件(在"require"中添加了模块依赖),重写composer.lock文件,最后重新生成类加载器

如你所见,你只需要一行命令,Composer就完成了这些事情,你只需要到后台启用该模块即可

如果你没有条件用Composer,怎么手动处理呢?步骤如下:
1、下载模块到模块目录
2、下载合适版本的第三方库到vendor目录
3、删除composer.lock文件,并在composer.json文件的"require"中添加本模块依赖
4、进入vendor/composer/autoload_psr4.php添加类映射关系,如果是不遵从PSR4的库需要修改其他映射文件

Composer可以安装任意已上传到Drupal官网的模块,比如你可以安装云客验证码模块试试:

composer require drupal/yunke_captcha

这是因为Drupal自己搭建了容器

关于Composer更多的Drupal用法可以见:
https://www.drupal.org/docs/develop/using-composer

开发依赖第三方库的模块:
作为开发者的我们应该如何开发依赖第三方库的模块呢?有两种方式:

方式一:
通常我们需要在模块根目录建立composer.json并声明依赖,假设要开发一个云客支付模块(一直在计划中)composer.json可以这样:

{
    "name": "drupal/yunke_pay",
    "description": "drupal yunke pay module",
    "type": "drupal-module",
    "license": "GPL-2.0-or-later",
    "homepage": "http://www.indrupal.com",

    "require": {
        "wechatpay/wechatpay-guzzle-middleware": "^0.2.0"
    }

}

里面就声明了对微信支付中间件的依赖,但是这种开发方法要求用户使用Composer去安装该模块,比较麻烦
能不能让模块自带第三方库呢?是可以的,这就是方式二

方式二:
我们需要在用到第三方库前,在系统的类加载器中添加类映射关系
这里假设下载的微信支付中间件被放置在模块的以下目录中:
yunke_pay\vendor\wechatpay\wechatpay-guzzle-middleware\src
那么在使用前可以对类加载器进行如下处理(通常放置在yunke_pay.module中处理或制作订阅事件程序):

  $class_loader = \Drupal::service('class_loader');
  $path=\Drupal::moduleHandler()->getModule("yunke_pay")->getPath() . '/vendor/wechatpay/wechatpay-guzzle-middleware/src';
  $class_loader->addPsr4('WechatPay\GuzzleMiddleware\\', $path);

以上两种方式各有利弊,方式一是推荐做法,但安装麻烦,方式二安装方便,用户不需要composer,但是当有其他模块也用到相同的第三方库时,可能产生版本冲突

补充:
留个思考题,当用Composer安装模块后,对以后系统的升级有何影响?应该怎么处理?

 

 

添加新评论

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
请输入以上问题的答案,换一个问题请刷新,不区分大小写