2016-05-21 12 views
2

someFolder内のすべてのファイルを読み取ってから、gulp-inject-stringという固定ファイルにこれらのファイルを挿入することは、この質問の無関係な基準を使用して行います。Gulpタスク:ループ内のストリーム

私が持っているもののいくつかの擬似コード:

var gulp = require('gulp'); 
 
var inject = require('gulp-inject-string'); 
 
var fs = require("fs"); 
 

 
gulp.task('compile', function() { 
 
    
 
\t /* reading the file names in the directory */ 
 
\t var fileNames = fs.readdirSync('someFolder', 'utf8'); 
 
\t fileNames.forEach(function(fileName) { 
 
     
 
\t \t /* getting the whole file content and then removing what 
 
\t \t I don't want to be injected with a regex */ 
 
\t \t var wholeFile = fs.readFileSync('someFolder/' + fileName, 'utf8'); 
 
\t \t var file = wholeFile.replace(/<!-- COMMENT-WITH-SOME-FIXED-STRING:. * -->[\r\n]/g, ''); 
 
     
 
\t \t /* now getting into mainFile to inject this file */ 
 
\t \t gulp.src('mainFolder/mainFile.html') 
 
     
 
\t \t /* injecting the content after it has been processed by the regex exactly where I need it 
 
\t \t (which depends on the fileName I got earlier) */ 
 
\t \t .pipe(inject.afterEach('<!-- COMMENT-WITH-SOME-FIXED-STRING+FILENAME: ' + fileName + ' -->', file)) 
 
\t \t .pipe(gulp.dest('mainFolder')); 
 
     
 
\t }); 
 
});

私だけsomeFolder内の1つのファイルがある場合、これは正常に動作しますが、それ以外の場合は、最後の読み取りファイルを挿入します。私はJavaScriptでの非同期操作で数回行われたが、全く同じ結果を持っていたとして

for(var i...){ (function(i){ /* stream stuff here*/ })(i) }

私のような何かをしてループするための共通の内側に無名関数にストリームを吸収しようとしました。

merge-stream私はまた、fileNames以上の関数をマッピングして、ストリーム自体を返してからマージを適用してみましたが、同じ結果を再度使用してみました。

ストリームを処理しようとして間違っていますか?

+0

あなただけのファイルの束を一緒にCONCATしようとしていますか?なぜ[gulp-concat](https:// github。co.jp/contra/gulp-concat)? –

+0

@StevenLambertいいえ、私は正規表現といくつかのクリーンアップを実行した後に主要な問題の基準に関係のない 'inject'を使って、プリンターにファイルを注入しています。 – GMaiolo

答えて

1

はここで働く何か。私は別のフォルダ(destFolder)に出力を送信しています。なぜなら、入力を変更するgulpfileを絶対に嫌うからです。このようなgulpfileのデバッグは非常に困難です。

キーは以下のとおりです。

  1. はあなたの仕事が終わったとき、それは知っているので、がぶ飲みするために何かを返す必要があります。それ以外の場合は、タスクが終了する前にが終了することがあります。

  2. ストリーム上のすべてのアクションを連鎖した結果を返す必要があります。

  3. 通常、複数のストリームを1つのストリームに含めることはできますが、この場合は1つしか使用しないでください。部分的な結果しか得られません。

以下の入力があるとします。 gulp compileを実行

$ cat mainFolder/mainFile.html 
<!-- include: a --> 
Other stuff. 
<!-- include: b --> 
Other stuff. 
<!-- include: a --> 
Other stuff. 
<!-- include: b --> 

$ cat someFolder/a 
File a's contents. 

$ cat someFolder/b 
File b's contents. 

は生成します。

$ cat destFolder/mainFile.html 
<!-- include: a -->File a's contents. 

Other stuff. 
<!-- include: b -->File b's contents. 

Other stuff. 
<!-- include: a -->File a's contents. 

Other stuff. 
<!-- include: b -->File b's contents. 
+0

優れた、まさに私が必要なもの。 Gulpのreturn文のポイントは何ですか?これらの特定の例では、復帰の有無にかかわらず同じ動作とコンソールログを取得しています。 – GMaiolo

+1

あなたの非同期タスクが完了したときにGulpが知っていることを確認する*必要があります。 (そして、ここでの作業は 'gulp.src'が非同期であるため、*は非同期です)あなたが置かないと*動作するかもしれませんが運がいいです。例えば、タスクが非常に高速である場合、Gulpがブックを保存する前にタスクが完全に実行される可能性があります。同期タスクの場合、リターンは必要ありません(または望ましい場合もあります)。私は、タスクが完了したときにガルプを伝える方法について[回答](http://stackoverflow.com/a/33419479/1906307)を持っています。 – Louis

-1

ディレクトリとファイルにfsを使用する代わりに、gulp.srcを作成して、各ファイルをプライマリファイルに挿入することができます。それはあなたの失敗を引き起こしていたものではありません、追加するのは簡単ですので、私はmainFolder/mainFile.html上のテキスト置換を行っていませんでした

var gulp = require('gulp'); 
var inject = require('gulp-inject-string'); 
var fs = require("fs"); 

gulp.task('compile', function() { 
    /* reading the file names in the directory */ 
    var fileNames = fs.readdirSync('someFolder', 'utf8'); 
    var stream = gulp.src('mainFolder/mainFile.html'); 
    fileNames.forEach(function(fileName) { 
     var file = fs.readFileSync('someFolder/' + fileName, 'utf8'); 

     stream = stream.pipe(inject.afterEach('<!-- include: ' + 
               fileName + ' -->', file)); 

    }); 
    return stream.pipe(gulp.dest('destFolder')); 
}); 

gulp.src('someFolder/*.*') // or a specific file type 
    .pipe(inject.afterEach('someCriteriaInTheMainFile', file)) 
    .pipe(gulp.dest('mainFileFolderContainer')); 
+0

これは私の最初のaproachでしたが、パイプファイル名を取得し、ファイル名に基づいてその中の不要な文字列を置き換えるために正規表現を実行する必要がありました。元の質問を編集して、私が持っているほぼ正確なコードを少し説明的にします。 – GMaiolo

関連する問題