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!
Удачи!