Pull to refresh

Используем Coffeescript на Windows

Reading time5 min
Views8.9K
CoffeeScript — это новый язык/надстройка/сахарная пудра над обычным JavaScript. Если кто ещё не слышал о нём, то можете прочитать эту отличную вводную статью.

По своей магической природе, сам компилятор для 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, и сейчас мы напишем билд-скрипт, который будет компилировать 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!

Удачи!
Tags:
Hubs:
+6
Comments5

Articles

Change theme settings