Подтвердить что ты не робот

Могут ли генераторы Yeoman обновлять существующие файлы?

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

Создание файлов с помощью this.template не проблема... вопрос в том, есть ли способ сделать это с Йоменом без необходимости читать файл с помощью Node и делать какую-то причудливую находку и заменять?

4b9b3361

Ответ 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) для записи в файл в местоположении.