Pergunta

Eu já tenho o geoip2 pacote instalado.Quando o instalei há algum tempo, ele exigia o guzzle 3.*, então instalou o guzzle 3.9.1 como uma de suas dependências.

Agora quero instalar o previsão pacote, então adicionei-o ao meu compositor.json

"require": {
    ...
    ...
    "geoip2/geoip2": "0.6.*",
    "predictionio/predictionio": "~0.7.1"
}

A questão é previsão requer o guzzle 3.8.0 ou 3.8.1, ele não aceitará a versão 3.9.1 já instalada.

Eu acredito beber 3.8.0 satisfaria ambos geoip2 e previsão, então a questão é como posso fazer o downgrade beber, tendo em mente beber não aparece no meu compositor.json, apenas no compositor.lock.

Abaixo está a saída quando executo 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].
Foi útil?

Solução

Você não precisa adicionar o Guzzle ao seu composer.json.Tudo que você precisa fazer é atualizar o Guzzle ao adicionar o novo pacote.(isso fará o downgrade do Guzzle para atender aos requisitos do PredictionIO)

Simplesmente execute

composer update predictionio/predictionio guzzle/guzzle

Como você pode ver, você pode fornecer vários pacotes para composer update separando-os com um espaço.Isto é descrito em a documentação.

Outras dicas

Algumas dicas relacionadas à pergunta:

Correndo composer update named/package, você só permite que este pacote seja adicionado ou que sua versão seja aumentada, mas nada mais.O mesmo (mas apenas adicionando coisas) acontecerá com composer require named/package:~1.0 (esta é uma ótima maneira de adicionar coisas sem precisar mexer na formatação json).

A solução mais simples ao atualizar coisas é apenas executar composer update.Sem um nome de pacote, TODOS os pacotes podem ser atualizados.

Atualizar tudo pode ser um pouco arriscado se você não tiver cuidado ao selecionar seus pacotes de software.Pessoalmente, recomendo usar software que de alguma forma pareça usar controle de versão semântico, o que permite muito bem usar o requisito de versão til no Composer.Eu diria que todos deveriam tentar usar ~X.Y como a descrição da versão, porque isso permite a instalação de patches e atualizações compatíveis.

As bibliotecas que você usa devem permitir versões suficientemente definidas de SUAS dependências.No seu exemplo, o predictionio/predictionio pacote requer guzzle/guzzle:~3.8.0 - eles provavelmente têm motivos para fazer isso, mas por sua vez forçam todos que tentam usar seu software a usar o Guzzle 3.8.0 ou 3.8.1.Duvido que os mantenedores do Guzzle quebrem a compatibilidade com versões anteriores, porque eles sabem que criam um software básico muito importante que deve funcionar, e acho que receberão relatórios de bugs em breve, caso quebrem alguma coisa.Eu gostaria muito de ver as dependências de qualquer biblioteca para permitir atualizações compatíveis sem restrições, ou seja,nesse caso ~3.8 seria muito melhor.

Evite a todo custo depender de filiais.Se for inevitável usar uma ramificação, atribua a ela um número de versão de alias: require: { "named/package": "dev-master as 1.2.2" } Se nenhum número de versão adequado puder ser adivinhado em versões anteriores, comece com 0.0.0.Dessa forma, você pode mudar para uma versão lançada posteriormente, que se integrará melhor ao restante dos números de versão.

Se você deseja instalar uma versão específica de um pacote, você pode simplesmente adicionar isso ao seu compositor.json no exigir seção:

    "guzzle/guzzle" : "3.8.0",

E então

  composer update guzzle/guzzle
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top