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

Скажем, у меня есть Меньшая структура каталогов CSS, как это:

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

Я хочу написать задачу Gulp, которая будет искать _main.less файлы в каждом подкаталоге less/ DIR, передать это без глотка и записать вывод в 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'));

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

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

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'));
Другие вопросы по тегам