Использование Composer для установки пакетов npm и bower при производстве (т.е. DevDependencies)
В моем файле composer.json у меня есть следующее в разделе сценариев:
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"npm install",
"bower install"
]
При запуске 'composer install' это заставит npm и bower устанавливать все свои зависимости, которые по умолчанию включают devDependencies. Когда дело доходит до выполнения производственного цикла (например, "установка композитора --no-dev", я хочу запустить "npm install --production" и "bower install --production" )
Насколько я могу судить, не существует способа изменить список, указанный для "post-install-command" в зависимости от переданных флагов, или способ установки переменных, которые затем могут быть переданы команд в post-install-cmd.
Я что-то упустил? Невозможно использовать композитор для создания как dev, так и производственной установки, используя только конфигурацию. Действительно ли я должен использовать composer install --no-scripts
для производства, а затем вручную запускать все четыре команды самостоятельно? Это кажется немного неуклюжим.
Ответы
Ответ 1
Вы всегда можете использовать PHP для обнаружения среды для вас, а затем установить другие зависимости из того же script. Это не приятно и чисто, как включение npm и bower в post-install-cmd, но оно даст вам то, что вы ищете.
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize",
"php path/to/installer.php"
]
Пример installer.php:
// Logic to determine the environment. This could be determined many ways, and depends on how your
// application environment is determined. If you're making use of Laravel 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}");
Вы можете сделать этот пример более надежным и даже создать для него команду Artisan.
Ответ 2
Немного взломать, но вы можете получить родительскую команду PID с $PPID
в bash. Из этого вы можете получить аргументы командной строки.
"post-install-cmd": [
"ps -ocommand= -p $PPID | grep no-dev > /dev/null && echo called with no-dev || echo called without no-dev",
],
Если бы вы сделали это, я бы поместил его в bash script и выполнил его следующим образом: run-if-env-is-production.sh "bower install --production"
Я бы порекомендовал решение @kwoodfriend по этому поводу, хотя это менее портативно, так как оно требует bash, ps и grep.
Ответ 3
Это сработает;
"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"
]
то есть. вы должны запускать "обновление" в своей среде разработки и только когда-либо запускать "install" в своей производственной среде.
Ответ 4
Поскольку я использую npm, bower и gulp для создания своих активов, мне не нужны какие-либо из них при производстве, поэтому вот композитор .json я использую:
"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"
]
... Но мне кажется странным использовать такую сложную команду, чтобы обнаружить среду dev, или нет...
Ответ 5
Весь пример блока из 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');\""
]
}
}