Usar o compositor do PHP para clonar o git repo

estou a tentar usar o compositor para clonar automaticamente um repositório git do GitHub que não está no packagist mas não está a funcionar e não consigo descobrir o que estou a fazer de errado.

acho que tenho de incluí-lo entre "repositórios" como este:

"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],

e depois provavelmente listá-lo na secção "require". Deve ser semelhante a Este exemplo mas não funciona. Ele apenas dá este erro:

as suas necessidades não puderam ser resolvidas um conjunto instalável de pacotes.

Alguém já tentou fazer algo assim?

Author: kenorb, 2012-10-18

7 answers

[[8]] no momento da escrita em 2013 esta foi uma maneira de fazê-lo. O compositor adicionou suporte para melhores maneiras: veja a resposta de @igorw 's

TEM UM REPOSITÓRIO?

Git, Mercurial, SVN é suportado pelo compositor.

TEM ACESSO DE ESCRITA AO REPOSITÓRIO?

Sim?

O REPOSITÓRIO TEM UM FICHEIRO composer.json

Se tiver um repositório onde possa escrever: adicione um ficheiro composer.json, ou corrija o existente um, e não use a solução abaixo.

Vai a @igorw 's responde

SÓ USAR ISTO SE NÃO TIVER UM REPOSITÓRIO
OU SE O REPOSITÓRIO NÃO TEM UM composer.json E VOCÊ NÃO PODE ADICIONÁ-LO

Isto irá sobrepor tudo o que o compositor pode ser capaz de ler a partir do repositório original composer.json, incluindo as dependências do pacote e o autoloading.

A utilização do tipo package transferirá o ónus da definição correcta tudo sobre ti. A maneira mais fácil é ter um arquivo composer.json no repositório, e apenas usá-lo.

Esta solução só é realmente para os casos raros em que você tem um download ZIP abandonado que você não pode alterar, ou um repositório que você só pode ler, mas não é mais mantido.

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}
 83
Author: Mike Graf, 2017-05-23 10:31:37

Esse pacote de facto está disponível através do packagist. Você não precisa de uma definição de repositório personalizado neste caso. Certifique-se apenas de adicionar um require (que é sempre necessário) com uma restrição de versão correspondente.

Em geral, se estiver disponível um pacote no packagist, não adicione um repo VCS. Só vai atrasar as coisas.


Para os pacotes que não estão disponíveis através do packagist, utilize um repositório de VCS (ou git), como mostrado no seu pergunta. Quando o fizer, certifique-se de que:

  • O campo "repositórios" é especificado no compositor raiz.json (é um campo root-only, as definições do repositório dos pacotes necessários são ignoradas)
  • a definição dos repositórios aponta para um repo vcs válido
  • Se o tipo for " git "em vez de" vcs " (como na sua pergunta), certifique-se de que é de facto um git repo
  • tem um requirepara o pacote em questão
  • a restrição no require corresponde ao versões fornecidas pelo Acordo de recompra VCS. Você pode usar composer show <packagename> para encontrar as versões disponíveis. Neste caso ~2.3 seria uma boa opção.
  • O nome no require corresponde ao nome no remoto composer.json. Neste caso, é gedmo/doctrine-extensions

Aqui está uma amostra composer.json que instala o mesmo pacote através de um repo VCS:

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

Oacordo de repo VCS explica tudo isto muito bem.


Se existir um repositório git (ou outro VCS) com um composer.json Disponível, Faça não utilizar um acordo de recompra" pacote". Os acordos de recompra de pacotes exigem que você forneça todos dos meta-dados na definição e irá ignorar completamente qualquer composer.json presente no dist e na fonte fornecidos. Eles também têm limitações adicionais, tais como não permitir atualizações adequadas na maioria dos casos.

Evitar acordos de recompra de pacotes (ver também os docs).

 113
Author: igorw, 2013-08-18 10:54:27

Poderá incluir o repositório git no compositor.json assim:

"repositories": [
{
    "type": "package",
    "package": {
        "name": "example-package-name", //give package name to anything, must be unique
        "version": "1.0",
        "source": {
            "url": "https://github.com/example-package-name.git", //git url
            "type": "git",
            "reference": "master" //git branch-name
        }
    }
}],
"require" : {
  "example-package-name": "1.0"
}
 36
Author: Edris, 2014-12-11 13:14:32

Diga ao compositor para usar o código, se disponível:

composer update --prefer-source

Ou:

composer install --prefer-source

Então irá obter pacotes como repositórios clonados em vez de tarballs extraídos, para que possa fazer algumas alterações e enviá-los de volta. Claro, assumindo que você tem permissões de escrita/envio para o repositório e o compositor sabe sobre o repositório do projeto.

Disclaimer: eu penso que eu posso responder a uma pergunta um pouco diferente, mas este era o que eu estava procurando quando eu encontrei esta pergunta, assim que eu espero que também seja útil aos outros.

Se o compositor não sabe onde está o repositório do projecto, ou se o projecto não tem o compositor adequado.json, a situação é um pouco mais complicada, mas outros já responderam a esses cenários.

 2
Author: Josef Kufner, 2016-11-24 23:18:30
Estava a encontrar o seguinte erro.: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

Se você está pedindo outro repo para fazer as suas próprias alterações você vai acabar com um novo repositório.

E. g:

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

O novo url terá de ir para a secção de repositórios do seu compositor.json.

Lembre-se se quiser referir-se ao seu garfo como my-foo/bar na sua secção de necessidades, terá de mudar o nome do pacote no ficheiro composer.json dentro do seu novo Acordo de recompra.

{
    "name":         "foo/bar",

=>

{
    "name":         "my-foo/bar",

Se você apenas bifurcou o mais fácil a forma de fazer isto é editá-lo dentro do github.

 2
Author: Henry, 2017-03-29 23:04:43
No meu caso, Uso o Symfony2. 3.x e o parâmetro de estabilidade mínima é por padrão "estável" (o que é bom). Eu queria importar um repo não no packagist, mas tinha o mesmo problema " seus requisitos não poderiam ser resolvidos para um conjunto instalável de pacotes.". Parecia que o compositor.json no repo eu tentei importar usar um mínimo de estabilidade "dev". Então, para resolver este problema, não se esqueça de verificar o {[[0]}. Resolvi-o requerendo uma versão dev-master em vez de master como indicado neste post .
 2
Author: Magus, 2017-11-14 23:25:01

Se quiser usar um composer.json do GitHub, veja este exemplo (sob a secção VCS).

A secção do pacote é para pacotes que não têm o {[[0]}. No entanto, você não seguiu esse exemplo também ou ele também teria funcionado. Leia o que diz sobre repositórios de pacotes:

Basicamente, você define a mesma informação que está incluída no repositório do compositor {[[2]}, mas apenas para um único pacote. Mais uma vez, o mínimo necessário os Campos São nome, versão, e ou de dist ou fonte.

 1
Author: Clarence, 2017-11-14 23:23:31