“中国要复兴、富强,必须在开源软件领域起到主导作用,为了国家安全和人类发展,责无旁贷,我们须为此而奋斗”——By:云客
曾几何时我们安装一个Drupal模块只需要到官网下载模块压缩包文件,然后放入模块目录,进入后台开启安装即可,但有些模块由于依赖了第三方库,事情就没有那么简单了,比如经常会用到的邮件发送模块“smtp”就需要第三方库“PHPMailer”的支持 ,此时前述安装方法只能得到模块文件,而没有第三方库,模块即便能够安装也无法运行,即便我们自己下载了第三方库手动放入vendor目录也是不行的(这是因为类自动加载器没有添加该库,运行时会提示类不存在),像这样的列子还有很多,比如我开发的微信支付模块、支付宝模块等都需要第三方的支持,为了应对这种情况就需要用到Composer了,而且越来越有必要,Drupal官方已推荐使用Composer来安装、升级相关代码。你可能会想:模块开发者为什么不把依赖库放在模块文件夹里面呢?这样就能像前文所述那样安装了,试想一下:多个模块依赖于同一个依赖库该怎么处理?这在代码冗余和名字空间映射等方面都是不好的。
本文面向drupaler进行一个全面的Composer讲解。
Composer自身的安装:
关于Composer的安装和使用请见(本篇不赘述):https://getcomposer.org/
注意:安装完成后,使用中如果遇到众所周知的墙问题导致包下载失败,可以使用阿里云的镜像,使用命令:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
取消阿里云镜像:
composer config -g --unset repos.packagist
通用常用命令:
安装依赖:
composer install
这将依据composer.json文件或lock文件下载依赖并生成自动加载器
更新依赖:
全部更新:
composer update
个别更新:
composer update vendor/package vendor/package2
通配符更新:
composer update vendor/*
这个将更新依赖并重新生产lock文件
添加依赖:
composer require vendor/package:2.* vendor/package2:dev-master
这将下载依赖并更新composer.json和lock文件
查看某个依赖包的详情:
composer show monolog/monolog
状态检查:
composer status -vv
如果你修改了某依赖包的内容,这条命令会帮你检查出修改了哪些地方
升级composer本身:
升级到最高版本:
composer self-update
升级到某个版本:
composer self-update 1.0.0-alpha7
回滚到最后一个可用版本:
composer self-update -r
用Composer安装Drupal系统:
使用如下命令:
composer create-project drupal/recommended-project yunke
这将在当前目录下建立一个叫“yunke”的目录(你可自行更改名字),并在其中安装Drupal,安装后你会在其中看到一个“web”目录,这就是Drupal系统的站点根目录了,然而vendor目录、composer.json等并不在其中,这和手动下载的安装包文件布局不同,不过这是推荐方法,主要是由于安全原因(这种方法可以方便设置服务器只允许访问web目录之内的文件),如果你还是喜欢传统的文件布局方式(vendor目录等在站点根目录内),可以将vendor目录删除,将composer.json、composer.lock移入web模块,并在composer.json文件中的所有地方把“web”这个路径去掉,然后在命令行中将当前目录切换到web目录,执行以下命令:
composer install
这样就会产生新的vendor目录和加载文件了。不过这种更改方式你还不如直接到官方下载安装包即可,这里只是提供一种方法。
如果你不喜欢默认安装方式的“web”目录,或者需要在安装前定制一下composer.json文件,可以运行如下命令:
composer create-project --no-install drupal/recommended-project my_site_name_dir
这将仅下载composer.json、composer.lock文件而不进行真的安装,待你修改后可以继续运行“composer install”安装命令
如果需要安装不同版本的Drupal系统可用如下命令:
composer create-project drupal/recommended-project:8.8.0 yunke
注意:本节所述的“安装”仅是指composer将Drupal文件下载到所需的目录,真正的系统安装(建立数据库等)还需在浏览器或命令行中进行。
用Composer安装Drupal模块:
这里以smtp模块为例,看看如何通过Composer安装:
首先用“cd”命令进入Drupal系统的安装根目录,即composer.json文件所在目录,然后执行以下命令:
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 require 'drupal/token:^1.5'
composer require 'drupal/simple_fb_connect:~3.0'
composer require 'drupal/ctools:3.0.0-alpha26'
composer require 'drupal/token:1.x-dev'
Composer卸载Drupal模块:
命令如下:
composer remove 'drupal/yunke_help'
Composer更新Drupal系统:
参考官网https://www.drupal.org/docs/updating-drupal/updating-drupal-core-via-composer
关于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安装的过渡:
请思考:如果你的站点已运营很久,之前许多模块不是Composer安装方式,已手动安装的这些模块的路径,并不是composer指定的路径,之后站点开始采用composer方式,这对前述那些手动安装的模块升级有何影响?应该怎么处理呢?
首先模块可能涉及到很重要的数据,这就排除了通过卸载重新安装的升级方式,你可能想那就对这些模块继续采用手动升级维持,这不是长久办法,且有些模块可能开始没有第三方依赖,后面却加入了导致必须使用composer维护,比如“smtp”模块就是这样,此时就可以这样:为这些具体的模块指定安装路径,操作如下:
首先在composer.json文件的"require"项中添加对模块的依赖,然后在安装路径中指定模块原来的安装路径,指定路径可以基于供应商:
"extra": {
"installer-paths": {
"web/libraries/ckeditor/plugins/{$name}": ["vendor:ckeditor-plugin"]
}
}
也可以基于包名:
"extra": {
"installer-paths": {
"web/libraries/{$name}": [ "enyo/dropzone" ]
}
}
修改后执行升级命令即可
或者你可以直接使用以下工具去切换到composer方式:
模块:https://www.drupal.org/project/composerize
composer插件:https://github.com/grasmash/composerize-drupal
关于过渡相关可以参考以下文档:
https://www.drupal.org/docs/installing-drupal/add-composer-to-an-existing-site
补充:
1、官网文档:https://www.drupal.org/docs/develop/using-composer
交流互动