Cómo solucionar los errores habituales de Composer

2 de junio de 2013

A continuación se explica cómo solucionar los errores más habituales que se producen al utilizar Composer para gestionar las dependencias de los proyectos PHP.

Errores generales

1. Cuando se produzca cualquier error, ejecuta primero el comando composer diagnose para que Composer realice una serie de comprobaciones automáticas de los problemas habituales. Si todo está bien, puede seguir con los siguientes pasos.

2. Asegúrate de actualizar de vez en cuando Composer ejecutando el comando composer self-update. Si hace más de 30 días que no has actualizado Composer, verás un mensaje de aviso cada vez que ejecutes un comando de Composer.

3. Comprueba que tu sistema está preparado para ejecutar Composer. Para ello, ejecuta las comprobaciones del instalador de Composer mediante el comando curl -sS https://getcomposer.org/installer | php -- --check

4. Asegúrate de que está instalando las dependencias indicadas en el archivo composer.json del proyecto. Para ello, borra las dependencias existentes y vuelve a instalarlas (ejecuta por ejemplo el comando rm -rf vendor && composer update -v). De esta forma te aseguras de que el archivo composer.lock no está interfiriendo con la instalación de las dependencias deseadas.

Cómo solucionar el error Package not found

1. Asegúrate de que no has cometido ningún error al escribir el nombre de los paquetes o versiones en el archivo composer.json. Aunque te parezca innecesaria, esta comprobación te ahorrará mucho tiempo, ya que es una de las causas más comunes de errores en Composer.

2. Asegúrate de establecer un valor correcto para la propiedad minimum-stability. Si no sabes qué valor utilizar, empieza por "minimum-stability": "dev" y luego ya ajustarás su valor a tus necesidades.

3. Si los paquetes que estás instalando no se encuentran en Packagist, asegúrate de definirlos dentro del archivo composer.json principal del proyecto.

4. Utiliza el mismo nombre de paquete y de vendor en todas las ramas y etiquetas de tu repositorio, sobre todo cuando utilices la propiedad replace con tus forks de repositorios desarrollados por terceros.

Cómo solucionar el error Package not found on travis-ci.org

1. Comprueba primero todos los errores explicados en la sección anterior.

2. Cuando se producen dependencias cíclicas (una paquete depende de otro que a su vez depende del primero) es posible que Composer no pueda detectar correctamente la versión del paquete que debe instalar. Si se trata de clonar un repositorio mediante Git, seguramente Composer pueda solucionar el problema. Pero si se ejecuta Composer a través de un servidor de integración continua como Travis, el problema no es tan fácil de solucionar.

La solución más eficaz suele ser definir la versión mediante una variable de entorno llamada COMPOSER_ROOT_VERSION. Si estableces su valor por ejemplo a dev-master, la versión del paquete principal del proyecto será dev-master.

Si utilizas Travis, añade la siguiente configuración en tu archivo .travis.yml:

before_script: "COMPOSER_ROOT_VERSION=dev-master composer install"

Cómo redefinir la versión de una dependencia

Imagina que tu proyecto depende de un paquete llamado A que a su vez depende de una versión concreta de un paquete llamado B (supongamos que depende de la versión 0.1). Si tu proyecto también depende del paquete B pero necesitas una versión diferente (por ejemplo, 0.11), la solución consiste en crear un alias de la versión 0.11 para que parezca que es la versión 0.1. Para ello, añade lo siguiente en tu archivo composer.json:

{
    "require": {
        "A": "0.2",
        "B": "0.11 as 0.1"
    }
}

Cómo solucionar los problemas de memoria

Si al ejecutar comandos de Composer te encuentras con mensajes de error como el siguiente:

PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted ...

La solución consiste en aumentar la memoria disponible para PHP mediante la opción de configuración memory_limit del archivo php.ini.

Internamente Composer aumenta la memoria disponible en PHP hasta 512M mediante la propiedad memory_limit. Si a pesar de ello se siguen produciendo errores, puedes informar del error producido en la sección de issues del repositorio de Composer: github.com/composer/composer/issues.

Si quieres conocer el valor actual que tienes configurado para la opción memory_limit, ejecuta el siguiente comando:

$ php -r "echo ini_get('memory_limit').PHP_EOL;"

Aumenta este valor en el archivo de configuración php.ini de PHP:

; el valor -1 indica que no hay límite de memoria
memory_limit = -1

Si lo prefieres, puedes aumentar temporalmente la memoria disponible añadiendo el parámetro -d memory_limit=1 a cada comando de PHP que ejecutes:

$ php -d memory_limit=-1 composer.phar <...>

Cómo solucionar el problema The system cannot find the path specified

Este problema sólo sucede cuando ejecutas Composer en sistemas Windows. Para solucionarlo:

1. Ejecuta la aplicación regedit.

2. Busca la clave AutoRun dentro de HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor o HKEY_CURRENT_USER\Software\Microsoft\Command Processor.

3. Comprueba si el valor de esta clave contiene alguna ruta a un archivo o directorio inexistente. En caso afirmativo, borra todas esas rutas inexistentes y guarda los cambios.