我正在使用Composer将一个PHP应用程序部署到Heroku。目前我正在使用Gulp压缩CSS/JS并将其提交到Git存储库。我想知道使用Composer的post-install-cmd
运行Gulp任务是否更有意义。最好的做法是什么?
您使用所谓的"multi-buildpack"在部署时执行Node.js(安装Gulp)和PHP构建。
下面是我不久前创建的一个示例,它使用Bower在Composer post-install-cmd
中安装Bootstrap,但原理是一样的:
http://heroku-multipack-nodejs-php-ex.herokuapp.com
README
解释该过程的来源:https://github.com/dzuelke/heroku-multipack-nodejs-php-example
如果您希望Gulp安装不在每个composer install
上运行,也可以使用composer compile
步骤:https://devcenter.heroku.com/articles/php-support#custom-编译步骤
将Gulp视为一个通用的任务运行器,而不是使用Composer的post-install-cmd
(或类似的)来附加任务。PHP包管理器不应该负责获取或压缩前端资产,这不是它的工作。Gulp不仅仅用于与前端相关的任务。
对我来说,使用gullowcomposer是最有意义的。
gulp为命令任务提供了灵活的工具,因此,最好的做法可能是使用gulp来更新或安装composer依赖项?看看这个狼吞虎咽的作曲家包
示例:
composer = require('gulp-composer');
gulp.task('composer', function () {
composer({ cwd: './php-stuff', bin: 'composer' });
});
我建议在一些脚本处理程序中使用Symfony的Process Component,然后像您所说的那样作为post-install-cmd
运行。
scripts/composer/ScriptHandler.php
use ComposerScriptEvent;
use SymfonyComponentProcessProcess;
use SymfonyComponentProcessExceptionProcessFailedException;
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");
}
}
}
composer.json
"autoload": {
"classmap": [
"scripts/composer/ScriptHandler.php"
]
},
"scripts": {
"post-update-cmd": [
"DrupalProject\composer\ScriptHandler::gulpBuild"
]
},
查看Drupal项目的Composer模板以获得更多灵感。(例如,动态获取主题的路径,使该命令在每个环境中成功运行。)