web-dev-qa-db-fra.com

Utilisation de Composer pour installer les packages npm et bower en production (c'est-à-dire sans devDependencies)

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.

12
Dan B

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.

11
kfriend

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.

2
dave1010

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.

1
Laurence

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 ...

1
loranger

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');\""
        ]
    }
}

0
pliashkou