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

196

J'ai un projet avec quelques dépendances et j'aimerais en installer un autre, mais j'aimerais garder les autres tels qu'ils sont. J'ai donc édité le composer.json, mais si je lance composer install, j'obtiens la sortie suivante:

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 s'en plaint.

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

Mon compositeur.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"
}
dualité_
la source
1
L'avertissement mcrypt pourrait provenir de plusieurs installations php… le php avec l'extension mcrypt peut ne pas être la même installation que votre php-cli
Matthemattics

Réponses:

293

Pour installer un nouveau package et seulement cela, vous avez deux options:

  1. En utilisant la requirecommande, lancez simplement:

    composer require new/package
    

    Composer devinera la meilleure contrainte de version à utiliser, installera le package et l'ajoutera à composer.lock.

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

    composer require new/package ~2.5
    

-OU-

  1. À l'aide de la updatecommande, ajoutez manuellement le nouveau package à composer.json, puis exécutez:

    composer update new/package
    

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

Concernant les problèmes du poseur de questions avec Laravel et mcrypt: vérifiez qu'il est correctement activé dans votre php.ini CLI. Si php -mne répertorie pas mcrypt, il est manquant.

Important: N'oubliez pas de préciser new/packagelors de l'utilisation composer update! L'omission de cet argument entraînera la mise à jour de toutes les dépendances, ainsi que composer.lock.

Seldaek
la source
3
J'ai reçu le message "Le package [...] répertorié pour la mise à jour n'est pas installé. Ignorer."
Gerry
11
Ça ne marche pas pour moi. On me dit que le "package" x / y "répertorié pour la mise à jour n'est pas installé. Ignorer. "Et puis il va tout mettre à jour. Donc, il n'installe pas le nouveau package que je veux et il met à jour tout le reste, ce qui est exactement le contraire de ce que je veux.
tremby
3
Cela ne fonctionne tout simplement pas. "Vos besoins n'ont pas pu être résolus en un ensemble de packages installables." (et texte sur certains anciens paquets, sans aucun rapport avec ce que je demande) lorsque je demande, mettez à jour un seul paquet.
OZ_
@tremby Fonctionne très bien ici. Vous avez peut-être oublié d'ajouter "new/package" : "*",dans la "require"section composer.json ?
Potherca
@OZ_ Même si une seule dépendance doit être installée, elle doit toujours être résolue en premier pour vous assurer qu'elle n'entre pas en conflit avec vos autres dépendances.
Potherca
30

En fait, la bonne solution est:

composer require vendor/package

Tiré de la documentation CLI pour Composer :

La requirecommande ajoute de nouveaux packages au composer.jsonfichier à partir du répertoire actuel.

php composer.phar require

Après avoir ajouté / modifié 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

Bien qu'il soit vrai que composer updateinstalle les nouveaux packages trouvés dans composer.json, il mettra également à jour le fichier composer.lock et tous les packages installés en fonction de toute logique floue ( >ou *caractères 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 prendre l'habitude, car vous êtes un argument oublié loin d'un projet potentiellement cassé…

Gardez les choses saines et respectez composer require vendor/packagepour ajouter de nouvelles dépendances! 😉

Matthemattics
la source
Mais l'utilisation de composer requiremettre à jour le fichier composer.lock?
Phil
2

Mon cas d'utilisation est plus simple et s'adapte simplement à votre titre mais pas à vos détails.

Autrement dit, je veux installer un nouveau package qui n'est pas encore dans mon composer.jsonsans mettre à jour tous les autres packages.

La solution ici est composer require x/y

tremby
la source
1

Dans mon cas, j'ai eu un repo avec:

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

En attendant, A, B, C avaient des versions plus récentes en ce qui concerne la génération du verrou.

Pour une raison quelconque, j'ai supprimé les "fournisseurs" et je voulais faire un composer installéchec 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 un composer update vendorD/libraryDmais le compositeur a insisté pour mettre à jour plus de choses, donc .lockj'avais trop de changements vu mon outil git.

La solution que j'ai utilisée était:

  1. Supprimez tous les vendorsdir.
  2. Supprimez temporairement l'exigence VendorD/LibraryDdu fichier .json.
  3. courir composer install.
  4. Ensuite, supprimez le fichier .jsonet extrayez-le à nouveau du référentiel (équivalent à ajouter à nouveau le fichier, mais en évitant les modifications potentielles des espaces blancs).
  5. Exécutez ensuite la solution de Seldaek composer update vendorD/libraryD

Il a installé la bibliothèque, mais en plus, gitdiff m'a montré que .lockseules les nouvelles choses étaient ajoutées sans éditer les autres.

(Thnx Seldaek pour le pointeur;))

Xavi Montero
la source
c'est exagéré. supprimez simplement le fichier de verrouillage et exécutez l'installation de composer. ça marche
astroanu
6
Cela reste vrai pour les environnements non professionnels, où vous pouvez facilement reconstruire les dépendances et si quelque chose se casse, vous allez le réparer. Mais si pour vous, les serveurs défaillants vous font perdre 10 000 $ par heure, vous ne doutez pas que le composer.lockne devrait jamais être supprimé et reconstruit avec bonheur. .lockest ... pour le verrouillage !! ; D - sinon le fichier de verrouillage serait inutile et vous ne le commettriez pas ou il n'existerait pas du tout. Si vous exécutez dans une entreprise axée sur la qualité et reconstruisez et validez un verrou avec disons 1.000 dépendances, toutes changeront, et les gens de l'AQ viendront vous tuer hahaha.
Xavi Montero
2
Hé @astroanu juste pour clarifier 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 l'installation. Si vous n'avez pas eu l'occasion de vérifier l'impact de l'introduction d'une dépendance, il existe un risque de résultats inattendus et peut-être de créer une mauvaise expérience pour les utilisateurs.
dkcwd
bien sûr, la suppression du fichier de verrouillage et l'exécution de l'installation / mise à jour ou l'exécution de la mise à jour même sans supprimer le fichier de verrouillage auront un impact sur la stabilité des applications. La mise à jour de Composer doit être exécutée uniquement dans un environnement de développement. Lors de la production, utilisez toujours installer le compositeur car la version de production est testée par rapport à ce qui est enregistré dans le fichier de verrouillage.
astroanu