WEB+DB PRESS Vol.70にCoffeeScriptの特集がありました.Cygwinでも使えるようにしようと,思い立ちました.
王道は,ソースから…なのですが,node.jsのビルドは,tarballから(node-v0.8.8.tar.gz)でもGitHubのから*1でも,うまくいきません.
バイナリを頼ることにしました.手順は次のとおりです.
- Node.jsでINSTALLのボタンを押し,node-v0.8.8-x64.msiをダウンロードしました.
- msiファイルをダブルクリックでインストール.C:\Program Files\nodejsにインストールされました.
- Cygwinのシェルで,「/cygdrive/c/Program\ Files/nodejs/npm install coffee-script --global」を実行しました.coffeeの実行プログラムは,C\:\Users\<ユーザ名>\AppData\Roaming\npm\node_modules\coffee-script\bin\coffeeに配置されました.198バイトなので中を見たところ,nodeのスクリプトファイルになっています.
- Windowsの環境変数を確認*2すると,システム環境変数Pathの末尾に「;C:\Program Files\nodejs\」が追加され,ユーザー環境変数PATHが「<Cygwinのパス>;%Path%;C:\Users\<ユーザ名>\AppData\Roaming\npm\」となっていました.ログインし直して,Cygwinのシェルを開き,「which node coffee」を実行すると,それぞれのパスが表示され,使用可能となりました.
CoffeeScriptにある例で,動作確認をしてみますか.
$ coffee -bpe "alert i for i in [0..10]" var i, _i; for (i = _i = 0; _i <= 10; i = ++_i) { alert(i); }
$ cat > sample.coffee # Assignment: number = 42 opposite = true # Conditions: number = -42 if opposite # Functions: square = (x) -> x * x # Arrays: list = [1, 2, 3, 4, 5] # Objects: math = root: Math.sqrt square: square cube: (x) -> x * square x # Splats: race = (winner, runners...) -> print winner, runners # Existence: alert "I knew it!" if elvis? # Array comprehensions: cubes = (math.cube num for num in list) $ coffee --compile sample.coffee $ cat sample.js // Generated by CoffeeScript 1.3.3 (function() { var cubes, list, math, num, number, opposite, race, square, __slice = [].slice; number = 42; opposite = true; if (opposite) { number = -42; } square = function(x) { return x * x; }; list = [1, 2, 3, 4, 5]; math = { root: Math.sqrt, square: square, cube: function(x) { return x * square(x); } }; race = function() { var runners, winner; winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return print(winner, runners); }; if (typeof elvis !== "undefined" && elvis !== null) { alert("I knew it!"); } cubes = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = list.length; _i < _len; _i++) { num = list[_i]; _results.push(math.cube(num)); } return _results; })(); }).call(this);
ところで,なぜか「コーヒー」の綴りをよく「coffie」と打ち間違えます.当初は「which node coffie」でパス確認をしていて,後者が実行できないのかと悩んだのでした.
*1:どちらも,http://nodejs.org/download/でリンクされていたものです.