Я развертываю приложение PHP на Heroku с помощью Composer. В настоящее время я использую Gulp для сжатия CSS / JS и фиксации его в репозитории Git. Мне было интересно, имеет ли смысл запускать задачи Gulp с помощью Composer post-install-cmd
, Какова лучшая практика для этого?
Вы используете так называемый «multi-buildpack» для выполнения сборки Node.js (для установки Gulp) и PHP при развертывании.
Вот пример, который я недавно построил, который использует Bower для установки Bootstrap в Composer post-install-cmd
, но принцип будет таким же:
http://heroku-multipack-nodejs-php-ex.herokuapp.com
Источники с README
это объясняет процесс: https://github.com/dzuelke/heroku-multipack-nodejs-php-example
Вы также можете использовать composer compile
шаг, если вы предпочитаете, чтобы установка Gulp не запускалась на каждом composer install
: https://devcenter.heroku.com/articles/php-support#custom-compile-step
Думайте о Gulp как об универсальном исполнителе задач, а не об использовании Composer post-install-cmd
(или подобный), чтобы сбежать на дополнительные задачи. Менеджер пакетов PHP не должен отвечать за выборку или сжатие внешних ресурсов, это не его работа. Gulp не только для задач, связанных с интерфейсом.
Для меня, используя Глоток-композитор имеет смысл.
gulp предоставляет гибкие инструменты для командных задач, так что, возможно, лучше всего использовать gulp для обновления или установки зависимостей компоновщика?
Взгляните на это Глоток-композитор пакет
Пример:
composer = require('gulp-composer');
gulp.task('composer', function () {
composer({ cwd: './php-stuff', bin: 'composer' });
});
Я бы порекомендовал использовать Symfony’s Компонент процесса для этого внутри некоторого обработчика сценария, а затем запустить его как post-install-cmd
как вы сказали.
use Composer\Script\Event;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
class ScriptHandler {
public static function gulpBuild(Event $event) {
$process = new Process('cd /path/to/my/theme && gulp build');
$process->run();
// executes after the command finishes
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
$event->getIO()->write($process->getOutput());
}
else {
$event->getIO()->write("Recompiled and compressed CSS/JS");
}
}
}
"autoload": {
"classmap": [
"scripts/composer/ScriptHandler.php"]
},
"scripts": {
"post-update-cmd": [
"DrupalProject\\composer\\ScriptHandler::gulpBuild"]
},
Проверьте Шаблон Composer для проектов Drupal для большего вдохновения. (Например, динамическое получение пути к вашей теме для успешного выполнения этой команды в любой среде.)