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