在composer安装期间运行Gulp任务


Run Gulp tasks during composer install

我正在使用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 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"
    ]
},

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