web-dev-qa-db-fra.com

Utilisez PHP composer pour cloner le dépôt git

J'essaie d'utiliser composer pour cloner automatiquement un dépôt git à partir de github qui n'est pas présent dans packagist mais cela ne fonctionne pas et je ne peux pas comprendre ce que je fais. faux.

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

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

et ensuite probablement l'énumérer dans la section "require". Il devrait ressembler à cet exemple mais cela ne fonctionne pas. Cela donne juste cette erreur:

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

Est-ce que quelqu'un a déjà essayé de faire quelque chose comme ça?

95
martin

Au moment d'écrire en 2013, c'était une façon de le faire. Composer a ajouté le support pour de meilleures façons: voir @igorw's answer

AVEZ-VOUS UN DÉPÔT?

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

AVEZ-VOUS UN ACCÈS ÉCRITE AU DÉPÔT?

Oui?

LE REPOSITORY A-T-IL UN FICHIER composer.json

Si vous avez un référentiel, vous pouvez écrire dans: Ajoutez un fichier composer.json, Ou corrigez le fichier existant, et N'UTILISEZ PAS la solution ci-dessous.

Allez à @igorw's réponse

UTILISEZ UNIQUEMENT CELA SI VOUS N'AVEZ PAS DE DÉPÔT
OU SI LE REPOSITOIRE N'A PAS UN composer.json ET VOUS NE POUVEZ PAS L'AJOUTER

Ceci remplacera tout ce que Composer pourra peut-être lire à partir du composer.json Du référentiel d'origine, y compris les dépendances du paquet et le chargement automatique.

L'utilisation du type package transférera la charge de la définition correcte de tout sur vous. Le moyen le plus simple est d’avoir un fichier composer.json Dans le référentiel et de l’utiliser.

Cette solution concerne uniquement les rares cas où vous avez un téléchargement Zip abandonné que vous ne pouvez pas modifier, ou un référentiel que vous ne pouvez que lire, mais il 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"
}
97
Mike Graf

Ce paquet en fait est disponible via packagist . Dans ce cas, vous n'avez pas besoin d'une définition de référentiel personnalisé. Assurez-vous simplement d’ajouter un require (qui est toujours nécessaire) avec une contrainte de version correspondante.

En général, si un package est disponible sur packagist, n'ajoutez pas d'ajout de rapport VCS. Cela ne fera que ralentir les choses.


Pour les packages qui ne sont pas disponibles via packagist, utilisez un référentiel VCS (ou git), comme indiqué dans votre question. Lorsque vous le faites, assurez-vous que:

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

Voici un exemple composer.json Qui installe le même package via un dépôt VCS:

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

Les documentation de dépôt VCS expliquent tout cela très bien.


S'il existe un référentiel git (ou un autre VCS) avec un composer.json Disponible, n'utilisez pas un référentiel "package". Les pensions de paquets exigent que vous fournissiez tous des métadonnées dans la définition et complètement ignorer tout composer.json Présent dans les sources et sources dist. Fournies. Ils ont également des limitations supplémentaires, telles que ne pas permettre des mises à jour appropriées dans la plupart des cas.

Évitez les pensions de paquets ( voir aussi la documentation ).

131
igorw

Vous pouvez inclure le dépôt git dans 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"
}
41
Edris

Il suffit de dire à composer d'utiliser le source si disponible):

composer update --prefer-source

Ou:

composer install --prefer-source

Vous obtiendrez ensuite les paquets sous forme de référentiels clonés au lieu d'archives extraites, ce qui vous permettra d'apporter des modifications et de les valider. Bien sûr, en supposant que vous ayez les autorisations d'écriture/Push sur le référentiel et que Composer) connaisse le référentiel du projet.

Déni de responsabilité: Je pense avoir répondu à une question un peu différente, mais c’était ce que je recherchais lorsque j’ai trouvé cette question; j’espère donc qu’elle sera utile aux autres également.

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

4
Josef Kufner

Je rencontrais l'erreur suivante: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

Si vous demandez à un autre référentiel de faire vos propres modifications, vous vous retrouverez avec un nouveau référentiel.

Par exemple:

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

La nouvelle URL devra aller dans la section référentiels de votre composer.json.

N'oubliez pas si vous voulez vous référer à votre fork comme my-foo/bar dans votre section require, vous devrez renommer le paquet dans le composer.json fichier dans votre nouveau dépôt.

{
    "name":         "foo/bar",

=>

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

Si vous venez de créer un fichier, le moyen le plus simple de le faire est de le modifier directement dans github.

3
Henry

Dans mon cas, j'utilise Symfony2.3.x et le paramètre minimum-stabilité est par défaut "stable" (ce qui est bien). Je voulais importer un référentiel qui ne soit pas dans packagist mais qui posait le même problème "Vos exigences ne pouvaient pas être résolues avec un ensemble de packages pouvant être installé.". Il est apparu que le composer.json dans le dépôt que j'ai essayé d'importer utilise un "dev" à stabilité minimale.

Donc, pour résoudre ce problème, n'oubliez pas de vérifier le minimum-stability. Je l'ai résolu en demandant un dev-master version au lieu de master comme indiqué dans ce post .

2
Magus

Si vous voulez utiliser un composer.json De GitHub, regardez cet exemple (sous la section VCS).

La section des paquets concerne les paquets qui n'ont pas le composer.json. Cependant, vous n'avez pas suivi cet exemple aussi, sinon cela aurait également fonctionné. Lisez ce qui est écrit sur les référentiels de paquets:

Fondamentalement, vous définissez les mêmes informations que celles incluses dans le packages.json Du référentiel composer, mais uniquement pour un seul package. Encore une fois, les champs obligatoires minimum sont name, version et dist ou source.

1
Clarence