0

Node.js Jake ビルドで、特定のファイルがコピーされるまで待機し、宛先ファイルが見つかった後にのみ何らかの操作を実行する方法はありますか? この質問は、「Node.js/Jake で同期的にファイルをコピーする方法はありますか?」ということになると思います。fs.readSync(おそらく、との組み合わせを使用して、ゼロから何かを作成する以外の何かfs.writeSync。)

バックグラウンド:

開発中に Node.js (Express を使用) で実行される Web アプリを開発していますが、本番環境では Java サーバーにデプロイされます。(クライアントで Jade と Stylus を使用し、Express を使用すると、すべての HTML ファイルなどを生成せずにアプリを実行し、変更のたびに展開できます。)

ビルドの作成には Jake を使用します。つまり、Jade ファイルから HTML ファイルを生成し、Stylus ファイルから CSS を生成します。また、アプリのすべての JavaScript ファイルを 1 つの最小化されたファイルに連結し、すべての HTML ファイルを代わりに使用するように変更しようとしています。開発中に「生の」形式で使用されるすべての個別の JS ファイル。

しかし、私は今、その最後のステップに問題があります。私のアイデアは、すべての Jade ファイルを展開ビルド用の一時ディレクトリにコピーし、(すべての HTML ページでヘッダーとして使用される Jade ファイル内の) 参照をすべての個別の JS ファイルのリストに置き換えて、束全体を連結して最小化することによって生成されました。しかし、最初にすべての Jade ファイルを別の場所にコピーし (これは非同期で行われます)、ファイルの 1 つを編集しようとすると、コピー操作がまだ実際には完了していないため、ファイルを開くことが常に失敗します。

これは、私の中に(簡略化された形式で)今あるものですjakefile

var fs = require('fs');
var fse = require('fs-extra');
var path = require('path');
var glob = require('glob');
var Snockets = require('snockets');
var snockets = new Snockets();

// generating the minimized JS file
snockets.getConcatenation(baseDir + '/scripts/all.js', { minify: true }, function(err, allJs) {
  if (err) {
    throw err;
  }

  fs.writeFileSync(generatedJsFileName, allJs);
});

// copying all the Jade files to a temp dir
glob.sync('**/*.*', {
  cwd : srcDir
}).forEach(function(file) {
  var loadPath = srcDir + '/' + file;
  var savePath = targetDir + '/' + file;
  fse.mkdirsSync(path.dirname(savePath));
  fse.copy(loadPath, savePath);
});

// trying to read one of the copied files (which fails, since the file cannot be found yet)
fs.readFile(targetDir + '/views/includes/head.jade', 'utf8', function(err, data) {
  ...
});

これはばかげた質問かもしれませんし、そもそも問題を解決しようとするばかげた方法かもしれません。したがって、より良いアプローチの提案も大歓迎です。

アップデート:

また、Parseq を使用して、各操作 (JS ファイルの作成、Jade ファイルのコピー、1 つのファイルの読み取り) を独自の関数に入れてみましたが、それでも同じエラーが発生します。コピー操作の対象ディレクトリを途中で削除せずにスクリプトを数回実行すると、ファイルが見つかります。たとえば、パスは正しく、問題は実際にはタイミングにあるようです。

4

1 に答える 1

0

主な質問に対する答えが実際には見つからなかったので、これが同じ問題に直面している他の誰かに役立つかどうかはわかりません. しかし、私は問題を回避する方法を見つけました。

2 つの異なる変換で同じ元の Jade ファイルを使用して終了しましたが、2 回目の変換では、カスタムjs関数を使用してscriptタグ参照を変更し、縮小されたファイルを指すようにしました。

いえ

var data = jade.compile(str, { filename: file, pretty: true })({
  css: function(path) {
    return '<link rel="stylesheet" href="/styles/' + path + '.css" />';
  },
  js: function(path) {
    var name = '<script src="/scripts/';

    if (path == 'all') {
      name += generatedJsFileName;
    }
    else {
      name += path + '.js';
    }
    name += '"></script>'; 

    return name;
  }
});

これは最も美しい回避策ではないかもしれませんが、機能します。

于 2013-08-28T13:45:05.563 に答える