#node.js #heroku #coffeescript
#node.js #heroku #coffeescript
Вопрос:
Директива —watch для компилятора coffeescript не работает с node.js 0.4.7. Как исправить?
(В настоящее время для развертывания на Heroku требуется Node 0.4.7.)
Комментарии:
1. Мне любопытно: почему вы работаете
coffee --watch
на Heroku, а не на своей машине разработки?2. Тревор — я не использую coffee — смотрите на Heroku. Я использую узел 0.4.7 локально.
Ответ №1:
В fs.watch нет метода в node.js 0.4.7. Замените функцию наблюдения в строке 198 в command.js со следующим:
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 amp;amp; 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);
});
});
});
});
};
Комментарии:
1. Существует открытый запрос на извлечение для поддержки обоих: github.com/jashkenas/coffee-script/pull/1846
2. Обновление: приведенный выше запрос на извлечение был закрыт;
coffee
не будет поддерживатьсяfs.watchFile
.
Ответ №2:
Если вы не можете перейти на Node 0.6, попробуйте Jitter. Это универсальная утилита командной строки, которая делает то, что coffee -cw
делала до CoffeeScript 1.1.3. Плюс у нее есть несколько небольших дополнений, таких как уведомления Growl при сбое компиляции.
Комментарии:
1. Спасибо Тревор — Дрожание выглядит неплохо, я попробую. К сожалению, название противоречит установленному программному продукту, над которым я работал! Интересно, видели ли вы это раньше: cycling74.com/products/max/video-jitter
Ответ №3:
Вот watchscript, который я написал после того, как у меня был такой же опыт работы с опцией coffeescript -w, которая не работает. Он находит и просматривает файлы .coffee, .less, .jade на предмет изменений и запускает в ответ соответствующие им компиляторы. Генерирует цветной вывод для легкого определения сбоя компиляции.
/*
* Tested on node 0.6, Ubuntu
*/
#!/usr/bin/node
COLOR_GREEN="33[01;32m"
COLOR_RED="33[01;31m"
COLOR_YELLOW="33[01;33m"
COLOR_BLUE="33[01;34m"
COLOR_NORMAL="33[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 amp;amp; 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