213 votes

Composer : comment installer une autre dépendance sans mettre à jour les anciennes ?

J'ai un projet avec quelques dépendances et je voudrais en installer une autre, mais je voudrais garder les autres comme elles sont. J'ai donc modifié le fichier composer.json mais si j'exécute composer install j'obtiens le résultat suivant :

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

Tout d'abord, j'ai installé mcrypt, donc je ne sais pas pourquoi il se plaint à ce sujet.

Alors, comment puis-je installer cette nouvelle dépendance ?

Mon composer.json :

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}

2 votes

L'avertissement de mcrypt peut provenir de plusieurs installations de php le php avec l'extension mcrypt peut ne pas être la même installation que votre php-cli.

323voto

Seldaek Points 12311

Pour installer un nouveau paquet et uniquement celui-ci, vous avez deux options :

  1. Utilisation de la require il suffit d'exécuter la commande :

    composer require new/package

    Composer déterminera la meilleure contrainte de version à utiliser, installera le paquet, et l'ajoutera à composer.lock .

    Vous pouvez également spécifier une contrainte de version explicite en exécutant :

    composer require new/package ~2.5

-OR-

  1. Utilisation de la update ajoutez manuellement le nouveau paquet à composer.json puis exécuter :

    composer update new/package

Si Composer se plaint en déclarant "Vos exigences n'ont pas pu être résolues en un ensemble de paquets installables", vous pouvez résoudre ce problème en passant l'indicateur --with-dependencies . Cela mettra sur une liste blanche toutes les dépendances du paquet que vous essayez d'installer/mettre à jour (mais aucune de vos autres dépendances).

En ce qui concerne les problèmes de l'auteur de la question avec Laravel et mcrypt : vérifiez qu'il est correctement activé dans votre CLI php.ini. Si php -m ne liste pas mcrypt alors il est absent.

Important : N'oubliez pas de préciser new/package lors de l'utilisation de composer update ! Si l'on omet cet argument, toutes les dépendances, ainsi que composer.lock à mettre à jour.

4 votes

J'ai reçu le message "Le paquet [...] listé pour la mise à jour n'est pas installé. Ignorer".

18 votes

Ça ne marche pas pour moi. On me dit "Le paquet "x/y" listé pour la mise à jour n'est pas installé. Ignorer." et ensuite il met tout à jour. Donc, il n'installe pas le nouveau paquet que je veux et il met à jour tout le reste, ce qui est exactement le contraire de ce que je veux.

4 votes

Ça ne marche pas. "Vos exigences n'ont pas pu être résolues en un ensemble de paquets installables". (et du texte sur d'anciens paquets, sans aucun rapport avec ce que je demande) alors que je demande juste de mettre à jour un paquet.

31voto

Lübnah Points 1355

En fait, la solution correcte est :

composer require vendor/package

Tiré du Documentation CLI pour Composer :

El require ajoute de nouveaux paquets au répertoire composer.json dans le répertoire actuel.

php composer.phar require

Après avoir ajouté/changé les exigences, les exigences modifiées seront installées ou mises à jour.

Si vous ne souhaitez pas choisir les exigences de manière interactive, vous pouvez simplement les transmettre à la commande.

php composer.phar require vendor/package:2.* vendor/package2:dev-master

S'il est vrai que composer update installe les nouveaux paquets trouvés dans composer.json, il mettra également à jour le fichier composer.lock et tous les paquets installés. selon une logique floue quelconque ( > o * chars après les deux points) trouvés dans composer.json ! Cela peut être évité en utilisant composer update vendor/package mais je ne recommanderais pas d'en faire une habitude, car vous êtes à un argument oublié d'un projet potentiellement cassé

Gardez votre sang-froid et tenez-vous en à composer require vendor/package pour l'ajout de nouvelles dépendances !

1 votes

Mais est-ce que l'utilisation composer require mettre à jour le fichier composer.lock ?

3voto

tremby Points 482

Mon cas d'utilisation est plus simple, et correspond simplement à votre titre mais pas à votre détail supplémentaire.

C'est-à-dire que je veux installer un nouveau paquet qui n'est pas encore dans ma base de données. composer.json sans mettre à jour tous les autres paquets.

La solution ici est composer require x/y

2voto

Andrew Points 7878

Nous pouvons installer un nouveau paquet sans mettre à jour les autres dépendances comme ceci :

 composer require package/name --no-update

cela ajoutera votre paquet à composer.json (pas de mise à jour de composer.lock)

composer update package/name

ceci va maintenant installer/mettre à jour votre nouveau paquet, en l'ajoutant à composer.lock sans mettre à jour les autres deps.

1voto

Xavi Montero Points 1791

Dans mon cas, j'avais un repo avec :

  • les exigences A,B,C,D dans .json
  • mais seulement A, B, C dans le .lock

Entre-temps, A, B, C avaient des versions plus récentes par rapport au moment où le verrou a été généré.

Pour une raison quelconque, j'ai supprimé les "vendeurs" et je voulais faire un composer install et a échoué avec le message :

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

J'ai essayé d'exécuter la solution de Seldaek en émettant une composer update vendorD/libraryD mais le compositeur a insisté pour mettre à jour d'autres choses, donc .lock avait trop de changements vus par mon outil git.

La solution que j'ai utilisée est la suivante :

  1. Supprimer tous les vendors dir.
  2. Supprimer temporairement l'exigence VendorD/LibraryD de la .json .
  3. exécuter composer install .
  4. Ensuite, supprimez le fichier .json et l'extraire à nouveau du dépôt (ce qui équivaut à ajouter à nouveau le fichier, mais en évitant les changements potentiels d'espacement).
  5. Exécutez ensuite la solution de Seldaek composer update vendorD/libraryD

Il a installé la bibliothèque, mais en plus, git .lock seules les nouvelles choses ont été ajoutées sans modifier les autres.

(Thnx Seldaek pour le pointeur ;) )

0 votes

C'est un peu exagéré. il suffit de supprimer le fichier de verrouillage et de lancer l'installation du compositeur. cela fonctionne

7 votes

Cela reste vrai pour les environnements non professionnels, où vous pouvez reconstruire les dépendances avec plaisir et, si quelque chose se casse, aller le réparer. Mais si pour vous, la défaillance d'un serveur signifie une perte de 10 000 dollars par heure, alors vous ne doutez pas que la composer.lock ne devrait jamais être supprimé et reconstruit avec bonheur. .lock est... pour le verrouillage ! ;D - sinon le fichier de verrouillage serait inutile et vous ne le valideriez pas ou il n'existerait pas du tout. Si vous travaillez dans une entreprise orientée qualité et que vous reconstruisez et commitez un verrou avec disons 1.000 dépendances, elles vont toutes changer, et les gens de l'assurance qualité vont venir vous tuer hahaha.

2 votes

Hey @astroanu, juste pour clarifier le fait que si vous avez installé une dépendance à une date antérieure et que certaines de ses dépendances récupéraient la dernière version de dev master, il pourrait y avoir des problèmes importants en supprimant simplement le composer.lock et en appuyant simplement sur installer. Si vous n'avez pas eu l'occasion de vérifier l'impact de l'introduction d'une dépendance, vous risquez d'obtenir des résultats inattendus et de créer une mauvaise expérience pour les utilisateurs.

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