Los scripts de Composer

7 de junio de 2013

Los scripts de Composer consisten en callbacks de PHP (definidos como métodos estáticos) o en comandos ejecutables en la consola. Los scripts son muy útiles para ejecutar código o comandos propios del paquete durante la ejecución de Composer.

Ten en cuenta que solamente se ejecutan los scripts del paquete principal, por lo que los scripts definidos en los archivos composer.json de las dependencias no se ejecutan.

Eventos de Composer

Los scripts se ejecutan al producirse alguno de los siguientes eventos definidos por Composer:

  • pre-install-cmd: se notifica antes de ejecutar el comando install.
  • post-install-cmd: se notifica después de ejecutar el comando install.
  • pre-update-cmd: se notifica antes de ejecutar el comando update.
  • post-update-cmd: se notifica después de ejecutar el comando update.
  • pre-package-install: se notifica antes de instalar un paquete.
  • post-package-install: se notifica después de instalar un paquete.
  • pre-package-update: se notifica antes de actualizar un paquete.
  • post-package-update: se notifica después de actualizar un paquete.
  • pre-package-uninstall: se notifica antes de desinstalar un paquete.
  • post-package-uninstall: se notifica antes de desinstalar un paquete.
  • pre-autoload-dump: se notifica antes de regenerar la información del cargador automático de clases, tanto durante la ejecución de los comandos install/update como durante la ejecución del comando dump-autoload.
  • post-autoload-dump: se notifica después de regenerar la información del cargador automático de clases, tanto durante la ejecución de los comandos install/update como durante la ejecución del comando dump-autoload.
  • post-root-package-install: se notifica después de que se haya instalado el paquete principal, durante la ejecución del comando create-project.
  • post-create-project-cmd: se notifica después de la ejecución del comando create-project.

Creando scripts de Composer

Para ejecutar uno o más scripts durante la ejecución de Composer, añade una propiedad llamada scripts en el archivo de configuración composer.json del proyecto. El valor de esta propiedad es un array asociativo que relaciona eventos de Composer con los scripts que se ejecutan durante ese evento. Los scripts se indican mediante una cadena de texto o un array, dependiendo de si ejecutas uno o más scripts para ese evento.

Cuando definas scripts, ten en cuenta que:

  • Los scripts se ejecutan en el mismo orden en el que se definen (siempre y cuando se notifique el evento al que están suscritos).
  • Si asocias más de un script a un mismo evento, puedes mezclar indistintamente callbacks de PHP y comandos de consola.
  • Las clases que contienen los callbacks deben poder cargarse mediante el sistema de carga automática de clases de Composer.

Ejemplo de archivo de configuración composer.json con scripts:

{
    "scripts": {
        "post-update-cmd": "MyVendor\\MyClass::postUpdate",
        "post-package-install": [
            "MyVendor\\MyClass::postPackageInstall"
        ],
        "post-install-cmd": [
            "MyVendor\\MyClass::warmCache",
            "phpunit -c app/"
        ]
    }
}

A continuación se muestra un ejemplo de cómo podría ser la clase MyVendor\MyClass definida en el archivo de configuración anterior:

namespace MyVendor;

use Composer\Script\Event;

class MyClass
{
    public static function postUpdate(Event $event)
    {
        $composer = $event->getComposer();
        // ...
    }

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

    public static function warmCache(Event $event)
    {
        // ...
    }
}

Cuando se notifica un evento, Composer pasa un objeto de tipo Composer\Script\Event como primer argumento de tu callback. Este objeto dispone de varios getters para obtener fácilmente otros objetos útiles:

  • getComposer(): devuelve una instancia de la clase Composer\Composer.
  • getName(): devuelve una cadena de texto con el nombre del evento que se ha notificado.
    • getIO(): devuelve un objeto que implementa la interfaz Composer\IO\IOInterface y que permite escribir y leer en la consola de comandos.