Compositor: ¿cómo puedo instalar otra dependencia sin actualizar las antiguas?

196

Tengo un proyecto con algunas dependencias y me gustaría instalar otro, pero me gustaría mantener los demás como están. Así que he editado elcomposer.json , pero si ejecuto composer install, obtengo el siguiente resultado:

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

En primer lugar, tengo instalado mcrypt, así que no sé por qué se queja de eso allí.

Entonces, ¿cómo puedo instalar esta nueva dependencia?

Mi compositor.json:

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}
dualidad_
fuente
1
La advertencia de mcrypt podría ser de múltiples instalaciones de php ... el php con la extensión mcrypt puede no ser la misma instalación que su php-cli
Matthemattics

Respuestas:

293

Para instalar un nuevo paquete y solo eso, tiene dos opciones:

  1. Usando el requirecomando, simplemente ejecute:

    composer require new/package
    

    Composer adivinará la mejor restricción de versión para usar, instalará el paquete y lo agregará a composer.lock .

    También puede especificar una restricción de versión explícita ejecutando:

    composer require new/package ~2.5
    

-O-

  1. Con el updatecomando, agregue el nuevo paquete manualmente y composer.jsonluego ejecute:

    composer update new/package
    

Si Composer se queja, indicando que "Sus requisitos no se pudieron resolver con un conjunto de paquetes instalables", puede resolverlo pasando el indicador --with-dependencies . Esto incluirá en la lista blanca todas las dependencias del paquete que está intentando instalar / actualizar (pero ninguna de sus otras dependencias).

Con respecto a los problemas del autor de la pregunta con Laravel y mcrypt: verifique que esté habilitado correctamente en su CLI php.ini. Siphp -m no aparece mcrypt, entonces falta.

Importante: ¡No olvides especificar new/packageal usar composer update! Omitir ese argumento hará que todas las dependencias, así como composer.lock, se actualicen.

Seldaek
fuente
3
Recibí el mensaje "El paquete [...] listado para la actualización no está instalado. Ignorando".
Gerry
11
Esto no funciona para mi. Me dijeron que el paquete "x / y" que figura para la actualización no está instalado. Ignorando. "Y luego continúa actualizando todo. Por lo tanto, no instala el nuevo paquete que quiero y actualiza todo lo demás, que es exactamente lo contrario de lo que quiero.
tremby
3
Simplemente no funciona. "Sus requisitos no se pudieron resolver con un conjunto de paquetes instalables". (y texto sobre algunos paquetes antiguos, no relacionados en absoluto con lo que pregunto) cuando pregunto solo actualice un paquete.
OZ_
@tremby funciona bien aquí. Tal vez se te olvidó agregar "new/package" : "*",composer.json"require" sección ?
Potherca
@OZ_ Incluso si solo uno se instala dependencia, aún debe resolverse primero para asegurarse de que no entre en conflicto con sus otras dependencias.
Potherca
30

En realidad, la solución correcta es:

composer require vendor/package

Tomado de la documentación de CLI para Composer :

El requirecomando agrega nuevos paquetes al composer.jsonarchivo desde el directorio actual.

php composer.phar require

Después de agregar / cambiar los requisitos, los requisitos modificados se instalarán o actualizarán.

Si no desea elegir los requisitos de forma interactiva, puede pasarlos al comando.

php composer.phar require vendor/package:2.* vendor/package2:dev-master

Si bien es cierto que composer updateinstala nuevos paquetes encontrados en composer.json, también actualizará el archivo composer.lock y cualquier paquete instalado de acuerdo con cualquier lógica difusa ( >o *caracteres después de los dos puntos) encontrados en composer.json. Esto se puede evitar usandocomposer update vendor/package , pero no recomendaría hacer un hábito, ya que eres un argumento olvidado lejos de un proyecto potencialmente roto ...

¡Mantenga las cosas cuerdas y quédese composer require vendor/packagepara agregar nuevas dependencias! 😉

Matthemattics
fuente
¿Pero el uso composer requireactualizará el archivo composer.lock?
Phil
2

Mi caso de uso es más simple y se ajusta simplemente a su título, pero no a sus detalles adicionales.

Es decir, quiero instalar un nuevo paquete que aún no está en mi composer.jsonsin actualizar todos los demás paquetes.

La solución aquí es composer require x/y

tembloroso
fuente
1

En mi caso, tuve un repositorio con:

  • requisitos A, B, C, D en .json
  • pero solo A, B, C en el .lock

Mientras tanto, A, B, C tenían versiones más nuevas con respecto cuando se generó el bloqueo.

Por alguna razón, eliminé los "proveedores" y quería hacer un composer installerror con el mensaje:

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Traté de ejecutar la solución desde Seldaek emitiendo un composer update vendorD/libraryDpero el compositor insistió en actualizar más cosas, así que.lock también había visto mi herramienta git.

La solución que usé fue:

  1. Eliminar todo el vendorsdirectorio.
  2. Elimine temporalmente el requisito VendorD/LibraryDde .json.
  3. ejecutar composer install.
  4. Luego borra el archivo .json y vuelva a pagarlo desde el repositorio (equivalente a volver a agregar el archivo, pero evitando posibles cambios en los espacios en blanco).
  5. Luego ejecute la solución de Seldaek composer update vendorD/libraryD

Instaló la biblioteca, pero además, gitdiff me mostró que en el.lock solo se agregaban cosas nuevas sin editar las otras.

(Thnx Seldaek para el puntero;))

Xavi Montero
fuente
Eso es una exageración. simplemente elimine el archivo de bloqueo y ejecute la instalación del compositor. funciona
astroanu
66
Eso sigue siendo cierto para entornos no profesionales, donde puedes reconstruir felizmente las dependencias y si algo se rompe, ve y arréglalo. Pero si para usted, los servidores que fallan significan que pierde $ 10,000 por hora, entonces no tiene dudas de que composer.locknunca deberían eliminarse y reconstruirse felizmente. .lockes ... para bloquear !! ; D: de lo contrario, el archivo de bloqueo sería inútil y no lo estaría cometiendo o no existiría en absoluto. Si se ejecuta en una empresa orientada a la calidad y reconstruye y compromete un bloqueo con, digamos, 1.000 dependencias, todas cambiarán y la gente de control de calidad vendrá a matarlo jajaja.
Xavi Montero
2
Hola @astroanu solo para aclarar que si instaló una dependencia en una fecha anterior y parte de ella dependía de la última versión de dev master, podría haber problemas importantes simplemente eliminando el composer.lock y simplemente presionando instalar. Si no ha tenido la oportunidad de verificar el impacto de la introducción de una dependencia, existe la posibilidad de obtener resultados inesperados y posiblemente crear una experiencia deficiente para los usuarios.
dkcwd
por supuesto, eliminar el archivo de bloqueo y ejecutar instalar / actualizar o ejecutar la actualización incluso sin eliminar el archivo de bloqueo afectará la estabilidad de las aplicaciones. La actualización del compositor debe ejecutarse solo en el entorno de desarrollo. En producción, siempre use la instalación del compositor porque la compilación de producción se prueba con lo que está guardado en el archivo de bloqueo.
astroanu