Dans mon fichier composer.json, j'ai les éléments suivants dans la section des scripts:
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"npm install",
"bower install"
]
Lors de l'exécution de 'composer install', npm et bower seront installés avec toutes leurs dépendances, qui incluent par défaut devDependencies. Lorsqu'il s'agit de lancer une production (par exemple, 'composer install --no-dev', je souhaite lancer 'npm install --production' et 'bower install --production')
Autant que je sache, il ne semble pas y avoir de moyen de changer la liste spécifiée pour 'post-install-command' en fonction des drapeaux passés, ni de définir des variables pouvant ensuite être transmises à des commandes post -install-cmd.
Est-ce que je manque quelque chose? Il ne semble pas possible d'utiliser composer pour faire à la fois une installation de développement et de production en utilisant simplement la configuration. Dois-je vraiment utiliser composer install --no-scripts
en production, puis exécuter manuellement les quatre commandes moi-même? Cela semble un peu maladroit.
Vous pouvez toujours utiliser PHP pour détecter votre environnement, puis installer d'autres dépendances à partir du même script. Ce n'est pas beau et propre, comme inclure npm et bower dans post-install-cmd, mais vous obtiendrez ce que vous cherchez.
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"php path/to/installer.php"
]
Exemple installer.php:
// Logic to determine the environment. This could be determined many ways, and depends on how your
// application's environment is determined. If you're making use of Laravel's environment
// capabilities, you could do the following:
$env = trim(exec('php artisan env'));
// Clean up response to get the value we actually want
$env = substr($env, strrpos($env, ' ') + 1);
$envFlag = ($env === 'production')
? '--production'
: '';
// Install npm
passthru("npm install {$envFlag}");
// Install bower
passthru("bower install {$envFlag}");
Vous pouvez rendre cet exemple plus robuste et même créer une commande Artisan pour celui-ci.
C'est un peu de piratage mais vous pouvez obtenir le PID de la commande parent avec $PPID
dans bash. À partir de là, vous pouvez obtenir les arguments de la ligne de commande.
"post-install-cmd": [
"ps -ocommand= -p $PPID | grep no-dev > /dev/null && echo called with no-dev || echo called without no-dev",
],
Si vous deviez le faire, je le mettrais dans un script bash et le lirais comme suit: run-if-env-is-production.sh "bower install --production"
Je recommanderais toutefois la solution de @ kwoodfriend, car elle est moins portable car elle nécessite bash, ps & grep.
Cela fonctionnerait
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"npm install",
"bower install"
],
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"npm install --production",
"bower install --production"
]
c’est-à-dire que vous devriez exécuter «update» sur votre environnement de développement et n’exécuter que «install» sur votre environnement de production.
Parce que j'utilise npm, bower et gulp pour créer mes actifs, je n'ai besoin d'aucun d'entre eux pour la production. Voici donc le composer.json que j'utilise:
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent install --global bower",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent install"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || npm --loglevel silent update",
"(ps -ocommand= -p $PPID | grep -q no-dev && true) || bower --silent update"
]
... Mais il me semble étrange d'utiliser une commande aussi délicate pour détecter l'environnement de développement, ou non ...
L'exemple de bloc entier de Composer.org
{
"scripts": {
"post-update-cmd": "MyVendor\\MyClass::postUpdate",
"post-package-install": [
"MyVendor\\MyClass::postPackageInstall"
],
"post-install-cmd": [
"MyVendor\\MyClass::warmCache",
"phpunit -c app/"
],
"post-create-project-cmd" : [
"php -r \"copy('config/local-example.php', 'config/local.php');\""
]
}
}