2011-11-14 10 views
1

coffeescriptコンパイラに対する--watchディレクティブはnode.jsでは動作しません0.4.7。直し方?Coffeescript - ウォッチスイッチがノード0.4.7で動作しません

(ノード0.4.7は現在、Herokuの上で展開するために必要です。)

+0

を私は好奇心:なぜあなたはHerokuの上ではなく、開発マシン上で 'コーヒー--watch'を実行していますか? –

+0

Trevor - 私はHerokuでコーヒーを使用していません。私はノード0.4.7をローカルに使用しています。 – mainsocial

答えて

1

は、Node.jsの0.4.7にはfs.watch方法はありません。以下でcommand.jsにライン198でウォッチ機能を交換してください:あなたはノード0.6にアップグレードすることができない場合は、Jitterを試してみてください

watch = function(source, base) { 
return fs.stat(source, function(err, prevStats) { 
    if (err) throw err; 
    return fs.watchFile(source, function(curr, prev) { 
    return fs.stat(source, function(err, stats) { 
     if (err) throw err; 
     if (stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) { 
     return; 
     } 
     prevStats = stats; 
     return fs.readFile(source, function(err, code) { 
     if (err) throw err; 
     return compileScript(source, code.toString(), base); 
     }); 
    }); 
    }); 
}); 
}; 
+0

両方をサポートするオープンプルリクエストがあります:https://github.com/jashkenas/coffee-script/pull/1846 –

+0

更新:上記のプルリクエストが閉じられました。 'coffee'は' fs.watchFile'をサポートしません。 –

0

。これは、CoffeeScript 1.1.3の前にcoffee -cwが何をしたのかを行う、専用のコマンドラインユーティリティです。加えて、コンパイルに失敗したときのGrowl通知のようないくつかの小さなエキストラがあります。

+0

ありがとうTrevor - ジッタはよく見えます、私はそれを試してみましょう。残念ながら、この名前は私が取り組んできた確立されたプログラミング製品と矛盾しています!私は以前あなたがそれを見たことがあるのだろうか:http://cycling74.com/products/max/video-jitter/ – mainsocial

0

これは、私がcoffeescript -wオプションを使用して同じ経験をした後に書いたウォッチ・スクリプトです。 .coffee、.less、.jadeファイルを見つけて監視し、対応するコンパイラを応答します。コンパイルが失敗したときを簡単に検出するためのカラー出力を生成します。

/* 
* Tested on node 0.6, Ubuntu 
*/ 
#!/usr/bin/node 

COLOR_GREEN="\033[01;32m" 
COLOR_RED="\033[01;31m" 
COLOR_YELLOW="\033[01;33m" 
COLOR_BLUE="\033[01;34m" 
COLOR_NORMAL="\033[00m" 

var fs = require('fs'); 

var coffeescript, jade, less; 
try { 
    coffeescript = require('/usr/lib/node_modules/coffee-script'); // after npm -g install coffee-script 
} catch(e) { 
    console.log(COLOR_RED,String(e),COLOR_NORMAL); 
} 

try { 
    jade = require('/usr/lib/node_modules/jade'); // after npm -g install jade 
} catch(e) { 
    console.log(COLOR_RED,String(e),COLOR_NORMAL); 
} 

try { 
    less = require('/usr/lib/node_modules/less'); // after npm -g install less 
} catch(e) { 
    console.log(COLOR_RED,String(e),COLOR_NORMAL); 
} 

console.log(
    'Watch Support', 
    (coffeescript ? COLOR_GREEN : COLOR_RED),' coffeescript ',COLOR_NORMAL, 
    (jade ? COLOR_GREEN : COLOR_RED),' jade ',COLOR_NORMAL, 
    (less ? COLOR_GREEN : COLOR_RED),' less ',COLOR_NORMAL 
); 

var compile = function (fname) { 
    var source = fs.readFileSync(fname).toString(); 
    try { 
    if(/\.jade$/.test(fname)) { 

     var html = jade.compile(source,{pretty:true})(); 
     var htmlfname = fname.replace(/\.jade$/,'.html'); 
     fs.writeFileSync(htmlfname, html); 
     console.log(COLOR_GREEN,'Success ',fname,new Date(),COLOR_NORMAL) 

    } else if(/\.coffee$/.test(fname)) { 

     var js = coffeescript.compile(source); 
     var jsfname = fname.replace(/\.coffee$/,'.js'); 
     fs.writeFileSync(jsfname, js); 
     console.log(COLOR_GREEN,'Success ',fname,new Date(),COLOR_NORMAL) 

    } else if(/\.less$/.test(fname)) { 

     var lessparser = new(less.Parser); 
     var cssfname = fname.replace(/\.less$/,'.css'); 
     lessparser.parse(source, function (e, tree) { 
     if(e) { 
      console.log(COLOR_RED,'Failed ',fname,String(e),COLOR_NORMAL); 
     } else { 
      fs.writeFileSync(cssfname, tree.toCSS()); 
      console.log(COLOR_GREEN,'Success ',fname,new Date(),COLOR_NORMAL) 
     } 
     }); 

    } 
    } catch(e) { 
    console.log(COLOR_RED,'Failed ',fname,String(e),COLOR_NORMAL) 
    } 
} 

var walk = function(dir, done) { 
    var results = []; 
    fs.readdir(dir, function(err, list) { 
    if (err) return done(err); 
    var pending = list.length; 
    if (!pending) return done(null, results); 
    list.forEach(function(file) { 
     file = dir + '/' + file; 
     fs.stat(file, function(err, stat) { 
     if (stat && stat.isDirectory()) { 
      walk(file, function(err, res) { 
      results = results.concat(res); 
      if (!--pending) done(null, results); 
      }); 
     } else { 
      results.push(file); 
      if (!--pending) done(null, results); 
     } 
     }); 
    }); 
    }); 
}; 

function main() { 
    if(process.argv.length > 2) { 
    dirName = process.argv[2]; 
    } else { 
    dirName = '.'; 
    } 

    stats = fs.statSync(dirName); 

    if(stats.isDirectory()) { 

    walk(dirName,function (err, files) { 
     var watching = 0; 
     files.forEach(function (fname) { 
     if(/\.coffee$|\.less$|\.jade$/.test(fname)) { 
      fs.watchFile(fname,{persistent:true,interval:500}, 
      function (cur,prev) { 
       if(cur.mtime.getTime() != prev.mtime.getTime()) { 
       compile(fname); 
       } 
      } 
     ); 
      watching++; 
     } 
     }); 
     if(watching) { 
     console.log('Watching '+watching+' file(s) in '+ 
      COLOR_YELLOW+dirName+COLOR_NORMAL); 
     } else { 
     console.log('No coffee/jade/less files found to watch'); 
     } 
    }); 
    } else { 
    // It's a file 
    var fname = dirName; 
    if(/\.coffee$|\.less$|\.jade$/.test(fname)) { 
     fs.watchFile(fname,{persistent:true,interval:500}, 
     function (cur,prev) { 
      if(cur.mtime.getTime() != prev.mtime.getTime()) { 
      compile(fname); 
      } 
     } 
    ); 
     console.log('Watching '+COLOR_YELLOW+fname+COLOR_NORMAL); 
    } else { 
     console.log('No coffee/jade/less files found to watch'); 
    } 
    } 
} 

main(); 

あなたが希望する場合要旨:https://gist.github.com/3083080

関連する問題