Билд систему посоветуйте
Билд-система должна висеть в фоне и слушать нотификации от файловой системы, перекомпилируя измененнные файлы.а зачем именно так?
Во-первых, это очень удобно. Сохранил файл, а у тебя уже все скомпилилось. Или сделал git checkout, и не надо отдельно make запускать. Во-вторых, так привыкли работать абсолютно все js-программисты.
while(true); do make; sleep (1); done
К тому же, для js-программистов make не подходит все же. Табы опять-таки. Мне redo понравился тем что там нет никакого специального синтаксиса. Redo файлы можно на чем угодно писать - это обычные скрипты.
ну это было к тому, что "нотифаи" от файловой системы в данном случае легко можно заменить тупо циклом, а что там внутри вызывать - дело десятое. Но тут конечно, важно как результат всего этого будет дальше использоваться
Вообще, пока самое классное что я видел - tup. Абсолютно то что нужно. Работал бы он еще под OSX, вообще было бы классно. Нравятся две вещи:
1)Не надо генерить список .o по списку .c с помощью каких-то страшных макросов или выражений на баше. Как я понял, DAG строится снизу вверх, а не сверху вниз как в мейке. Я говорю примерно вот про что:
http://solovyov.net/en/2012/showkr/
SOURCE = $(patsubst app/%.coffee, %.js, $(wildcard app/*.coffee
all: $(addprefix build/, $(SOURCE) index.html)
build/%.js: app/%.coffee
@mkdir -p $(@D)
coffee -pc $< > $@
В tup как я понял это было бы примерно
: foreach app/*.coffee |> coffee -pc %f > %o |> build/%B.js
2)Tup удаляет старые js файлы
А почему бы не заставить make работать в режиме демона? Берёшь gitwatch, он дёргает гит каждый раз, когда что-то меняется в папке (inotify прописываешь в git скриптах на после коммита выполнение make, и радуешься.
К тому же, для js-программистов make не подходит все же.В двух словах: а почему?
gruntjs + grunt-contrib-coffee
gruntjs + grunt-contrib-coffee
С него начинали как раз. Он не умеет перекомпилировать только измененные файлы. Еще грунт - это один процесс, а так как это nodejs - то один поток. У нас сейчас код грантом компилится секунд 5 примерно.
Ого. 5 секунд на компиляцию. серьёзное время.
Это не прокатит, так как там еще на каждое сохранение юнит-тесты запускаются.
while true; do inotifywait -r -e modify .; make; done;
К тому же, для js-программистов make не подходит все же.Это почему? Аргумент про табы неубедителен.
Ну и КМК не стоит запускать тесты на каждой изменение. Да и вообще странно, что тесты запускает make.
while true; do inotifywait -r -e modify .; make; done;Не прокатит. Save all в редакторе сгенерит несколько эвентов. На каждый эвент запустится make. Эти мейки станут ребилдить один и тот же файл.
В redo когда процесс начинает ребилдить файл, он лочит строчку в sqlite. За счет этого можно запускать помногу процессов redo и все будет ок.
Update: я сначала неправильно прочитал твой скрипт. Но он все равно некорректен. Если какой-то файл будет изменен в процессе работы мейка то информация об этом апдейте будет потеряна.
Вообще если ты фронтенд пишешь, то я бы сделал модуль для веб-сервера, который при обращении к '*.js' будет сравнивать таймстемп соответствующего .coffee и вызывать компилятор. Если при этом еще уметь компилятор держать в памяти, то будет работать отлично.
посмотри всё-таки gitwatch, там все этим моменты рассмотрены
хабр и можно придти к выоду что тебе нужен Gulp.
Я в этой теме совсем не спец, но вот тут видел обзорСпасибо за совет, но у всех этих систем на nodejs одна проблема - колхозный дизайн. Билд система должна позволять описать зависимости между файлами, а все сложные вещи сделать автоматически. Например, вычислить, какие файлы надо перекомпилировать, а какие нет, или распараллелить билд. В документации к этому гульпу написано
хабр и можно придти к выводу что тебе нужен Gulp.
Incremental Builds
We recommend these plugins:
gulp-changed
gulp-cached
gulp-newer
То есть самая базовая фича билд системы - сравнение таймстемпов сорс и таргет файлов - не реализована из коробки а реализуется плагинами(!). Вот тут вообще предлагается внутри конфиг файла педалить асинхронное программирование с промисами.
Оставить комментарий
luna89
Надо компилировать файлы *.coffee в файлы *.js. Билд-система должна висеть в фоне и слушать нотификации от файловой системы, перекомпилируя измененнные файлы.Все основанное на nodejs - говно для js-макак. Make и прочие не катят, так как не могут работать в режиме демона. Из оставшегося показались крайне интересными:
1)http://gittup.org/tup/
К сожалению, с трудом запускается на убунте и с большим трудом на OSX
2)http://github.com/apenwarr/redo
Очень близко к тому что нужно. К сожалению, есть такая проблема: сначала надо сгенерить список таргет js файлов. Для этого надо взять список coffee файлов, отрезать начало пути (src папку приставить target папку, заменить расширение coffee на js. Затем, в правиле для получения js файла, надо все это проделать в обратном порядке, чтобы получить путь к сорс файлу. Выглядит это жутко тупо. Меня самого это не остановило бы, но других я вряд ли смогу убедить пользоваться этим.
Есть еще такая проблема, что многие разработчики знают только одну платформу, например джаву или js. Юникс уже может не входить в список знакомых платформ. В результате вместо того чтобы написать одну language agnostic билд систему основанную на unix конвенциях люди переизобретают какие-то дерьмовые билд системы под каждый язык.