Compositore due pacchetti in conflitto sulla versione di dipendenza
-
21-12-2019 - |
Domanda
Ho già il GeoIP2 Pacchetto installato. Quando l'ho installato qualche tempo fa, è necessario Guzzle 3. * Quindi ha installato Guzzle 3.9.1 come una delle sue dipendenze.
Ora voglio installare il predicitonio pacchetto, quindi l'ho aggiunto al mio compositore.json
"require": {
...
...
"geoip2/geoip2": "0.6.*",
"predictionio/predictionio": "~0.7.1"
}
.
Il problema è predizione richiede Guzzle 3.8.0 o 3.8.1, non lo farà Accetta la versione già installata 3.9.1.
Credo
Sotto è l'uscita quando eseguo 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].
. Soluzione
Non è necessario aggiungere Guzzle al composer.json
.Tutto quello che devi fare è aggiornare il Guzzle quando aggiungi il nuovo pacchetto.(Questo sarà downgrade Guzzle per abbinare i requisiti predizionali)
Basta eseguire
composer update predictionio/predictionio guzzle/guzzle
.
Come puoi vedere, è possibile fornire più pacchetti a composer update
separandoli con uno spazio.Questo è descritto in La documentazione .
Altri suggerimenti
Alcuni suggerimenti relativi alla domanda:
Eseguendo composer update named/package
, consentono solo questo pacchetto di essere aggiunto o è aumentato la versione, ma nient'altro. Lo stesso (ma solo aggiungere roba) accadrà con composer require named/package:~1.0
(questo è un bel modo per aggiungere cose senza dover scherzare con la formattazione JSON).
La soluzione più semplice quando si aggiorna cose è eseguire solo composer update
. Senza un nome di un pacchetto, tutti i pacchetti possono essere aggiornati.
Aggiornamento tutto potrebbe essere un po 'rischioso se non è stato attento con la selezione dei pacchetti software. Personalmente consiglio di utilizzare il software che in qualche modo sembra usare versione semantica, che consente molto bene di utilizzare il requisito della versione Tilde nel compositore. Direi che tutti dovrebbero provare a utilizzare ~X.Y
come descrizione della versione, poiché ciò consente di installare entrambe le patch e gli aggiornamenti compatibili.
Librerie che usi dovrebbero consentire abbastanza versioni definite per le loro dipendenze. Nell'esempio, il pacchetto predictionio/predictionio
richiede guzzle/guzzle:~3.8.0
: probabilmente hanno ragioni per farlo, ma a sua volta costringono tutti quelli che tentano di utilizzare il loro software per utilizzare Guzzle 3.8.0 o 3.8.1. Dubito che i manutentori dei Guzzle rompano la compatibilità all'indietro, perché sanno che creano un pezzo di software molto importante e di base che dovrebbe funzionare, e penso che riceveranno segnalazioni di bug piuttosto presto dovrebbero rompere la roba comunque. Mi piacerebbe molto vedere le dipendenze di qualsiasi biblioteca per consentire aggiornamenti compatibili senza restrizioni, cioè in questo caso ~3.8
sarebbe molto meglio.
Evitare a seconda dei rami a tutti i costi. Se è inevitabile utilizzare un ramo, assegnarlo un numero di versione alias: require: { "named/package": "dev-master as 1.2.2" }
Se nessun numero di versione appropriato può essere indovinato dalle uscite precedenti, iniziano con 0.0.0. In questo modo è possibile passare a una versione rilasciata in seguito, il che si integrerà meglio nel resto dei numeri di versione.
Se si desidera installare una versione specifica di un pacchetto, puoi semplicemente aggiungere questo al tuo compositore.json in richiedi sezione:
"guzzle/guzzle" : "3.8.0",
.
e poi
composer update guzzle/guzzle
.