Composer ( 7 articles - Voir la liste )

Astuce Autoriser Composer à utiliser toute la mémoire dont il a besoin

Pour lancer Composer sans la limite de mémoire imposée par la configuration de PHP, on peut utiliser cette commande :

php -d memory_limit=-1 $(which composer) update

Explications :

  • On lance Composer via PHP, ce qui permet de surcharger la valeur de memory_limit (-1 pour infinie)
  • which est une commande système qui affiche le chemin complet vers un exécutable (ici composer)
  • On ajoute ensuite les arguments classiques à passer à Composer

Astuce Installer un patch via composer

Lorsqu'il y a un bug dans l'une de vos dépendances gérées par composer, il faut éviter de le corriger en modifiant directement la lib. Sinon, la correction sera automatiquement écrasée lors de la prochaine installation/mise à jour de la lib.

Si un patch est proposé sur le site du fournisseur de la lib, mais pas encore intégré dans leur dernière release, vous pouvez demander à Composer de l'appliquer lors de l'installation des dépendances (i.e. composer install).

La lib composer-patches pour Composer, permet cette fonctionnalité. Pour l'utiliser, ajoutez-la dans votre composer.json. Par exemple :

{
  // ...
  "require": {
    // ...
    "cweagans/composer-patches": "~1.0",
    "drupal/core": "~8.4.0"
  },
  // ...
  "extra": {
    // ...
    "patches": {
      "drupal/core": {
        "Quickedit missing css classes": "https://www.drupal.org/files/issues/2551373-35.patch"
      }
    }
  }
}

Explications :

  • Le projet requiert la lib composer-patches comme dépendance.
  • On a ausssi intégré drupal/core, que l'ont veut patcher.
  • Après avoir téléchargé et installé cette dépendance, Composer va appliquer le patch présent à l'URL https://www.drupal.org/files/issues/2551373-35.patch.

Remarque :

On peut appliquer plusieurs patchs successifs pour une ou plusieurs lib. Ex :

{
  // ...
  "require": {
    // ...
    "cweagans/composer-patches": "~1.0",
    "vendor1/lib1": "~1.0",
    "vendor1/lib2": "~1.0",
    "vendor2/lib3": "~1.0"
  },
  // ...
  "extra": {
    // ...
    "patches": {
      "vendor1/lib1": {
        "Patch 1": "https://www.vendor1.org/lib1/patch1.patch",
        "Patch 2": "https://www.vendor1.org/lib1/patch2.patch"
      },
      "vendor2/lib3": {
        "Patch 3": "https://www.vendor2.org/lib3/patch.patch"
      }
    }
  }
}

Astuce Limiter la version à mettre à jour avec Composer

Lorsque vous mettez à jour vos dépendances avec Composer, vous ne souhaitez pas avoir la dernière version disponible.

Par exemple, si j'ai un site Drupal en v8.2.7 et qu'une mise à jour de sécurité sort, je peux préférer passer en v8.2.8 plutôt qu'en 8.3.1.

Dans ce cas on peut préciser ça dans le fichier composer.json :

{
...
  "require": {
    "drupal/core": "~8.2.0",
    ...
  },
...
}

Explications :

  • ~8.2.0 signifie >= 8.2.0 & < 8.3.0
  • ~8.2 signifie >= 8.2 & < 9
  • Il existe aussi le signe ^, moins restrictif : ^8.2.1 signifie >=8.2.1 & < 9

Erreur Problème de mémoire avec composer

Si vous utilisez Composer dans une VM, vous pouvez avoir une erreur de mémoire dûe à un problème de swap :

Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

[ErrorException]
proc_open(): fork failed - Cannot allocate memory

Plusieurs solutions sont décrites dans ce ticket sur Stackoverflow.

Celle (temporaire) qui marche particulièrement bien est la suivante. Il suffit de lancer les commandes :

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

Astuce Mettre à jour les dépendances avec Composer

Pour mettre à jour les dépendances d'un projet Symfony (ou pas), vous pouvez utiliser Composer.

À l'instar d'apt ou yum pour des distributions Linux, cet outil va mettre à jour votre application par une simple ligne de commande.

Pour mettre à jour Composer, utilisez :

composer self-update

Pour mettre à jour les dépendances du projet, utilisez :

composer update

Pour ne mettre à jour qu'une seule dépendance, ajoutez-la à la commande :

composer update ma/dépendance

Remarques :

  • Pour modifier les dépendances, éditez le fichier composer.json.
  • Il ne faut pas confondre :
    • composer update : va chercher la dernière version disponible sur le dépôt et l'installer,
    • composer install : va chercher la version installée lors du dernier composer update sur le dépôt et l'installe. Ce numéro de version est stocké dans le fichier composer.lock. Cela permet d'avoir une version identique entre chaque environnement.

Erreur Impossible de générer l'autoloads pour les dépendances de Symfony avec Composer

Sous Windows, lorsque vous essayez d'installer les dépendances de Symfony avec Composer, vous pouvez obtenir l'erreur suivante :

Loading composer repositories with package information
Updating dependencies
Nothing to install or update
Generating autoload files

Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap h
andling the post-update-cmd event terminated with an exception

  [RuntimeException]
  An error occurred when generating the bootstrap file.

Exécutez alors les commandes suivantes :

composer update --no-scripts
php vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php

Erreur Impossible de télécharger les dépendances avec Composer et Git

Sous Windows, lorsque vous essayer d'installer des dépendances avec Composer (le gestionnaire de dépendances de PHP), vous pouvez obtenir l'erreur suivante :

Loading composer repositories with package information
Installing dependencies
  - Installing twig/extensions (dev-master 5c2d515)
    Cloning 5c2d515d4624bdd588226d688173cf0399a4d8cf

  [RuntimeException]
  Failed to execute git checkout "5c2d515d4624bdd588226d688173cf0399a4d8cf" &
  & git reset --hard "5c2d515d4624bdd588226d688173cf0399a4d8cf"

  fatal: Not a git repository (or any of the parent directories): .git

Remplacez alors la commande :

composer install

par :

composer update --prefer-dist