Как мне обработать несколько файлов в качестве шаблонов с помощью 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, путь назначения должен быть папкой.