ログ日記

作業ログと日記とメモ

IntellijでScala + Lift を書く環境を整える

http://d.hatena.ne.jp/j5ik2o/20110121/1295586620
これを読んで

http://d.hatena.ne.jp/ishibashits/20110416/1302974848
ここの設定通りに。


まだ全然仕組みが分かってないが手順通りにやってみる。


Intellijプラグインの設定はたぶん迷わない。
バージョンが違うと多少画面が違うがだいたい同じ。


プロジェクトの作成は
http://www.assembla.com/spaces/liftweb/wiki/Using_IntelliJ_IDEA_to_develop_Lift_applications
ここを見る。
mavenの方がさくっとプロジェクトを作れそうだったのでmavenでやった。
Intellijのメニューから作成した場合は maven + sbt がうまくいかなかった。

cd ~/IdeaProjects
mvn archetype:generate \
 -DarchetypeGroupId=net.liftweb \
 -DarchetypeArtifactId=lift-archetype-basic_2.8.1 \
 -DarchetypeVersion=2.2 \
 -DarchetypeRepository=http://scala-tools.org/repo-releases \
 -DremoteRepositories=http://scala-tools.org/repo-releases \
 -DgroupId=com.example \
 -DartifactId=liftdemo \
-Dversion=1.0

cd liftdemo
~/bin/sbt
# sbtプロンプトで update、compileが成功すればOK

この後にプロジェクトをインポート。
project structure を見るとscalaが追加されてたはず。なければ追加で。

sbtはまだよく分からない。jarを取ってきて

#!/bin/bash
java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"

とファイルを書いただけ。


それからJRebelも取ってくる。
scala用ライセンスは
http://sales.zeroturnaround.com/
こっち。
メールで送られてくるのでjarと同じディレクトリに入れる。期限が決まっているので1年ぐらいしたらまた取得し直す感じ?


IntellijのJRebelプラグインも入れたらプロジェクトを右クリックして Generate rebel.xml する。
そこで

	<classpath>
		<dir name="/home/user/IdeaProjects/liftdemo/target/classes">
		</dir>
	</classpath>

のようになっているので

	<classpath>
                <dir name="/home/user/IdeaProjects/liftdemo/target/scala_2.8.1/classes">
                </dir>
	</classpath>

自分の環境に合わせて変更する。
正直まだsbtがコンパイル済みファイルをどこに書くか分かってない。classファイルをfind&grepして見つけた。
(追記:RunWebAppの設定で VM parametersに -Drebel.lift_plugin=true も必要?)


あとは

アプリの動作確認

intellijで[プロジェクト]/src/test/RunWebAppを選択して右クリックから「Run with JRebel "RunWeebApp.main"」を選択してください。
下部のコンソール画面にログが出力されます。問題なければ、http://localhost:8080で画面が表示されると思います。

開発時の方法

私の場合は、コンソールでsbtで「~compile」を入力しておいて、ソースの修正があった場合に自動で再コンパイルするにしています。同時にintellijでは、RunWebAppでアプリケーションサーバを起動して自動で反映されるようにしています。この方法ならinttelijのデバッグにも対応することが出来ます。intellijでのデバッグが不要ならsbtの「~jetty-run」だけでも大丈夫です。
※sbtでの「~compile」などはファイルに変更があったらもう一度行うようにする設定です。

http://d.hatena.ne.jp/ishibashits/20110416/1302974848

ここの通りに。


これで一通り終了。



あとはIDEAmacsを入れるなどする。…が、マークセットができない。
http://youtrack.jetbrains.net/issue/IDEA-69374?projectKey=IDEA
同じような人も居るみたい。
それからundo/redoのkeymapも変え方が分からない。一応emacsキーバインドにすると Ctrl+/ でundoできるようだがコメントアウトとかぶっている…。
エラーチェック周りの動作もよく分からんのでその辺はこれから。

Emacs で Scala + Lift の環境を作る

ファイルを保存したらsbtが自動でコンパイルしてJRebelがclassファイルの自動リロードするなら、もうIDEである必要は無いんじゃね?ってことで。
mvn でプロジェクトを作って sbt updateするところまでは前回 *1と同じ。


