web-dev-qa-db-ja.com

Yeomanジェネレーターは既存のファイルを更新できますか?

だから、あなたにいくつかのコンテキストを与えるために、私はいくつかのファイルを作成するジェネレータを作成しようとしています(もちろんユーザー入力に基づいて)そしてプロジェクト内のいくつかの既存のファイルを更新します(たとえば、新しいルート)。

this.templateを使用してファイルを作成することは問題ありません...問題は、Nodeを使用してファイルを読み取り、空想的な検索を行うことなく、Yeomanでこれを行う方法はありますか?と交換しますか?

31
Remy

さて、私は私の質問に対する答えを見つけました。

Addy Osmaniがどこを見ればいいのか教えてくれました Twitterのこのスレッド そして後で見つけました このリンク これは私が必要としているものを正確に示しています。

その要点は、readFileAsStringwriteの2つの関数に要約されます。使用法は次のとおりです。

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

編集2

そして、ivobaのコメントで述べられているように:

this.writeFileFromStringthis.readFileAsStringは非推奨です、github.com/yooman/html-配線は今では使用されているはずです、状況は変わります:) – ivoba

25
Remy

Yeomanは、 mem-fs-editor を使用したfs操作のより洗練された方法も提供します。

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機能を利用することもできます。

22
sepans

@sepansの優れた回答と組み合わせて、正規表現を使用する代わりに、パーサーを使用できます。

ヨーマンから ドキュメント

ヒント:既存のファイルのコンテンツを更新します

既存のファイルを更新することは、必ずしも簡単な作業ではありません。これを行う最も信頼できる方法は、ファイルを解析して編集することです [〜#〜] ast [〜#〜] 。このソリューションの主な問題は、ASTの編集は冗長で、理解するのが少し難しい場合があることです。

いくつかの人気のあるASTパーサーは次のとおりです。

  • Cheerio HTMLの解析用。
  • Esprima JavaScriptの解析用-興味があるかもしれません AST-Query これはEsprima構文ツリーを編集するための低レベルのAPIを提供します。
  • JSONファイルの場合、ネイティブ JSONオブジェクトメソッド を使用できます。

正規表現を使用してコードファイルを解析することは危険なパスです。その前に、これを読んでください CS人類学的回答 そして正規表現解析の欠陥を把握する必要があります。 ASTツリーではなくRegExを使用して既存のファイルを編集することを選択した場合は、注意して完全な単体テストを提供してください。-ユーザーのコードを壊さないでください。

より具体的には、esprimaを使用する場合、jsを生成するために escodegen などのジェネレーターも必要になる可能性があります。

var templatePath = this.destinationPath(...);
this.fs.copy(templatePath, templatePath, {
  process: function (content) {
    // here use the parser
    return ...
  }
});

既存のファイルを置き換えるために、fromto引数で同じパスを使用できることに注意してください。

一方、このようなパーサーの欠点は、場合によっては元のファイルを大幅に変更する可能性があることです。安全ではありますが、これはより煩わしいものです。

3
Wtower

var text = this.fs.read(filePath)を使用してファイルから読み取り、this.fs.write(filePath, content)を使用して場所にあるファイルに書き込みます。

0
Bubunyo Nyavor