Gulp-webapp работает с BrowserSync и PHP

Моя главная цель здесь – адаптировать рабочий процесс Yeoman's gulp-webapp для запуска PHP.

В частности, я хочу иметь возможность использовать gulp-php-connect с несколькими базовыми каталогами (для скомпилированного CSS из Sass) и маршрутов (для зависимостей Bower), если это возможно.

Я могу запустить PHP с помощью Gulp, используя плагин gulp-connect-php , например:

 gulp.task('connect-php', function() { connectPHP.server({ hostname: '0.0.0.0', bin: '/Applications/MAMP/bin/php/php5.5.3/bin/php', ini: '/Applications/MAMP/bin/php/php5.5.3/conf/php.ini', port: 8000, base: 'dev' }); }); 

Тем не менее, я хотел бы воспользоваться превосходной, но вполне запутанной архитектурой рабочего процесса gulp-webapp, которая основана на BrowserSync, компиляторе Sass (компилируется в файл .css в .tmp-папку для разработки), auto-prefixer и использует кучу других полезных плагинов.

Вот его часть, которую я хотел бы адаптировать для использования gulp-connect-php или любого другого PHP:

 gulp.task('serve', ['styles'],function () { browserSync({ notify: false, port: 9000, server: { baseDir: ['.tmp', 'app'], routes: { '/bower_components': 'bower_components' } } }); // watch for changes gulp.watch([ 'app/*.html', '.tmp/styles/**/*.css', 'app/scripts/**/*.js', 'app/images/**/*' ]).on('change', reload); gulp.watch('app/styles/**/*.scss', ['styles', reload]); gulp.watch('bower.json', ['wiredep', 'fonts', reload]); }); 

BrowserSync имеет параметр прокси, который позволяет мне запускать его с помощью сервера gulp-connect-php , что довольно удивительно. Но мне нужно gulp-connect-php использовать несколько базовых каталогов и маршрутов, например BrowserSync .

До сих пор я придумал это:

 gulp.task('serve-php', ['styles','connect-php'],function () { browserSync({ proxy: "localhost:8000" }); // watch for changes gulp.watch([ 'app/*.php', 'app/styles/**/*.css', 'app/scripts/**/*.js', 'app/images/**/*' ]).on('change', reload); gulp.watch('app/styles/**/*.scss', ['styles, reload]); gulp.watch('bower.json', ['wiredep', 'fonts', reload]); }); 

Чтобы временно исправить проблему с несколькими базовыми каталогами , я изменил задачу styles чтобы сохранить скомпилированное .css в /app вместо .tmp/ . Я предпочел бы иметь его в папке temp, хотя, потому что мне не нужен этот скомпилированный файл .css, висящий там с моими файлами Sass.

Что касается маршрутов , я пытаюсь сообщить плагин wiredep чтобы изменить путь, скажем, от bower_components/jquery/dist/jquery.js к ../bower_components/jquery/dist/jquery.js , без каких-либо успехов.

Все, что я мог сделать, это вручную переименовать пути в index.php, и он все равно не работает. При запуске gulp serve я получаю:

/bower_components/jquery/dist/modernizr.js - No such file or directory

… хотя я изменил путь в index.html на ../bower_components/jquery/dist/jquery.js .

Я считаю, что это не работает, потому что сервер gulp-connect-php не видит, что находится за пределами базовой папки.

Я пробую разные вещи, и хотя я был довольно расплывчатым в названии этого потока, я считаю, что самым чистым решением будет запуск нескольких базовых каталогов и маршрутов с помощью gulp-connect-php , но я не знаю, возможное.

    Я потратил некоторое время, пытаясь работать с этим, но теперь у меня есть рабочее решение. То, как я решил, это использовать BrowserSync в качестве сервера и добавил промежуточное ПО, которое запрашивает прокси, если они не соответствуют шаблону …

    Установите пакет http-proxy …

     $ npm install --save-dev http-proxy 

    Добавьте прокси-пакет в начало gulpfile.js

     var httpProxy = require('http-proxy'); 

    Добавьте отдельный php-сервер и прокси-сервер перед BrowserSync …

     gulp.task('php-serve', ['styles', 'fonts'], function () { connect.server({ port: 9001, base: 'app', open: false }); var proxy = httpProxy.createProxyServer({}); // ... 

    Затем добавьте промежуточное программное обеспечение для сервера, чтобы проверить, требуется ли проксирование запроса …

      // ... server: { baseDir : ['.tmp', 'app'], routes : { '/bower_components': 'bower_components' }, // THIS IS THE ADDED MIDDLEWARE middleware: function (req, res, next) { var url = req.url; if (!url.match(/^\/(styles|fonts|bower_components)\//)) { proxy.web(req, res, { target: 'http://127.0.0.1:9001' }); } else { next(); } } } // ... 

    И вот полные задачи для полноты …

     gulp.task('php-serve', ['styles', 'fonts'], function () { connect.server({ port: 9001, base: 'app', open: false }); var proxy = httpProxy.createProxyServer({}); browserSync({ notify: false, port : 9000, server: { baseDir : ['.tmp', 'app'], routes : { '/bower_components': 'bower_components' }, middleware: function (req, res, next) { var url = req.url; if (!url.match(/^\/(styles|fonts|bower_components)\//)) { proxy.web(req, res, { target: 'http://127.0.0.1:9001' }); } else { next(); } } } }); // watch for changes gulp.watch([ 'app/*.html', 'app/*.php', 'app/scripts/**/*.js', 'app/images/**/*', '.tmp/fonts/**/*' ]).on('change', reload); gulp.watch('app/styles/**/*.scss', ['styles']); gulp.watch('app/fonts/**/*', ['fonts']); gulp.watch('bower.json', ['wiredep', 'fonts']); }); 

    Надеюсь, это сэкономит вам все время, которое я потратил на это! : О)

    FWIW, у меня есть довольно простое и справедливое решение для этого, поместив скомпилированный файл .css в папку app / root и moving / bower_dependencies внутри папки app /.

    Для Sass мне нужно только изменить путь в placeholder к <!-- build:css styles/main.css --> и изменить dest в задаче styles .

    Для bower_components я только что отредактировал bower_components в .bowerrc:

     { "directory": "app/bower_components" } 

    и добавил это в wiredep поток в gulpfile.js:

      fileTypes: { scss: { replace: { scss: '@import "app/{{filePath}}";' } } },