2016-05-25 7 views
0

私はかなり特殊な問題があります:Sails.jsとmachinepack-sailsgulpifyを使って複雑なスタックを構築しようとしています。gulp-inject:pugを使用したときの開始タグの終了タグがありません

私のテンプレートに資産を注入するには、マシンパックの示唆しているように、gulp-injectプラグインを使用します。問題は、htmlejs以外のものではインジェクタが動作しないことです。それは単に何も変わらない。エラーはありません。

gulp.task('sails-linker-gulp:devViews', function() { 
    return gulp.src('views/**/*.?(html|ejs|jade|pug|haml|slim|dust)') // Read templates 
     .pipe(
     plugins.inject(
      gulp.src(require('../pipeline').jsFilesToInject, {read: false}), // Link the javaScript 
      { 
      starttag: generateScriptStartTag, 
      endtag: generateScriptEndTag, 
      ignorePath: '.tmp/public', 
      transform: (filepath, file, i, length) => { 
       return `script(src="${filepath}")`; 
      } 
      } 
     ) 
    ) 
     .pipe(
     plugins.inject(
      gulp.src(require('../pipeline').cssFilesToInject, {read: false}), // Link the styles 
      { 
      starttag: generateStyleStartTag, 
      endtag: generateStyleEndTag, 
      ignorePath: '.tmp/public' 
      } 
     ) 
    ) 
     .pipe(
     plugins.inject(
      gulp.src(['.tmp/public/jst.js'], {read: false}), // Link the JST Templates 
      { 
      starttag: generateTemplateStartTag, 
      endtag: generateTemplateEndTag, 
      ignorePath: '.tmp/public' 
      } 
     ) 
    ) 
     .pipe(gulp.dest('views/'))// Write modified files... 

generateScriptStartTagと、このような機能については心配しないでください、彼らは制御のためにそこにあると私は、彼らは多くのことをテストし、正しく動作1000%確信している:

私の仕事は、このようになります。これらのタグは、次のような種類のタグを生成します。

//- SCRIPTS 
//- SCRIPTS END 

テンプレート言語によって異なります。

カスタムトランスフォーム機能を追加できませんでした。 ejsまたはhtmlを使用するか、実際にhtml構文に似ているものがあれば正常に動作します。

帆について:セイルズは開発中の要求に応じてテンプレートをレンダリングするため、注入前にテンプレートをコンパイルするための巨大なタスクを追加することはできません。実際にはそれらを任意のディレクトリにプリコンパイルするわけではありません。そして正直なところ、私はどうして?注射はちょうど私の.jade/.pugファイルに行を追加するだけです。ファイルはすでにあるので、そこに問題があるのはわかりません。views誰かに助言することはできますか?

UPDATE:コードの むしろイライラ検査長さ0を持っており、ノードインスペクタでストリームのcontentを検査するとき、私はコメントを見ていないのinject機能を実行しているときに「マッチ」プロパティを明らかにし、ファイルにはっきりと記載されているにもかかわらず、彼らは撤去されました。

UPDATE#2: 私はejについて間違っていたようです。 HTMLファイルのみが処理されます。また、注入コメントを検出しなかった場合でも正常に機能します。しかし、それが終わった場合には、そのファイルに対しては決して決して放出されず、何も注入されません。これはすべてのテンプレートエンジンに当てはまります。静的なHTMLファイルだけが正常に動作します。

UPDATE#3: デバッグの他の5時間後、私はこの問題は、しかし、ストリームの私の理解がどの近いソリューションに私を得るために十分ではありませんがわかりました。問題は、プラグインのinject機能には、適切に終了しないループがあり、必要なタグをストリームに完全に挿入している間に、同じストリーム(注入されたタグ付き)でループを再実行し、エラー。 Debugger at the fault point なぜこのエラーは私が知らないどのコンソールにも現れなかったが、そこに行く。誰かが助けてくれますか?私は完全にこれで失われている...それはプラグインのバグですか?

答えて

0

私はこれを自分で調べなければなりませんでした。 gulp-injectのバグです。このプラグインが注入タグに対してテストするために生成する正規表現は、行全体と一致しません。最初の一致と単純に一致します。これは私が私のタグがそうのように設定している場合ことを意味します。二回//SCRIPTS

//SCRIPTS 
//SCRIPTS END 

正規表現はstarttagにマッチします regex result

と終了タグは一度だけマッチします。これにより、2番目のエラーが発生し、終了タグが見つからないというエラーが発生しました。

回避策は、タグの繰り返しを繰り返さないようにすることです。

//SCRIPTS 
//END SCRIPTS 

これは解決策ではありません。解決策は、インデントベースのテンプレート言語を使用するときに、タグに一致するように空白と改行文字のみを許可するように正規表現を変更することです。 ...

/\/\/-\s*SCRIPTS(?=\s*\n|$)/ig working exaple

は、誰もが今までこのつまずいていないと信じてすることはできません、それはより一般的な問題になりますように思える:このような 何かがうまくいきます

関連する問題