Comment exiger correctement un commit spécifique dans Composer afin qu'il soit disponible pour les packages dépendants?

108

J'ai une bibliothèque foo/foo-libqui requiresengage un particulier de GitHub:

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

et ça marche bien:

$ 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

mais quand j'ai besoin de cette bibliothèque dans un autre projet:

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

cela produit une erreur de dépendance:

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.

Ma question est donc: comment correctement requirele commit spécifique de GitHub dans ma bibliothèque, afin qu'il soit disponible dans les packages dépendants?

Maciej Sz
la source
3
Sachez que lors de la demande de validation, le compositeur ne respectera pas les exigences de validation (cmoposer.json). Au lieu de cela, il calcule l'exigence de tête de branche qui changera avec le temps. Cela pourrait donc fonctionner pendant un certain temps, mais se cassera à coup sûr à l'avenir.
estani

Réponses:

157

Vous devrez explicitement exiger la bibliothèque Gaufrette à ce hachage, avec un devindicateur, à la fois dans votre bibliothèque et votre application. Quelque chose comme ça devrait fonctionner dans l'application 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"
    }
}

De la documentation :

Si l'une de vos dépendances a une dépendance sur un package instable, vous devez également l'exiger explicitement, ainsi que son indicateur de stabilité suffisant.

La documentation suggère également que vous devrez inclure le référentiel de Gaufrette dans votre bar/bar-appfichier Composer, même si cela semble ne pas être nécessaire dans ce cas. Je ne sais pas pourquoi.

Chris
la source
J'ai déjà essayé ça, ça ne marche pas non plus. Je pense que cela peut avoir quelque chose à voir avec le fait que Composer préfère spécifiquement Packagist à GitHub?
Maciej Sz
Non, j'ai vérifié auprès de mes référentiels locaux - ce n'est pas un problème spécifique à GitHub.
Maciej Sz
Je suis à peu près certain que cela fonctionne avant. Et si vous ajoutez "minimum-stability": "dev"aux bar/bar-appexigences?
Chris
3
Il semble que vous allez devoir explicitement exiger Gaufrette à ce hachage à la fois dans votre bibliothèque et votre application. "Si l'une de vos dépendances a une dépendance sur un paquet instable, vous devez également l'exiger explicitement, avec son indicateur de stabilité suffisant." Notez que vous pouvez avoir certains paquets, par exemple Gaufrette, à la devstabilité, et par défaut stablepour tout le reste.
Chris
2
On dirait que GitHub est pris en charge par Composer hors de la boîte - je viens de supprimer le "url": "https://github.com/KnpLabs/Gaufrette.git"premier package et cela fonctionne toujours.
Maciej Sz
15

Voici comment procéder sur la ligne de commande:

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

Vous n'êtes pas obligé d'utiliser tout le hachage, un hachage de sept caractères semble faire l'affaire. Comme mentionné ci-dessus, votre projet devra prendre en charge le développement - dont il se plaindra s'il n'est pas déjà défini. Utilisez également --with-dependenciespour obtenir les dépendances de celui que vous mettez à jour.

powpow12
la source
0

Si vous effectuez des modifications pour un dépôt Git en forçant, assurez-vous que vous utilisez le nom du package est réellement défini dans le propre fichier composer.json du package - donc même si j'avais forké le package vers mon propre compte github joshuapaling, et le paquet résidait maintenant à l'URL https://github.com/joshuapaling/Cake-Resque.git , qui n'avait pas du tout influencé le nom du paquet, du point de vue des compositeurs.

Une erreur stupide - mais je suis nouveau compositeur, et ce n'était pas clair au début! Donc, j'espère que cela aidera quelqu'un d'autre avec le même problème.

Gayan Kalhara
la source