だから、あなたにいくつかのコンテキストを与えるために、私はいくつかのファイルを作成するジェネレータを作成しようとしています(もちろんユーザー入力に基づいて)そしてプロジェクト内のいくつかの既存のファイルを更新します(たとえば、新しいルート)。
this.template
を使用してファイルを作成することは問題ありません...問題は、Nodeを使用してファイルを読み取り、空想的な検索を行うことなく、Yeomanでこれを行う方法はありますか?と交換しますか?
さて、私は私の質問に対する答えを見つけました。
Addy Osmaniがどこを見ればいいのか教えてくれました Twitterのこのスレッド そして後で見つけました このリンク これは私が必要としているものを正確に示しています。
その要点は、readFileAsString
とwrite
の2つの関数に要約されます。使用法は次のとおりです。
var path = "/path/to/file.html",
file = this.readFileAsString(path);
/* make modifications to the file string here */
this.write(path, file);
編集:私もこれについてブログを書いています 私のブログで 。
Toilalによるコメントで言及されているように:
write
メソッドはもう存在しないため、writeFileFromString
に置き換える必要があります(引数も逆になります)– Toilal
そして、ivobaのコメントで述べられているように:
this.writeFileFromString
&this.readFileAsString
は非推奨です、github.com/yooman/html-配線は今では使用されているはずです、状況は変わります:) – ivoba
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
機能を利用することもできます。
@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 ...
}
});
既存のファイルを置き換えるために、from
、to
引数で同じパスを使用できることに注意してください。
一方、このようなパーサーの欠点は、場合によっては元のファイルを大幅に変更する可能性があることです。安全ではありますが、これはより煩わしいものです。
var text = this.fs.read(filePath)
を使用してファイルから読み取り、this.fs.write(filePath, content)
を使用して場所にあるファイルに書き込みます。