scala-modeのためにソースをダウンロードする。

wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.0.1.tgz

scalaDebian sidのパッケージを入れたので、それに対応するやつ。
Debianscalaパッケージは依存関係がほぼ無いのでsidでも問題ない。ってことはパッケージ版を使わなくてもいいんだけど。

tar xvzf scala-2.9.0.1.tgz
cp -a scala-2.9.0.1/misc/scala-tool-support/emacs ~/.emacs.d/plugins/scala-mode
cp scala-2.9.0.1/misc/scala-tool-support/emacs/contrib/dot-ctags ~/.ctags

aptitude install exuberant-ctags

http://d.hatena.ne.jp/tototoshi/20100925/1285420294
http://d.hatena.ne.jp/tototoshi/20100927/1285595939
ここを参考に。

wget https://github.com/downloads/aemoncannon/ensime/ensime_2.9.0-1-0.6.1.tar.gz
tar xvzf ensime_2.9.0-1-0.6.1.tar.gz
cp -a ensime_2.9.0-1-0.6.1 ~/.emacs.d/plugins/


.emacsを編集する。

;; scala
(add-to-list 'load-path
             "~/.emacs.d/plugins/scala-mode")
(require 'scala-mode-auto)
(add-to-list 'auto-mode-alist '("\\.scala$" . scala-mode))

;; (require 'scala-mode-feature-electric)
;;    (add-hook 'scala-mode-hook
;;      (lambda ()
;;        (scala-electric-mode)))

(add-to-list 'load-path
             "~/.emacs.d/plugins/ensime_2.9.0-1-0.6.1/elisp/")
(require 'ensime)
    (add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
;;(define-key ensime-mode-map (kbd "C-.") 'ensime-edit-definition)

(defadvice scala-block-indentation (around improve-indentation-after-brace activate)
  (if (eq (char-before) ?\{)
      (setq ad-return-value (+ (current-indentation) scala-mode-indent:step))
    ad-do-it))
(defun scala-newline-and-indent ()
  (interactive)
  (delete-horizontal-space)
  (let ((last-command nil))
    (newline-and-indent))
  (when (scala-in-multi-line-comment-p)
    (insert "* ")))
(add-hook 'scala-mode-hook
          (lambda ()
            (define-key scala-mode-map (kbd "RET") 'scala-newline-and-indent)))

インデントは http://www.callcc.net/diary/20101106.html ここに書いてあるものを使った。
scala-mode-feature-electric は何となく指に合わないのでコメントアウトしている。

cat ~/bin/sbt
#!/bin/bash
java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"


cat ~/bin/sbtj
#!/bin/bash
java -noverify -javaagent:/home/user/lib/jrebel/jrebel.jar \
 -Drebel.lift_plugin=true -XX:+CMSClassUnloadingEnabled \
 -XX:MaxPermSize=512m -Xmx512M -Xss2M -jar `dirname $0`/sbt-launch.jar \
 "$@"


cd project_dir
sbt "~compile"

http://batsov.com/Java/Scala/Programming/2011/04/26/jrebel-with-scala.html
ここの通りにjrebel用のコマンドを作った。
別窓で

sbtj test-run

で RunWebApp を選択すると動的にリロードするサーバーが立ち上がる。


emacsを起動して M-x ensime-config-gen 後に M-x ensime する。起動が正直重い。etagsのみでいいかもしれない。
逆にensimeを使うなら、etagsは利用しないので exuberant-ctags や .ctags は不要。
ensimeをやめてもflymake が使えそう。 http://d.hatena.ne.jp/kiris60/20091004/1254586627
でもsbtのコンパイルが動きっぱなしならそれも不要かもしれない。


http://www.scala-lang.org/node/5940
この辺に emacs からsbtコンパイルの連携があるが…もう一歩という感じ。



SBTのコマンド
http://code.google.com/p/simple-build-tool/wiki/RunningSbt
githubよりこっちの古い方が分かりやすい。