CoffeeScript中でCoffeeScriptをコンパイルする(shebangも良い感じに)


CoffeeScriptで色々やる

まあ、なんつーか、色々なことをやりたくなるものです。で、今回は、CoffeeScriptでCoffeeScriptをコンパイルする仕組み。goldblendの最新版は、自分自身をコンパイルする機能を付けたので、そこからの抜粋です。その際、ちょっと工夫したい点は、shebang行の変換。そのへんは最初に正規表現で切り取って、書き出しの際にcoffee -> nodeに置換して付け加えています。

また、shebang行があると言うことは、実行権限が欲しいわけで、実行権限も付与しておきたいところですね。ただしここで、ついでにTIPS。なんか、fs.writeFileで、{mode: 0o0755}とか指定しても、実行可能ファイルは作れません。サンプルのように、fs.chmodで実行権限を別に付与して下さい。

では。

compile.coffee
fs = require('fs')
coffee = require('coffee-script').compile

compile = (coffeefile) ->
  read = fs.readFileSync coffeefile,'utf8'
  shebang = read.match(/^#!.*\r?\n/)
  if shebang?
    shebang = shebang[0]
    read = read.replace(shebang,'')
    shebang = shebang.replace('coffee','node')
  jssrc = coffee read,{bare:true}
  if shebang?
    jssrc = shebang+"\n"+jssrc
    jsfile = coffeefile.replace(/\.coffee$/,'')
  else
    jsfile = coffeefile.replace(/coffee$/,'js')
  fs.writeFileSync jsfile,jssrc,'utf8'
  if shebang?
    oldmask = process.umask 0
    fs.chmodSync jsfile,0o0755
    process.umask oldmask