Como exigir corretamente um commit específico no Composer para que ele esteja disponível para pacotes dependentes?

108

Eu tenho uma biblioteca foo/foo-libcom requiresum commit específico do GitHub:

{
    "name": "foo/foo-lib",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/KnpLabs/Gaufrette.git"
        }
    ],
    "require": {
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

e funciona bem:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                                 
  - Updating knplabs/gaufrette dev-master (2633721 => 2633721)
    Checking out 2633721877cae79ad461f3ca06f3f77fb4fce02e

Generating autoload files

mas quando eu exigir essa biblioteca em outro projeto:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master"
    }
}

produz erro de dependência:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for foo/foo-lib dev-master -> satisfiable by foo/foo-lib[dev-master].
    - foo/foo-lib dev-master requires knplabs/gaufrette dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e -> no matching package found.

Então minha pergunta é: como fazer corretamente requireo commit específico do GitHub na minha biblioteca, para que fique disponível em pacotes dependentes?

Maciej Sz
fonte
3
Esteja ciente de que ao solicitar um commit, o composer não respeitará os requisitos do commit (cmoposer.json). Em vez disso, ele calcula o requisito de cabeça de ramal que mudará com o tempo. Portanto, isso pode funcionar por um tempo, mas será interrompido no futuro.
Estani

Respostas:

157

Você terá que exigir explicitamente a biblioteca Gaufrette naquele hash, com um devsinalizador, em sua biblioteca e em seu aplicativo. Algo assim deve funcionar no aplicativo composer.json:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master",
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

Da documentação :

Se uma de suas dependências depende de um pacote instável, você também precisa exigi-lo explicitamente, junto com seu sinalizador de estabilidade suficiente.

A documentação também sugere que você precisará incluir o repositório para Gaufrette em seu bar/bar-apparquivo Composer, embora pareça que isso não seja necessário neste caso. Não sei por quê.

Chris
fonte
Eu já tentei isso, também não funciona. Eu acho que pode ter algo a ver com o Composer preferir o Packagist em vez do GitHub especificamente?
Maciej Sz
Não, eu verifiquei com meus repositórios locais - não é um problema específico do GitHub.
Maciej Sz
Tenho quase certeza de que já fiz isso funcionar antes. E se você adicionar "minimum-stability": "dev"aos bar/bar-apprequisitos?
Chris
3
Ele parece que você está indo ter que exige explicitamente Gaufrette naquele hash em ambos sua biblioteca, e sua aplicação. "Se uma de suas dependências depende de um pacote instável, você também precisa exigi-lo explicitamente, junto com seu sinalizador de estabilidade suficiente." Observe que você pode ter alguns pacotes, por exemplo, Gaufrette, em devestabilidade e padrão stablepara todo o resto.
Chris
2
Parece que o GitHub é compatível com o Composer fora da caixa - acabei de remover o "url": "https://github.com/KnpLabs/Gaufrette.git"do primeiro pacote e ele ainda funciona.
Maciej Sz
15

Aqui está como você faz isso na linha de comando:

composer update knplabs/gaufrette:dev-master#2633721 --with-dependencies

Você não precisa usar o hash inteiro, um hash de sete caracteres parece fazer o truque. Conforme mencionado acima, seu projeto precisará suportar dev - do qual reclamará se ainda não estiver definido. Além disso, use --with-dependenciespara obter quaisquer dependências daquele que você está atualizando.

powpow12
fonte
0

Se você estiver fazendo alterações em um repositório Git bifurcando, certifique-se de usar o O nome do pacote está realmente definido no próprio arquivo composer.json do pacote - então, embora eu tenha bifurcado o pacote para minha própria conta joshuapaling github, e o pacote estava agora residindo na URL https://github.com/joshuapaling/Cake-Resque.git , que não tinha influenciado o nome do pacote, da perspectiva do compositor.

Um erro estúpido - mas sou novo no compositor e não ficou claro no início! Portanto, espero que isso ajude alguém com o mesmo problema.

Gayan Kalhara
fonte