Composer dos paquetes en conflicto con la versión de dependencia
-
21-12-2019 - |
Pregunta
ya tengo el geoip2 paquete instalado.Cuando lo instalé hace algún tiempo, requería guzzle 3.* así que instalé guzzle 3.9.1 como una de sus dependencias.
Ahora quiero instalar el predicción paquete, así que lo agregué a mi compositor.json
"require": {
...
...
"geoip2/geoip2": "0.6.*",
"predictionio/predictionio": "~0.7.1"
}
El problema es predicción requiere guzzle 3.8.0 o 3.8.1, no aceptará la versión 3.9.1 ya instalada.
Yo creo engullir 3.8.0 satisfaría ambos geoip2 y predicción, entonces la pregunta es ¿cómo puedo bajar la categoría? engullir, teniendo en cuenta engullir no aparece en mi compositor.json, solo el compositor.lock.
A continuación se muestra el resultado cuando ejecuto composer update predictionio/predictionio
Problem 1
- Installation request for predictionio/predictionio ~0.7.1 -> satisfiable by predictionio/predictionio[v0.7.1].
- Conclusion: remove guzzle/guzzle v3.9.1
- predictionio/predictionio v0.7.1 requires guzzle/guzzle ~3.8.0 -> satisfiable by guzzle/guzzle[v3.8.0, v3.8.1].
- Can only install one of: guzzle/guzzle[v3.9.1, v3.8.0].
- Can only install one of: guzzle/guzzle[v3.9.1, v3.8.1].
- Installation request for guzzle/guzzle == 3.9.1.0 -> satisfiable by guzzle/guzzle[v3.9.1].
Solución
No necesitas agregar Guzzle a tu composer.json
.Todo lo que tienes que hacer es actualizar Guzzle cuando agregas el nuevo paquete.(Esto degradará Guzzle para que coincida con los requisitos de PredictionIO)
Simplemente ejecuta
composer update predictionio/predictionio guzzle/guzzle
Como puede ver, puede proporcionar varios paquetes para composer update
separándolos con un espacio.Esto se describe en la documentación.
Otros consejos
Algunas sugerencias relacionadas con la pregunta:
Mediante la ejecución composer update named/package
, solo permites agregar este paquete o aumentar su versión, pero nada más.Lo mismo (pero solo agregando cosas) sucederá con composer require named/package:~1.0
(Esta es una buena manera de agregar cosas sin tener que alterar el formato json).
La solución más sencilla a la hora de actualizar cosas es ejecutar únicamente composer update
.Sin un nombre de paquete, TODOS los paquetes pueden actualizarse.
Actualizar todo puede ser un poco arriesgado si no tiene cuidado al seleccionar sus paquetes de software.Personalmente, recomiendo usar software que de alguna manera parezca usar versiones semánticas, lo que muy bien permite usar el requisito de versión de tilde en Composer.Yo diría que todo el mundo debería intentar utilizar ~X.Y
como descripción de la versión, porque esto permite instalar tanto parches como actualizaciones compatibles.
Las bibliotecas que utilice deben permitir versiones suficientemente definidas de SUS dependencias.En su ejemplo, el predictionio/predictionio
el paquete requiere guzzle/guzzle:~3.8.0
- Probablemente tengan razones para hacerlo, pero a su vez obligan a todos los que intentan utilizar su software a utilizar Guzzle 3.8.0 o 3.8.1.Dudo que los mantenedores de Guzzle rompan la compatibilidad con versiones anteriores, porque saben que crean una pieza de software básica muy importante que se espera que funcione, y creo que recibirán informes de errores muy pronto si, de todos modos, rompen cosas.Me gustaría mucho ver las dependencias de cualquier biblioteca para permitir actualizaciones compatibles sin restricciones, es decir.en este caso ~3.8
Sería mucho mejor.
Evita a toda costa depender de sucursales.Si es inevitable utilizar una rama, asígnele un número de versión de alias: require: { "named/package": "dev-master as 1.2.2" }
Si no se puede adivinar el número de versión adecuado de versiones anteriores, comience con 0.0.0.De esa manera podrás cambiar a una versión lanzada más adelante, que se integrará mejor con el resto de números de versión.
Si desea instalar una versión específica de un paquete, simplemente puede agregar esto a su compositor.json en la sección Requerir :
"guzzle/guzzle" : "3.8.0",
y luego
composer update guzzle/guzzle