Как мне обработать несколько файлов в качестве шаблонов с помощью Yeoman Generator?

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

3 ответа

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

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

Глядя на код генератора 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);
        }
    }
};

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

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

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

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

Другие вопросы по тегам