Как обрабатывать несколько файлов в виде шаблонов с помощью генератора yoman?

Я работаю над настраиваемым генератором, который я изначально написал с помощью grunt-init. Одно замечание, которое я замечаю, это grunt-init, автоматически обрабатывает все файлы в корне как шаблоны, но с генератором yoman вы должны сделать это с помощью .template(). Я знаю, как обрабатывать любой отдельный файл с помощью .template(), но можно ли обрабатывать весь каталог?

Ответ 1

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

this.directory('scripts', 'scripts');// script is folder name

Ответ 2

Глядя на генераторный код Yeoman, похоже, нет встроенного способа сделать это. То, как я решил это, было скопировать часть кода из встроенного кода генератора и изменить его для моих нужд. Я определяю, является ли файл шаблоном на основе префикса _, поскольку я хочу переименовать файлы, чтобы исключить этот префикс, но вы можете просто обрабатывать каждый файл как шаблон, и он будет работать нормально. Это скопирует все файлы в каталоге, поэтому я также хотел исключить файлы .DS_STORE, которые вы по умолчанию находите в OSX, но поскольку это конкретный случай, я не включал это здесь.

require('path');

MyGenerator.prototype._processDirectory = function(source, destination) {
    var root = this.isPathAbsolute(source) ? source : path.join(this.sourceRoot(), source);
    var files = this.expandFiles('**', { dot: true, cwd: root });

    for (var i = 0; i < files.length; i++) {
        var f = files[i];
        var src = path.join(root, f);
        if(path.basename(f).indexOf('_') == 0){
            var dest = path.join(destination, path.dirname(f), path.basename(f).replace(/^_/, ''));
            this.template(src, dest);
        }
        else{
            var dest = path.join(destination, f);
            this.copy(src, dest);
        }
    }
};

Ответ 3

Yeoman использует mem-fs-editor, который поддерживает шаблоны glob. Однако документация не очень понятна, и вы можете пропустить этот момент. Вот документация copyTpl, в которой говорится, что он принимает те же параметры, что и copy. Так как копия имеет suppport для шаблонов glob, copyTpl тоже.

В любой момент вашего генератора yeoman вы можете сделать:

    const from = 'myFolder/**.js'
    const to = 'project/'
    this
        .fs
        .copyTpl(
             this.templatePath(from), 
             this.destinationPath(to), 
             this.props, {interpolate: /<%=([\s\S]+?)%>/g}
        );
},

Не то чтобы, если вы используете шаблон glob, путь назначения должен быть папкой.