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"
}
Pour installer un nouveau package et uniquement cela, vous avez deux options:
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 -
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.
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 fichiercomposer.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! ????
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
Dans mon cas, j'ai eu un repo avec:
.json
.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:
vendors
.VendorD/LibraryD
du .json
.composer install
..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).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;))