本文介绍composer.json文件里的语法和关键字的用处

我们在项目的根目录创建并定义composer.json文件,该文件里的JSON对象内定义一个"scripts"属性,该属性包含一系列事件对应要执行的回调脚本,一个事件可以用数组定义多个事件脚本。
对于同一个事件,多个事件脚本会按照定义的顺序触发。
** 被执行的php回调脚本一定要定义成静态方法 **

定义脚本

在项目根目录下的composer.json文件内定义脚本

1
2
3
4
5
6
7
8
9
10
"scripts": {
"post-update-cmd": [ //事件
"php artisan clear-compiled", //对应的事件脚本
"php artisan ide-helper:generate",
"php artisan optimize"
],
"post-package-install": [
"MyVendor\\MyClass:postPackageInstall"
]
}

使用前面定义的例子,这里的MyVendor\MyClass类,就可以被使用来执行 PHP 的回调:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

namespace MyVendor;

use Composer\Script\Event;

class MyClass
{
public static function postUpdate(Event $event)
{
//getComposer(): 返回当前的 Composer\Composer 对象实例。
$composer = $event->getComposer();
// do something
}

public static function postPackageInstall(Event $event)
{
$installedPackage = $event->getOperation()->getPackage();
// do something
}

public static function warmCache(Event $event)
{
// make cache toasty
}
}

当一个事件被触发,Composer 的内部事件处理程序将接收一个Composer\Script\Event对象,这是传递给您的PHP回调函数的第一个参数。这个Event对象拥有一些如getter方法来帮助你取得当前事件的上下文(context):

  • getComposer(): 返回当前的Composer\Composer对象实例。
  • getName(): 返回事件名称的字符串。
  • getIO(): 返回当前的输入\输出流,它实现了Composer\IO\IOInterface接口,以便在控制台中使用。

上面是当事件发生时,composer自动调用对应的事件函数。当然我们也可以手动运行这些事件脚本

手动运行脚本

使用下面的语法结构:
composer run-script [--dev] [--no-dev] script
如:composer run-script post-install-cmd将会按顺序运行所有post-install-cmd事件下定义的脚本。

事件列表

在composer运行过程中将会触发下面的事件:(pre为执行前,post为执行后)

事件名称 说明
pre-install-cmd 在install命令执行前触发
post-install-cmd 在install命令执行后触发
pre-update-cmd 在update命令执行前触发
post-update-cmd 在update命令执行后触发
pre-status-cmd 在status命令执行前触发
post-status-cmd 在status命令执行后触发
pre-archive-cmd 在archive命令执行前触发
post-archive-cmd 在archive命令执行后触发
pre-package-install 在 资源包/第三方包/库 安装前触发
post-package-install 在 资源包/第三方包/库 安装后触发
pre-package-update 在 资源包/第三方包/库 更新前触发
post-package-update 在 资源包/第三方包/库 更新后触发
pre-package-uninstall 在 资源包/第三方包/库 卸载前触发
post-package-uninstall 在 资源包/第三方包/库 卸载后触发
pre-autoload-dump 在自动加载器被转储前触发,无论是install/update还是dump-autoload命令都会触发
post-autoload-dump 在自动加载器被转储后触发,无论是install/update还是dump-autoload命令都会触发
post-root-package-install create-project命令期间,根包安装完成后触发
post-create-project-cmd create-project命令执行后触发

注意:composer自会执行处于项目根目录下的composer.json文件里定义的脚本。不会去执行处于依赖包中的composer.json文件里的installupdate定义的脚本。如果需要执行installupdate命令的脚本,要确保他们都是在项目根目录下的composer.json中定义