CoffeeScript — это новый язык/надстройка/сахарная пудра над обычным JavaScript. Если кто ещё не слышал о нём, то можете прочитать эту отличную вводную статью.
По своей магической природе, сам компилятор для coffee-скриптов написан на coffee-скрипте. Но на наше счастье, пакет исходников CoffeeScript уже содержит готовые к употреблению js-скрипты. И сейчас я расскажу вам как их использовать в windows с помощью Node.js, Cygwin и Nant, ибо дело это не совсем простое, на первый взгляд.
Итак, для начала определим структуру простого проекта, с которым будем работать:
Цель — запустить
В этом нам помогут следующие программки:
В качестве примера, мы будем компилировать следующий простой coffee-скрипт "
Последнию версию пакета можно скачать с github или склонировать с помощью следующей команды:
В папке CoffeeScript\bin находятся два js-скрипта: cake и coffee. Cake — это система сборки проектов по типу make и rake, написана на CoffeeScript, но в этой статье мы её использовать не будем. Coffee — компилятор coffee-скриптов в js-скрипты. Это то что нам надо завести.
Бинарную сборку node.js для Windows сейчас можно с лёгкостью найти в интернете. Лично я сейчас использую версию 0.2.2 с этого сайта.
Уже на этом шаге можно запустить coffee. Предположим, что переменная окружения PATH содержит путь к папке node.js, и в качестве упражнения выполним следующую команду "
Однако, всё не так просто, если нужно вызвать coffee не из его bin каталога. Так как node.js компилируется для windows с помощью Cygwin, то все пути в параметрах к таким программам необходимо указывать в unix-виде через cygdrive (для абсолютных путей):
Чтобы сделать проще такие вызовы, можно использовать следующую обёртку для coffee в виде батничка "
Теперь вызов coffee упрощается:
Сейчас уже можно скомпилировать наш
Как видим, по прежнему остаётся необходимось указывать unix-пути в параметрах к компилятору.
Здесь к нам на помощь приходит…
… А точнее его могучая утилита cygpath.exe.
Cygwin-Lite — это очень сильно обрезанный Cygwin, который, из-за его малого размера, можно хранить вместе с кодом (да, я люблю хранить всё для сборки вместе с проектом). Скачать Cygwin-Lite можно здесь. Хотя для компиляции нам достаточно только cygpath, я не нашел где его можно скачать отдельно от пакета.
Использовать cygpath будем со следующими параметрами:
Это позволяет конвертировать windows-путей в абсолютные unix-пути. Пример:
OK, давайте уже наконец напишем батничек для компиляции скриптов!
Для чистоты эксперимента не будем пользоваться переменными окружения и самодельным coffee.bat.
Запускаем
Ура, работает! Но для сборки больших проектов нужно что-то покруче чем батничек.
Для тех, кто не знаком с NAnt, небольшой ликбез.
NAnt — это бесплатный инструмент для сборки и развёртывания .NET проектов. В своё время NAnt был портирован с Ant (система сборки для Java) на .NET framework и заточен под нужды .NET разработчиков. Но при хорошей фантазии, эту штуку можно применить для чего угодно. На текущий момент NAnt может быть запущен как и под windows, так и под linux, используя Mono. Его достоинства: умеет делать большое количество задач и функций прямо из коробки, есть обработка ошибок, плюс хорошая расширяемость и сторонние плагины.
Ссылки, по которым можно продолжить знакомство c Nant:
И так, предполагаю, что вы имеете какое-то представление о Nant, и сейчас мы напишем билд-скрипт, который будет компилировать coffee-скрипты, аналогично предыдущему compile.bat.
Сохраним билд-скрипт как "
Удачи!
По своей магической природе, сам компилятор для coffee-скриптов написан на coffee-скрипте. Но на наше счастье, пакет исходников CoffeeScript уже содержит готовые к употреблению js-скрипты. И сейчас я расскажу вам как их использовать в windows с помощью Node.js, Cygwin и Nant, ибо дело это не совсем простое, на первый взгляд.
Что хочется?
Итак, для начала определим структуру простого проекта, с которым будем работать:
Project +---CoffeeScripts | \---roast.coffee +---JavaScripts |---Tools | +---CoffeeScript | +---CygwinLite | +---NAnt | \---NodeJs \---compile.bat
Цель — запустить
compile.bat
в корне проекта, который скомпилирует все скрипты из папки CoffeеScripts
в папку JavaScripts
.В этом нам помогут следующие программки:
- сам пакет CoffeeScript;
- Node.js для запуска coffee-компилятора;
- Cygwin-Lite для конвертации путей к файлам в unix-вид;
- Nant — сборочная система для всей этой каши.
В качестве примера, мы будем компилировать следующий простой coffee-скрипт "
roast.coffee
":roast = (what) -> "Roasted #{what}" console.log roast 'coffee!'
CoffeeScript
Последнию версию пакета можно скачать с github или склонировать с помощью следующей команды:
git clone http://github.com/jashkenas/coffee-script.git
В папке CoffeeScript\bin находятся два js-скрипта: cake и coffee. Cake — это система сборки проектов по типу make и rake, написана на CoffeeScript, но в этой статье мы её использовать не будем. Coffee — компилятор coffee-скриптов в js-скрипты. Это то что нам надо завести.
Node.js
Бинарную сборку node.js для Windows сейчас можно с лёгкостью найти в интернете. Лично я сейчас использую версию 0.2.2 с этого сайта.
Уже на этом шаге можно запустить coffee. Предположим, что переменная окружения PATH содержит путь к папке node.js, и в качестве упражнения выполним следующую команду "
coffee --version
":C:\Project\Tools\CoffeeScript\bin >node coffee --version CoffeeScript version 0.9.4
Однако, всё не так просто, если нужно вызвать coffee не из его bin каталога. Так как node.js компилируется для windows с помощью Cygwin, то все пути в параметрах к таким программам необходимо указывать в unix-виде через cygdrive (для абсолютных путей):
D:\ >node /cygdrive/C/Project/Tools/CoffeeScript/bin/coffee --version CoffeeScript version 0.9.4
Чтобы сделать проще такие вызовы, можно использовать следующую обёртку для coffee в виде батничка "
coffee.bat
", которую нужно сохранить в его bin-каталог:@pushd . @cd /d %~dp0 @node coffee %* @popd
Теперь вызов coffee упрощается:
D:\ >C:\Project\Tools\CoffeeScript\bin\coffee --version CoffeeScript version 0.9.4
Сейчас уже можно скомпилировать наш
roast.coffee
и получить результат на консоль:C:\Project >Tools\CoffeeScript\bin\coffee -c -p /cygdrive/C/Project/CoffeeScripts/roast.coffee (function() { var roast; roast = function(what) { return "Roasted " + (what); }; console.log(roast('coffee!')); }).call(this);
Как видим, по прежнему остаётся необходимось указывать unix-пути в параметрах к компилятору.
Здесь к нам на помощь приходит…
Cygwin-Lite
… А точнее его могучая утилита cygpath.exe.
Cygwin-Lite — это очень сильно обрезанный Cygwin, который, из-за его малого размера, можно хранить вместе с кодом (да, я люблю хранить всё для сборки вместе с проектом). Скачать Cygwin-Lite можно здесь. Хотя для компиляции нам достаточно только cygpath, я не нашел где его можно скачать отдельно от пакета.
Использовать cygpath будем со следующими параметрами:
cygpath -a -u windows-filename
Это позволяет конвертировать windows-путей в абсолютные unix-пути. Пример:
C:\Project\Tools\CygwinLite\bin >cygpath.exe -a -u cygpath.exe /cygdrive/c/Project/Tools/CygwinLite/bin/cygpath.exe
Compile.bat
OK, давайте уже наконец напишем батничек для компиляции скриптов!
Для чистоты эксперимента не будем пользоваться переменными окружения и самодельным coffee.bat.
@echo off REM Папка с исходными скриптами set sourceDir=CoffeeScripts REM Папка для скомпилированных скриптов set destDir=JavaScripts REM Папки используемых утилит set cygwinDir=Tools\CygwinLite\bin set coffeeDir=Tools\CoffeeScript\bin set nodeDir=Tools\nodejs REM Получаем unix-пути для конечной папки и до скрипта coffee-компилятора for /f %%o in ('%cygwinDir%\cygpath.exe -a -u "%destDir%"') do set outputPath=%%o for /f %%c in ('%cygwinDir%\cygpath.exe -a -u "%coffeeDir%\coffee"') do set coffeePath=%%c REM Для каждого coffee-скрипта... for %%f in (%sourceDir%\*.coffee) do ( REM ...получаем его unix-путь, ... for /f %%s in ('%cygwinDir%\cygpath.exe -a -u %%f') do ( REM ... и компилируем его в javascript в конечную папку! %nodeDir%\node %coffeePath% -c -o %outputPath% %%s ) ) echo Done!
Запускаем
compile.bat
и получаем скомпилированный roast.js
в папке JavaScripts
:C:\Project >compile.bat Done! C:\Project >type JavaScripts\roast.js (function() { var roast; roast = function(what) { return "Roasted " + (what); }; console.log(roast('coffee!')); }).call(this);
Ура, работает! Но для сборки больших проектов нужно что-то покруче чем батничек.
Используем Nant
Для тех, кто не знаком с NAnt, небольшой ликбез.
NAnt — это бесплатный инструмент для сборки и развёртывания .NET проектов. В своё время NAnt был портирован с Ant (система сборки для Java) на .NET framework и заточен под нужды .NET разработчиков. Но при хорошей фантазии, эту штуку можно применить для чего угодно. На текущий момент NAnt может быть запущен как и под windows, так и под linux, используя Mono. Его достоинства: умеет делать большое количество задач и функций прямо из коробки, есть обработка ошибок, плюс хорошая расширяемость и сторонние плагины.
Ссылки, по которым можно продолжить знакомство c Nant:
- NAnt Home Page
- Автоматизация сборки web-приложения на платформе .NET
- A Brief Introduction to NAnt
- Dimecasts.net: NAnt Episodes (screencasts)
И так, предполагаю, что вы имеете какое-то представление о Nant, и сейчас мы напишем билд-скрипт, который будет компилировать coffee-скрипты, аналогично предыдущему compile.bat.
<?xml version="1.0" ?> <project xmlns="http://nant.sf.net/release/0.90-alpha1/nant.xsd" name="Coffee test"> <!-- Устанавливаем переменные окружения для скрипта. Путь до cygwin обязателен для использования функции ${cygpath} --> <setenv> <variable name="PATH" value="Tools\CygwinLite\bin;Tools\nodejs;%PATH%" /> </setenv> <foreach item="File" property="filename"> <in> <items basedir="CoffeeScripts"> <include name="*.coffee" /> </items> </in> <do> <exec program="node"> <arg line="${cygpath::get-unix-path('Tools\CoffeeScript\bin\coffee')}" /> <arg line="-c"/> <arg line="-o ${cygpath::get-unix-path(path::get-full-path('JavaScripts'))}"/> <arg line="${cygpath::get-unix-path(path::get-full-path(filename))}" /> </exec> </do> </foreach> </project>
Сохраним билд-скрипт как "
compile.build
" и напишем новый "compile.bat
" для его запуска:Tools\Nant\bin\nant.exe -buildfile:compile.build
Жарим кофе
C:\Project\JavaScripts >node roast.js Roasted coffee!
Удачи!