web-dev-qa-db-fra.com

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

J'ai un projet avec quelques dépendances et j'aimerais en installer un autre, mais j'aimerais garder les autres comme ils sont. J'ai donc édité le 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 mcrypt installé, donc je ne sais pas pourquoi il s'en plaint.

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

My 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"
}
178
duality_

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

  1. A l'aide de la commande require , exécutez simplement:

    composer require new/package
    

    Composer devinera 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 lançant:

    composer require new/package ~2.5
    

- OU -

  1. A l'aide de la commande update , ajoutez le nouveau package manuellement à composer.json, puis exécutez la commande suivante:

    composer update new/package
    

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

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

Important: N'oubliez pas de spécifier new/package lors de l'utilisation de composer update! Si vous omettez cet argument, toutes les dépendances, ainsi que composer.lock, seront mis à jour.

275
Seldaek

En fait, la solution correcte est:

composer require vendor/package

Extrait de la documentation CLI de Composer :

La commande require ajoute de nouveaux packages au fichier composer.json à partir du répertoire en cours.

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

S'il est vrai que composer update installe les nouveaux packages trouvés dans composer.json, , il mettra également à jour le fichier composer.lock et tous les packages installés selon toute logique floue (> ou * caractères après les deux points) trouvé dans composer.json! Ceci 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é d'un projet potentiellement brisé…

Gardez les choses saines et restez fidèles à composer require vendor/package pour ajouter de nouvelles dépendances! ????

29
Matthematics

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

C'est-à-dire que je souhaite installer un nouveau package qui ne figure pas encore dans mon composer.json sans mettre à jour tous les autres packages.

La solution ici est composer require x/y

2
tremby

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

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

Dans l'intervalle, A, B, C avaient des versions plus récentes en ce qui concerne le 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 j'ai é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 un composer update vendorD/libraryD mais composer a insisté pour mettre à jour plus de choses, donc .lock avait trop changé vu mon outil git.

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

  1. Supprimer tout le répertoire vendors.
  2. Supprimez temporairement l'exigence VendorD/LibraryD du .json.
  3. exécutez composer install.
  4. Supprimez ensuite le fichier .json et récupérez-le à nouveau dans le référentiel (ce qui revient à ré-ajouter le fichier, mais en évitant d’éventuelles modifications d’espacement).
  5. Ensuite, lancez la solution de Seldaek composer update vendorD/libraryD

Il a effectivement installé la bibliothèque, mais en plus, git diff m'a montré que, dans le .lock, seules les nouveautés ont été ajoutées sans modifier les autres.

(Thnx Seldaek pour le pointeur;))

0
Xavi Montero