在作曲家安装期间运行Gulp任务

时间:2015-02-27 10:11:02

标签: php laravel heroku composer-php gulp

我正在使用Composer将PHP应用程序部署到Heroku。目前我正在使用Gulp压缩CSS / JS并将其提交到Git存储库。我想知道使用Composer' post-install-cmd运行Gulp任务是否更有意义。最佳做法是什么?

4 个答案:

答案 0 :(得分:4)

你使用所谓的" 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 compile上运行,您也可以使用composer install步骤:https://devcenter.heroku.com/articles/php-support#custom-compile-step

答案 1 :(得分:3)

将Gulp视为一个通用的任务运行者,而不是使用Composer的post-install-cmd(或类似的)来强制执行其他任务。 PHP包管理器不应该负责获取或压缩前端资产,这不是它的工作。 Gulp不仅适用于与前端相关的任务。

对我来说,使用gulp-composer最有意义。

答案 2 :(得分:2)

gulp为命令任务提供了灵活的工具,所以最好的做法是使用gulp进行更新或安装作曲家依赖项? 看一下这个gulp-composer

示例:

composer = require('gulp-composer');

gulp.task('composer', function () {
    composer({ cwd: './php-stuff', bin: 'composer' });
});

答案 3 :(得分:0)

我建议在某个脚本处理程序中使用Symfony的Process Component,然后按照你的说法将其作为post-install-cmd运行。

脚本/作曲家/ ScriptHandler.php

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

}

composer.json

"autoload": {
    "classmap": [
        "scripts/composer/ScriptHandler.php"
    ]
},
"scripts": {
    "post-update-cmd": [
        "DrupalProject\\composer\\ScriptHandler::gulpBuild"
    ]
},

检查Composer template for Drupal projects以获得更多灵感。 (例如,动态获取主题的路径,以使该命令在每个环境中成功运行。)