140 votes

Utiliser PHP composer pour cloner le repo git

J'essaie d'utiliser compositeur pour cloner automatiquement un dépôt git depuis github qui n'est pas dans emballeur mais ça ne marche pas et je n'arrive pas à savoir ce que je fais de travers.

Je pense que je dois l'inclure dans les "dépôts" comme ceci :

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

et ensuite probablement le lister dans la section "require". Cela devrait être similaire à cet exemple mais ça ne fonctionne pas. Il donne juste cette erreur :

Vos besoins n'ont pas pu être résolus en un ensemble de paquets installables.

Quelqu'un a-t-il déjà essayé de faire quelque chose comme ça ?

160voto

igorw Points 12642

Ce paquet en fait est disponible auprès de Packagist . Vous n'avez pas besoin d'une définition de référentiel personnalisée dans ce cas. Assurez-vous simplement d'ajouter un require (qui est toujours nécessaire) avec une contrainte de version correspondante.

En général, si un paquet est disponible sur packagist, ne pas ajouter un repo VCS. Cela ne fera que ralentir les choses.


Pour les paquets qui ne sont pas disponibles par l'intermédiaire de packagist, utilisez l'option VCS (ou git), comme indiqué dans votre question. Lorsque vous le faites, assurez-vous que :

  • Le champ "repositories" est spécifié dans le composer.json de la racine (c'est un champ réservé à la racine, les définitions de dépôt des paquets requis sont ignorées).
  • La définition des référentiels pointe vers un référentiel VCS valide.
  • Si le type est "git" au lieu de "vcs" (comme dans votre question), assurez-vous qu'il s'agit bien d'un dépôt git.
  • Vous avez un require pour le paquet en question
  • La contrainte dans le require correspond aux versions fournies par le repo VCS. Vous pouvez utiliser composer show <packagename> pour trouver les versions disponibles. Dans ce cas ~2.3 serait une bonne option.
  • Le nom dans le require correspond au nom dans le fichier distant composer.json . Dans ce cas, c'est gedmo/doctrine-extensions .

En voici un exemple composer.json qui installe le même paquet via un repo VCS :

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

El Documents du dépôt VCS expliquent très bien tout cela.


S'il existe un dépôt git (ou autre VCS) avec un nom de fichier composer.json disponible, ne pas utiliser un dépôt de "paquet". Les dépôts de paquets nécessitent que vous fournissiez tous des métadonnées dans la définition et va ignorer complètement cualquier composer.json présents dans la dist et la source fournies. Ils ont également des limitations supplémentaires, comme le fait de ne pas permettre des mises à jour correctes dans la plupart des cas.

Évitez les dépôts de paquets ( voir aussi les docs ).

136voto

Mike Graf Points 1809

Au moment de la rédaction du présent document, en 2013, il s'agissait d'une façon de procéder. Composer a ajouté un support pour de meilleures méthodes : Voir @igorw 's réponse

AVEZ-VOUS UN RÉFÉRENTIEL ?

Git, Mercurial et SVN sont pris en charge par Composer.

AVEZ-VOUS UN ACCÈS EN ÉCRITURE AU RÉFÉRENTIEL ?

Oui ?

LE RÉFÉRENTIEL A-T-IL UN composer.json DOSSIER

Si vous disposez d'un référentiel dans lequel vous pouvez écrire : Ajouter un composer.json ou corrigez celui qui existe, et n'utilisez pas la solution ci-dessous.

Allez sur le site de @igorw réponse

À N'UTILISER QUE SI VOUS NE DISPOSEZ PAS D'UN RÉFÉRENTIEL.
OU SI LE RÉFÉRENTIEL N'A PAS DE FICHIER composer.json ET VOUS NE POUVEZ PAS L'AJOUTER

Cela remplacera tout ce que Composer peut être en mesure de lire à partir du fichier de dépôt original composer.json y compris les dépendances du paquet et l'autoloading.

Utilisation de la package type vous transfère la charge de tout définir correctement. Le moyen le plus simple est d'avoir un composer.json dans le référentiel, et l'utiliser.

Cette solution ne concerne que les rares cas où vous avez un téléchargement ZIP abandonné que vous ne pouvez pas modifier, ou un dépôt que vous ne pouvez que lire, mais qui n'est plus maintenu.

"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"
}

53voto

Edris Points 885

Vous pouvez inclure le dépôt git dans le fichier composer.json comme ceci :

"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"
}

10voto

FantomX1 Points 132

J'essaie de rejoindre les solutions mentionnées ici car il y a quelques points importants à énumérer.

  1. Comme indiqué dans la réponse de @igorw, l'URL du dépôt doit dans ce cas être spécifiée dans le fichier composer.json. Cependant, étant donné que dans les deux cas, le fichier composer.json doit exister (contrairement à la deuxième méthode de @Mike Graf), la publication sur Packagist n'est pas très différente (de plus, Github fournit actuellement des services de paquets comme les paquets npm).

  2. En outre, elle présente le défaut de ne pas pouvoir s'appuyer sur une bibliothèque externe qui utilise cette approche, car les définitions récursives de référentiel ne fonctionnent pas dans Composer. De plus, à cause de cela, il semble y avoir un "bug", puisque la définition récursive a échoué à la dépendance, respécifier les dépôts explicitement dans la racine ne semble pas être suffisant mais aussi toutes les dépendances des paquets devraient être respécifiées.

Avec un fichier de composition (répondu le 18 Oct '12 à 15:13 igorw)

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

Sans un fichier de composition (répondu le 23 janvier 13 à 17:28 Mike Graf)

"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"
}

8voto

Josef Kufner Points 958

Dites simplement au compositeur d'utiliser la source si elle est disponible :

composer update --prefer-source

Ou :

composer install --prefer-source

Vous obtiendrez alors des paquets sous la forme de dépôts clonés au lieu de tarballs extraits, ce qui vous permettra d'effectuer des modifications et de les renvoyer. Bien sûr, en supposant que vous ayez des droits d'écriture/de poussée sur le dépôt et que Composer connaisse le dépôt du projet.

Avis de non-responsabilité : je pense avoir répondu à une question un peu différente, mais c'est ce que je cherchais lorsque j'ai trouvé cette question, donc j'espère que cela sera utile à d'autres également.

Si Composer ne sait pas où se trouve le dépôt du projet, ou si le projet n'a pas de composer.json approprié, la situation est un peu plus compliquée, mais d'autres ont déjà répondu à de tels scénarios.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X