tDiary で CoffeeScript を使いたくなったので、まずは Rake でコンパイルするところから。Asset pipeline みたいのは CGI ベースだとオーバーヘッドが大きすぎるので rack の方で上手いことやるところかな。
desc "compile coffeescript" task :compile do require 'coffee-script' FileList['js/**/*.coffee'].each do |coffee| File.open(coffee.gsub(Pathname(coffee).extname, '.js'), 'w') do |js| js.write CoffeeScript.compile(File.read(coffee)) end end end
最初、.js へのリネームは Pathname の sub_ext を使って書いてたんだけど、これは 1.9 feature ということを知って gsub で書き直したのであった。ばたり。
ちょっと前から触ることができるアプリケーションを rails-3.2.0.rc1 にアップグレードするという隠密行動をあちこちでやってるんだけど、heroku 用のアプリケーションで何故か push の時に実行される assets:precompile でエラーが発生してしまうという現象に遭遇したのでちょっと深追いしてみた。
原因としては app/assets/stylesheets/foo.scss というような sass-rails の処理対象となるファイルが含まれている場合に sprockets/base.rb の circular_call_protection で raise してしまうみたい。同じような現象は#270: rake assets:precompile fails after upgraded to Rails 3.2.0.rc1 - Issues - sstephenson/sprockets - GitHubで報告済みなので反応待ちの状態。
heroku の cedar stack だと lazy compile じゃなくて assets:precompile するのを推奨しているので、このままだと rails-3.2 は使えないなあ。ばたり。
いやgsubはダメでしょういくらなんでも。<br>この場合glob条件によりファイル名が*.coffeeであることは明らかなので、sub(/\.coffee\z/, '.js')とかでいいんじゃないでしょうか。
確かに sub でよかったですね…。ありがとうございます。