Los alias de Composer

27 de junio de 2013

¿Por qué se necesitan los alias?

Cuando guardas el código de tus paquetes en un repositorio de código VCS (es decir, Git, Mercurial o Subversion) Composer define automáticamente versiones para cualquier rama cuyo nombre parezca una versión (por ejemplo, la rama 2.0). Para el resto de ramas, Composer crea versiones prefijando su nombre ocn dev-. Así, la rama master se convierte en la versión dev-master, la rama bugfix corresponde a la versión dev-bugfix, etc.

Si utilizas la rama master para crear las etiquetas de la versión 1.0 de tu paquete (1.0.1, 1.0.2, 1.0.3, etc.), seguramente los proyectos externos dependerán de la versión 1.0.* de tu paquete.

Si ahora alguien quiere depender de la última versión de dev-master, entonces tiene un problema: otros paquetes requerirán la versión 1.0.* y se producirán conflictos, ya que dev-master no coincide con la versión 1.0.* (aunque en realidad, internamente son la misma versión).

Definiendo el alias de una rama

La rama master es probablemente la rama principal de tu repositorio de código. Al probar un proyecto, es común que los programadores quieran utilizar la versión más reciente de esa rama, que sería la versión dev-master. Por eso Composer te permite crear el alias 1.0.x-dev para la rama dev-master. Para ello, añade la opción branch-alias bajo la opción extra del archivo composer.json:

{
    "extra": {
        "branch-alias": {
            "dev-master": "1.0.x-dev"
        }
    }
}

La versión de la rama debe empezar siempre por dev- (es decir, debe ser una rama con un nombre que no se parezca a una versión) y el alias puedes elegirlo libremente, pero debe tener el formato de una versión y acabar en -dev. Esta propiedad branch-alias debe estar en el archivo composer.json de la rama a la que está referenciando (en este caso, en la rama master).

Con la configuración anterior, los programadores ya pueden indicar 1.0.* como versión del paquete y en realidad, estarán instalando la versión dev-master.

Para definir alias en una rama, debes ser el responsable del repositorio donde se encuentra el paquete. Si quieres crear alias para paquetes de terceros y no tener que hacer un fork, debes utilizar los "alias temporales" o inline aliases.

Definiendo un alias temporal

Los alias de las ramas explicados en la sección anterior son muy útiles para las líneas principales de desarrollo de los paquetes. El problema es que para definir esos alias debes ser el responsable del repositorio y debes poder hacer commits a ese repositorio.

Este proceso completo es tedioso si lo único que quieres hacer es corregir un error de alguna librería de la que depende tu proyecto. Por eso Composer te permite crear alias directamente en las propiedades require y require-dev del archivo composer.json.

Imagina que has descubierto un error en el paquete monolog/monolog. Para solucionarlo, has clonado el proyecto Monolog en tu propio repositorio y has corregido el fallo en una rama llamada bugfix. El último paso consiste en utilizar esta versión de la librería en vez de la versión oficial del proyecto.

Supongamos también que utilizas el paquete symfony/monolog-bundle que a su vez depende de la versión 1.* del paquete monolog/monolog. El único cambio que debes hacer es añadir un alias en el paquete monolog/monolog para hacer creer a los demás paquetes que tu versión dev-bugfix es en realidad la versión 1.* que ellos esperan. Para ello, añade lo siguiente en tu archivo composer.json:

{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/you/monolog"
        }
    ],
    "require": {
        "symfony/monolog-bundle": "2.0",
        "monolog/monolog": "dev-bugfix as 1.0.x-dev"
    }
}

Con esta configuración, Composer descargará e instalará tu versión dev-bugfix cada vez que un paquete requiera la versión 1.0.x-dev del paquete monolog/monolog.

Si dependes de un paquete que define este tipo de alias, la versión que se utiliza es la indicada en ese alias (lo que esté a la derecha de la palabra as). Por tanto, si el paquete A requiere el paquete B y este paquete B requiere la versión dev-bugfix as 1.0.x-dev de monolog/monolog, al instalar el paquete A se utilizará la versión 1.0.x-dev del paquete. Si no existe, tendrás que crear un nuevo alias en el archivo composer.json del paquete A.

Este tipo de alias deben ser evitados a toda costa, sobre todo en los paquetes pensados para distribuirlos públicamente. Si encuentras un error en una librería, notifícalo a sus autores y trata de que acepten tu pull request con la corrección del error.