Переименовать файл на основе регулярного выражения в Gulp

Скажем, у меня есть структура каталогов LESS CSS, подобная этой:

less/
    core/
        _main.less
        header.less
        body.less
        footer.less
    contact/
        _main.less
        form.less
        details.less

Я хочу написать задачу Gulp, которая будет искать файлы _main.less в каждом подкаталоге каталога less/, передавать это в gulp-less и записывать вывод в каталог css/ следующим образом:

css/
    core.css
    contact.css

Поскольку _main.less включает в себя другие файлы в своем каталоге, нужно будет анализировать только файлы _main.less, но я хочу, чтобы выходной файл имел имя каталога, в котором он находится.

Пока у меня это:

gulp.src('less/*/*/_main.less')
    .pipe(less())
    .pipe(gulp.dest('css'));

Но это создаст такую ​​структуру каталогов:

css/
    core/
        _main.css
    contact/
        _main.css

Но это не то, чего я хочу. Я думал использовать регулярное выражение для соответствия имени каталога, вернуть его в matches var и соответствующим образом переименовать файл. Что-то вроде этого:

gulp.src(/less\/[^\/]+\/([^\/]+)\/_main.less/)
    .pipe(less())
    .pipe(rename(function(context) {
        context.src.matches[1] + '.css'
     }))
    .pipe(gulp.dest('css'));

Этот код является просто примером. Я не могу понять, как сделать что-то подобное, или если это вообще возможно.

Это возможно? Если да, то как?


person gitaarik    schedule 28.08.2014    source источник


Ответы (1)


Похоже, у вас это уже есть, но, возможно, вы не видели плагин gulp-rename?

Я даже не думаю, что вам нужно будет использовать RegExp, что-то вроде этого должно работать:

var rename = require('gulp-rename'),
    path = require('path'); // node Path

//...

gulp.src('less/**/_main.less')
    .pipe(less())
    .pipe(rename(function(filepath) {
        // replace file name to that of the parent directory
        filepath.basename = path.basename(filepath.dirname);
        // remove parent directory from relative path
        filepath.dirname = path.dirname(filepath.dirname);
        // leave extension as-is
     }))
    .pipe(gulp.dest('css'));
person OverZealous    schedule 28.08.2014