【问题标题】:Run Gulp tasks during composer install在作曲家安装期间运行 Gulp 任务
【发布时间】:2015-04-30 00:19:18
【问题描述】:

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

【问题讨论】:

    标签: php laravel heroku composer-php gulp


    【解决方案1】:

    您使用所谓的“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-compile-step

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        gulp 为命令任务提供了灵活的工具,所以也许最好的做法是使用 gulp 来更新或安装 composer 依赖项? 看看这个gulp-composer

        例子:

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

        【讨论】:

          【解决方案4】:

          我建议在一些脚本处理程序中使用 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"
              ]
          },
          

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

          【讨论】:

            猜你喜欢
            • 2015-10-23
            • 2016-04-29
            • 2014-10-22
            • 1970-01-01
            • 2016-09-18
            • 2018-10-21
            • 1970-01-01
            • 2021-01-24
            • 2016-08-07
            相关资源
            最近更新 更多