Composer, el manual oficial

5.4. Enlazando paquetes

Las dependencias de tu proyecto se indican mediante enlaces a los paquetes necesarios, indicados mediante objetos que asocian nombres de paquetes con versiones. Ejemplo:

{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}

Obviamente, todos los enlaces son propiedades opcionales. Tanto require como require-dev también soportan opciones adicionales para indicar la estabilidad requerida para cada paquete. Así puedes restringir o relajar la estabilidad de un determinado paquete más allá de lo indicado por la opción minimum-stability. Estas opciones se pueden aplicar sobre una versión concreta o sobre una versión vacía, para indicar por ejemplo que aceptas cualquier versión inestable de un determinado paquete, como se muestra en el siguiente ejemplo:

{
    "require": {
        "monolog/monolog": "1.0.*@beta",
        "acme/foo": "@dev"
    }
}

Las propiedades require y require-dev también permiten indicar con una precisión exacta la versión de una dependencia. En otras palabras, permite indicar exactamente el commit hasta el que se quiere descargar un paquete.

Esta característica sólo funciona para las versiones de desarrollo y permiten asegurar que tu proyecto utiliza la versión exacta que funciona bien, sin importar si el paquete se sigue desarrollando. Para ello, indica el commit exacto mediante la notación #<hash_del_commit>.

En cualquier caso, considera esta opción como algo que utilizas de forma puntual cuando el desarrollo de tu proyecto lo requiera. Como es evidente, esta no es la forma normal ni recomendada de indicar la versión de los paquetes de los que depende tu proyecto. Tan pronto como te sea posible, debería eliminar todos los commits de los paquetes y cambiarlos por etiquetas, sobre todo si el proyecto en el que estás trabajando no lo vas a volver a tocar en un tiempo.

Ejemplo:

{
    "require": {
        "monolog/monolog": "dev-master#2eb0c0978d290a1c45346a1955188929cb4e5db7",
        "acme/foo": "1.0.x-dev#abc123"
    }
}

5.4.1. La propiedad require

Indica los paquetes que obligatoriamente se deben instalar para poder ejecutar este proyecto. Si alguna de estas dependencias no se puede instalar, Composer no te dejará instalar el proyecto.

5.4.2. La propiedad require-dev

Indica los paquetes que obligatoriamente se deben instalar cuando se está desarrollando el proyecto, ejecutando sus tests, etc. Estas dependencias solamente se instalan si el comando install se ejecuta con la opción --dev o si el comando update se ejecuta con la opción --no-dev.

5.4.3. La propiedad conflict

Indica los paquetes que son incompatibles con esta versión concreta del paquete. El resultado es que esos paquetes incompatibles no se instalarán al descargar las dependencias.

Si especificas rangos de versiones del tipo <1.0, >= 1.1 en una dependencia dentro de la propiedad conflict, el resultado es que todas las versiones inferiores a 1.0 y superiores o iguales a 1.1 son incompatibles. Como seguramente esto no es lo que esperabas, es mejor que cambies el formato de la versión a algo como <1.0 | >= 1.1.

5.4.4. La propiedad replace

Indica los paquetes que van a ser reemplazados por este paquete. Esta opción permite crear un fork de un paquete, publicarlo con otro nombre y otra versión, mientras que todos los paquetes que dependían del paquete original también funcionan con tu fork, ya que estás reemplazando el paquete original.

Esta propiedad también es útil para los paquetes que contienen subpaquetes, como por ejemplo el paquete symfony/smyofny que contiene todos los componentes de Symfony, que a su vez también están disponibles como paquetes individuales. Si requieres el paquete principal, también se descargarán todas las dependencias de los paquetes individuales, ya que el paquete principal los reemplaza.

Si utilizas esta propiedad para crear subpaquetes, te recomendamos que utilices el valor self.version como versión, de forma que el paquete principal sólo reemplace los subpaquetes con la misma versión y no con otra diferente, lo que podría ocasionar problemas.

5.4.5. La propiedad provide

Indica los paquetes que proporciona este paquete. Esta propiedad es útil para definir interfaces comunes. Un paquete podría depender por ejemplo de un paquete virtual llamado logger y cualquier librería que implemente esta interfaz logger podría indicarlo en la propiedad provide.