Coffeescript – 手表开关不能与节点0.4.7一起工作

对coffeescript编译器的–watch指令不适用于node.js 0.4.7。 怎么修?

(目前需要在Heroku上部署0.4.7节点。)

node.js 0.4.7中没有fs.watch方法。 将command.js中的第198行的watch函数replace为以下内容:

 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.6,请尝试抖动 。 这是一个单用途的命令行实用程序,可以在CoffeeScript 1.1.3之前完成什么coffee -cw 。 另外它还有一些额外的function,如编译失败时的Growl通知。

以下是我在与coffeescript -w选项不起作用后所写的一个观察脚本。 它find并观看.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