Antes de comenzar a explicar los tipos de repositorios que existen, es importante introducir varios de los conceptos básicos sobre los que está construido Composer.
6.1.1. Paquete
Composer es un gestor de dependencias que instala los paquetes localmente en tu servidor. Normalmente un paquete consiste en un directorio con un determinado contenido. Aunque en este caso siempre se trata de código PHP, en teoría puede ser cualquier tipo de contenido. Además del contenido, el paquete también dispone de un nombre y una versión, que son los que se utilizan para identificar de forma única a cada paquete.
Internamente Composer considera a cada versión de un paquete como si fuera un paquete diferente. Aunque esto no importa nada cuando utilizas Composer, sí que es muy importante cuando quieres modificar Composer.
Además del nombre y de la versión, los paquetes incluyen otra metainformación. La información más importante para instalar el paquete es la descripción de dónde se encuentran sus contenidos. Para indicarlo existen dos opciones:
dist
: se trata de una versión empaquetada (por ejemplo un archivo ZIP) de todos los contenidos del paquete. Normalmente se utiliza para publicar versiones estables del paquete.source
: esta opción se utiliza durante la fase de desarrollo del paquete y los contenidos del paquete normalmente se encuentran en un repositorio de código (por ejemplo Git).
Los paquetes pueden definir una de estas dos opciones o las dos. La versión que se elige depende de varios factores, como las opciones de configuración y la estabilidad del paquete.
6.1.2. Repositorio
Un repositorio es el lugar del que se descargan los paquetes. En la práctica se trata de una lista de paquetes y versiones disponibles. Composer busca los paquetes requeridos por tus proyectos en todos los repositorios que tengas configurados.
El único repositorio de paquetes registrado por defecto en Composer es Packagist, pero puedes añadir más repositorios mediante el archivo composer.json
de tu proyecto.
Los repositorios sólo se pueden definir en el paquete principal o "root package", por lo que no puedes definirlos para las dependencias del proyecto.