Compositor: como posso instalar outra dependência sem atualizar as antigas?

196

Eu tenho um projeto com algumas dependências e gostaria de instalar outro, mas gostaria de manter os outros do jeito que são. Então eu editei o composer.json, mas se eu executar composer install, recebo a seguinte saída:

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.

Primeiro de tudo, eu tenho o mcrypt instalado, então não sei por que está reclamando disso lá.

Então, como posso instalar essa nova dependência?

Meu compositer.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"
}
dualidade_
fonte
1
O aviso mcrypt poderia ser de várias instalações php ... o php com extensão mcrypt não pode ser a mesma instalação como seu php-cli
Matthemattics

Respostas:

293

Para instalar um novo pacote e somente isso, você tem duas opções:

  1. Usando o requirecomando, basta executar:

    composer require new/package
    

    O Composer irá adivinhar a melhor restrição de versão a ser usada, instalar o pacote e adicioná-lo composer.lock.

    Você também pode especificar uma restrição de versão explícita executando:

    composer require new/package ~2.5
    

-OU-

  1. Usando o updatecomando, adicione o novo pacote manualmente a composer.jsone execute:

    composer update new/package
    

Se o Composer reclamar, afirmando "Seus requisitos não puderam ser resolvidos para um conjunto instalável de pacotes.", Você pode resolver isso passando o sinalizador --with-dependencies . Isso lista todas as dependências do pacote que você está tentando instalar / atualizar na lista de permissões (mas nenhuma de suas outras dependências).

Com relação aos problemas das pessoas que perguntam ao Laravel e ao mcrypt: verifique se ele está ativado corretamente no seu php.ini da CLI. Se php -mnão listar mcrypt, está faltando.

Importante: Não se esqueça de especificar new/packageao usar composer update! Omitir esse argumento fará com que todas as dependências composer.locksejam atualizadas.

Seldaek
fonte
3
Recebi a mensagem "O pacote [...] listado para atualização não está instalado. Ignorando".
Gerry
11
Isso não funciona para mim. Foi-me dito que o pacote "x / y" listado para atualização não está instalado. Ignorando "e, em seguida, ele vai sobre como atualizar tudo isso, não instalar o novo pacote eu quero e ele atualiza tudo o resto, que é exatamente o oposto do que eu quero...
tremby
3
Simplesmente não funciona. "Seus requisitos não puderam ser resolvidos para um conjunto instalável de pacotes." (e texto sobre alguns pacotes antigos, sem relação alguma com os quais eu pergunto) quando pergunto, basta atualizar um pacote.
OZ_
@ tremby Funciona muito bem aqui. Talvez você tenha esquecido de adicionar "new/package" : "*",na "require"seção composer.json ?
Potherca
@OZ_ Mesmo que apenas uma dependência seja instalada, ela ainda precisa ser resolvida primeiro para garantir que não entre em conflito com suas outras dependências.
Potherca
30

Na verdade, a solução correta é:

composer require vendor/package

Retirado da documentação da CLI do Composer :

O requirecomando adiciona novos pacotes ao composer.jsonarquivo do diretório atual.

php composer.phar require

Após adicionar / alterar os requisitos, os requisitos modificados serão instalados ou atualizados.

Se você não deseja escolher os requisitos interativamente, basta passá-los para o comando.

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

Embora seja verdade que composer updateinstala novos pacotes encontrados no composer.json, ele também atualiza o arquivo composer.lock e todos os pacotes instalados de acordo com qualquer lógica difusa ( >ou *caracteres após os dois pontos) encontrados no compositer.json! Isso pode ser evitado usandocomposer update vendor/package , mas eu não recomendaria criar um hábito, pois você é um argumento esquecido longe de um projeto potencialmente interrompido ...

Mantenha as coisas sãs e mantenha-as composer require vendor/packagepara adicionar novas dependências! 😉

Matthemattics
fonte
Mas o uso de composer requireatualização do arquivo composer.lock?
Phil
2

Meu caso de uso é mais simples e se encaixa simplesmente no seu título, mas não nos detalhes adicionais.

Ou seja, quero instalar um novo pacote que ainda não esteja no meu composer.jsonsem atualizar todos os outros pacotes.

A solução aqui é composer require x/y

tremer
fonte
1

No meu caso, tive um repo com:

  • requisitos A, B, C, D em .json
  • mas apenas A, B, C no .lock

Enquanto isso, A, B, C tinha versões mais recentes com respeito quando o bloqueio foi gerado.

Por alguma razão, excluí os "fornecedores" e queria fazer um composer installe falhei com a mensagem:

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.

Tentei executar a solução da Seldaek emitindo um composer update vendorD/libraryDcompositor, mas insisti em atualizar mais coisas, então.lock também havia mudanças na minha ferramenta meu git.

A solução que usei foi:

  1. Exclua todo o vendorsdir.
  2. Remova temporariamente o requisito VendorD/LibraryDdo .json.
  3. correr composer install.
  4. Em seguida, exclua o arquivo .jsone faça o check-out novamente no repositório (equivalente a adicionar novamente o arquivo, mas evitando possíveis alterações de espaço em branco).
  5. Em seguida, execute a solução da Seldaek composer update vendorD/libraryD

Ele instalou a biblioteca, mas, além disso, o gitdiff me mostrou que .lockapenas as novas coisas foram adicionadas sem editar as outras.

(Thnx Seldaek para o ponteiro;))

Xavi Montero
fonte
isso é um exagero. basta excluir o arquivo de bloqueio e executar a instalação do compositor. funciona
astroanu
6
Isso permanece verdadeiro para ambientes não profissionais, onde você pode reconstruir as dependências com alegria e, se algo acontecer, você o corrige. Mas se, para você, a falha dos servidores significa que você perde US $ 10.000 por hora, não duvida que composer.locknunca deve ser felizmente excluído e reconstruído. .locké ... para trancar !! ; D - caso contrário, o arquivo de bloqueio seria inútil e você não o confirmaria ou não existiria. Se você administrar uma empresa orientada à qualidade e reconstruir e confirmar um bloqueio com, digamos, 1.000 dependências, todas elas mudarão e o pessoal de controle de qualidade virá para matá-lo, hahaha.
Xavi Montero
2
Hey @astroanu, apenas para esclarecer que, se você instalou uma dependência em uma data anterior e parte dela dependia da versão mais recente do dev master, poderia haver problemas significativos em simplesmente excluir o compositor.lock e apenas clicar em instalar. Se você não teve a oportunidade de verificar o impacto da introdução de uma dependência, existe potencial para resultados inesperados e, possivelmente, criando uma experiência ruim para os usuários.
dkcwd
é claro que excluir o arquivo de bloqueio e executar a instalação / atualização ou executar a atualização mesmo sem excluir o arquivo de bloqueio afetará a estabilidade dos aplicativos. A atualização do compositor deve ser executada apenas no ambiente de desenvolvimento. Na produção, use sempre a instalação do compositor, porque a construção da produção é testada em relação ao que é salvo no arquivo de bloqueio.
Astroanu