Могут ли генераторы Yeoman обновлять существующие файлы?
Поэтому, чтобы дать вам какой-то контекст, я пытаюсь создать генератор, который будет создавать некоторые файлы (на основе ввода пользователя, конечно), а также обновлять некоторые существующие файлы в проекте (например, добавлять новый маршрут).
Создание файлов с помощью this.template
не проблема... вопрос в том, есть ли способ сделать это с Йоменом без необходимости читать файл с помощью Node и делать какую-то причудливую находку и заменять?
Ответы
Ответ 1
Хорошо, поэтому я нашел ответ на свой вопрос.
Адди Османи показал мне, где искать эту тему на twitter, а затем я нашел эту ссылку, который показывает, что мне нужно.
Суть его сводится к двум функциям: readFileAsString
и write
. Используется следующее:
var path = "/path/to/file.html",
file = this.readFileAsString(path);
/* make modifications to the file string here */
this.write(path, file);
Изменить: я также писал об этом в своем блоге.
РЕДАКТИРОВАТЬ 1
Как упоминалось в комментариях Toilal:
Метод write
больше не существует и должен быть заменен на writeFileFromString
(аргументы также отменены) - Toilal
EDIT 2
И затем, как упоминалось в комментариях ivoba:
this.writeFileFromString
и this.readFileAsString
устарели, github.com/yeoman/html-wiring должен быть использован к настоящему времени, все меняется:) - ivoba
Ответ 2
Yeoman также предоставляет более элегантный способ работы fs, используя mem-fs-editor.
Вы можете использовать this.fs.copy
, передавая функцию процесса в качестве опции для внесения любых изменений в содержимое:
this.fs.copy(path, newPath, {
process: function(content) {
/* Any modification goes here. Note that contents is a Buffer object */
var regEx = new RegExp('old string', 'g');
var newContent = content.toString().replace(regEx, 'new string');
return newContent;
}
});
Таким образом вы также можете воспользоваться функциями mem-fs-editor
.
Ответ 3
В сочетании с превосходным ответом @sepans вместо регулярных выражений можно использовать какой-то парсер.
Из йоменской документации:
Совет: обновите содержимое существующего файла
Обновление ранее существующего файла не всегда простая задача. Самый надежный способ сделать это - проанализировать файл AST и отредактировать его. Основная проблема этого решения заключается в том, что редактирование AST может быть многословным и немного сложным для понимания.
Некоторые популярные парсеры AST:
- Cheerio для разбора HTML.
- Esprima для синтаксического анализа JavaScript - вас может заинтересовать AST-Query, который предоставляет API более низкого уровня для редактирования синтаксического дерева Esprima.
- Для файлов JSON вы можете использовать собственные методы объекта JSON.
Разбор файла кода с помощью RegEx - опасный путь, и перед этим вы должны прочитать антропологические ответы CS и понять недостатки синтаксического анализа RegEx. Если вы решили редактировать существующие файлы, используя RegEx, а не дерево AST, будьте осторожны и предоставьте полные модульные тесты. - Пожалуйста, пожалуйста, не нарушайте код ваших пользователей.
Более конкретно, при использовании esprima вам, скорее всего, потребуется также некоторый генератор, такой как escodegen, чтобы генерировать js обратно.
var templatePath = this.destinationPath(...);
this.fs.copy(templatePath, templatePath, {
process: function (content) {
// here use the parser
return ...
}
});
Обратите внимание, что вы можете использовать тот же путь в аргументах from
, to
, чтобы заменить существующий файл.
С другой стороны, недостатком таких синтаксических анализаторов является то, что в некоторых случаях они могут слишком сильно изменить исходный файл, и хотя это безопасно, это более навязчиво.
Ответ 4
Используйте var text = this.fs.read(filePath)
для чтения из файла и this.fs.write(filePath, content)
для записи в файл в местоположении.