php laravel npm composer-php bower

php - Usar Composer para instalar paquetes npm y bower en producción(es decir, no devDependencies)



laravel composer-php (5)

Como uso npm, bower y gulp para construir mis activos, no necesito ninguno de ellos en producción, así que aquí está el composer.json que uso:

"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" ]

... Pero me parece extraño usar un comando tan complicado para detectar el entorno de desarrollo, o no ...

En mi archivo composer.json tengo lo siguiente en la sección de scripts:

"post-install-cmd": [ "php artisan clear-compiled", "php artisan optimize", "npm install", "bower install" ]

Al ejecutar ''composer install'' esto hará que npm y bower instalen todas sus dependencias, que por defecto incluyen devDependencies. Cuando se trata de hacer un despliegue de producción (por ejemplo, ''composer install --no-dev'', quiero iniciar ''npm install --production'' y ''bower install --production'')

Por lo que puedo decir, no parece haber una manera de cambiar la lista especificada para ''post-install-command'' dependiendo de las banderas pasadas, o una forma de establecer variables que luego pueden pasarse a los comandos en la publicación -install-cmd.

¿Me estoy perdiendo de algo? No parece posible usar el compositor para hacer una instalación tanto de desarrollo como de producción utilizando solo la configuración. ¿Realmente tengo que usar la composer install --no-scripts en producción y luego ejecutar manualmente los cuatro comandos? Eso parece un poco torpe.


El ejemplo de bloque completo 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'');/"" ] } }


Es un poco complicado pero puedes obtener el PID del comando principal con $PPID en bash. De eso puedes obtener los argumentos de la línea de comando.

"post-install-cmd": [ "ps -ocommand= -p $PPID | grep no-dev > /dev/null && echo called with no-dev || echo called without no-dev", ],

Si run-if-env-is-production.sh "bower install --production" que hacer esto, lo pondría en un script bash y lo ejecutaría así: run-if-env-is-production.sh "bower install --production"

Sin embargo, recomendaría la solución de @ kwoodfriend sobre esto, ya que es menos portátil ya que requiere bash, ps y grep.


Esto funcionaría;

"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" ]

es decir, debería ejecutar ''update'' en su entorno de desarrollo y solo ejecutar ''install'' en su entorno de producción.


Siempre puede utilizar PHP para hacer la detección del entorno, luego instale otras dependencias del mismo script. Esto no es agradable y limpio, como incluir npm y bower en post-install-cmd, pero te dará lo que estás buscando.

"post-install-cmd": [ "php artisan clear-compiled", "php artisan optimize", "php path/to/installer.php" ]

Ejemplo 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}");

Puede hacer que este ejemplo sea más robusto e incluso crear un comando Artisan para él.