Macに Scala + Play2.5 + IntelliJ の開発環境を作る

今回説明するのは以下です。

1.VMに開発環境を作ろうとして諦めた話
2.各ツールの紹介
3.各ツールの用途は分かったけど、結局どれをインストールすればいいのか
4.実際に環境を構築してみる


1.VMに開発環境を作ろうとして諦めた話

もともとPHPのエンジニアで最近はRubyを触っていますが、
PHPRubyだとVMCentOS)に開発環境を構築することが多い。
というか、可能な限りMacに変なツールを入れたくない。

なので、ScalaVM上に環境を構築しようと思った。
でも諦めた。

Scala + Play の動作は問題ないんだけど、
IntelliJが問題だった。

IntelliJ ではJDK指定したり、デバッグ開始するためにJVMのプロセスを触る必要があるんだけど、
VM上のJDKを指定したり、JVMのプロセスを触らせたりするのが面倒だった。
VM上のJDKを指定するのはVMの共有フォルダ機能とか使えば何とかなりそうだけど、
JVMのプロセスを触るのは無理だろ・・・。
って思ってチャレンジせずに諦めた・・・。
やってみると簡単にできたりするかもしれない。

ただ、Mac上に環境構築する場合でも
Activator というビルドツールをインストールするだけで
そんなにMacを汚す感じはなかった。
無理してVM上に環境構築する必要もないかな・・・。


2.各ツールの紹介

Scalaの環境を構築しようとすると色んなツールが出てきて、
結局何をインストールすればいいか分からなかった。
変なツールをMacに入れたくない・・・。
ということで、各ツールを説明する。

JDK
 ScalaJVM上で動作するのでJDKが必要。
 Macにインストールしておくこと。
 javac を実行してヘルプ的なやつが出ればOK。

Scala
 Scala本体。
 scalaenv のようなScalaのバージョン管理ができるツールを利用した方がいいので、
 Scalaを直接インストールする必要はないと思う。
 そもそも後述する Activator があれば十分なので、scalaenv さえ不要かもしれない。

SBT
 ビルドツール。
 Gradleみたいなやつ。
 ただし、後述する Activator があるのでインストールは不要だと思う。

Activator
 SBTをカスタマイズしたやつ。
 LightBendが提供している。
 SBTが不要なのは上位互換であるActivatorが存在するから。
 ActivatorはPlayのインストール、実行、
 プロジェクト環境を読み込んだ上でのコンソールでのコード実行
 Playのバージョン管理、
 Scalaのバージョン管理、
 など必要なことは全てできる。
 Activatorがあれば開発環境は構築できたも同然。
 ただし、scalaコマンド、sbtコマンドは利用できないので、
 これらが単体で必要なケースに遭遇した場合は、
 それぞれインストールする必要がある。

PlayFramework
 Scalaフレームワーク
 Play2.3以上であれば、Activator経由でインストールできるので
 特別なインストール手順があるわけではない。
 playは現時点で 2.5 なので問題ない。
 2.3未満だとplayコマンドがあったらしいが、今はActivatorで全部やるようになっている。
 playコマンドでplayを操作している記事があったら、
 古い内容なので注意。

scalaenv,playenv,sbtenv
 Scala, Play, SBT のバージョン管理をしてくれるツールたち。
 Activatorが全部面倒を見てくれるので、これらは不要。
 ただ、自分はScala自体はコマンドラインをパッと使いたい時や
 Scalaスクリプトを実行したいときに必要なので、
 scalaenvだけインストールしている。

IntelliJ,Eclipse
 開発用のIDE
 どっちもどっちな気がするので、なんとなく IntelliJ を採用。


3.各ツールの用途は分かったけど、結局どれをインストールすればいいのか

基本的には Activator だけでいいと思う。
Playの構築できるし、プロジェクトディレクトリ内であれば、Activator console が利用できるので、
scalaコマンドラインがなくても、ちょっとした動作確認が可能。

自分は scalaenv もインストールしているが、
まずは Activator だけ入れてみて必要であれば、
scalaenv, playenv などをインストールすればいいと思う。


4.実際に環境を構築してみる

Activatorをインストールするだけ。
Macなのでbrewを使う。

$ brew install typesafe-activator

インストールはすぐに終わるので、起動してみる。

$ activator

ここからのインストールが長い。

Activatorは何かするたびに長いインストールが走る可能性があるので、
「あれ、何か固まった?」と思って Ctrl + c を実行してはいけない。
気長に待ってみよう。

最終的に以下のようなメッセージが出力されるので、
127.0.0.1:8888(localhost:8888)にアクセスすると Activator のUIが表示されるはず。

[info] play - Application started (Prod)
[info] play - Listening for HTTP on /127.0.0.1:8888
[info] a.e.s.Slf4jLogger - Slf4jLogger started

Activatorはコマンドライン操作はもちろんのこと、
WebUIでボタンをポチポチしても同じ操作ができるらしい。
自分はコマンドラインしか使わないから分からないけど・・・。


ここからは、Activator で play のプロジェクトを作って、
IntelliJデバッグ実行できるようにしていく。


まずはプロジェクトを作る。

$ activator new

実行すると、プロジェクトのテンプレートとアプリ名を聞かれるので、
テンプレートは 6) play-scala を選択して、
アプリ名はテキトーに付ければいい。

プロジェクトができたら、
プロジェクトファイルに移動する。

$ cd myapp


そして起動してみる。
必要なファイルを全てインストールするので、ここからが長い。
数十分はかかる。

$ activator run


起動したらこんなメッセージになるはず。

$ activator run
[info] Loading project definition from /vagrant/myapp/project
[info] Set current project to myapp (in build file:/vagrant/myapp/)

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.NettyServer - Listening for HTTP on /127.0.0.1:9000

(Server started, use Ctrl+D to stop and go back to the console...)

Warning: node.js detection failed, sbt will use the Rhino based Trireme JavaScript engine instead to run JavaScript assets compilation, which in some cases may be orders of magnitude slower than using node.js.
[info] application - ApplicationTimer demo: Starting application at 2016-04-02T12:53:26.148Z.
[info] play.api.Play - Application started (Dev)

ここで node がないと warning が出る。
nodeがない場合、sbtはJSのアセットコンパイルの実行にRhinoというJSエンジンを利用する。
この場合、いくつかのユースケースでnodeよりも対数的に遅くなる可能性があるので、
可能であれば node を install した方がいい。

localhost:9000 にアクセスしてplayが起動していればプロジェクト作成は成功。

次は IntelliJ の設定。

別にしなくてもいいが、最初にIntelliJのメモリを設定する。
/Applications/IntelliJ IDEA CE.app/Contents/bin/idea.vmoptions の Xmx750m を Xmx1024m にしてみた。

次にIntelliJScalaプラグインをインストールする。
インストールは起動画面の下にある configure -> plugins -> brows repositories から可能。
Scalaで検索すると「Scala」ってやつが出てくるので、それをインストール。


Import Project -> 任意のアプリを選択 -> SBT としてimportする。

以下は Import Project 画面の設定。

Use auto-import
 これはONにしておくと良い。
 sbtファイルの変更をプロジェクトに反映する。
 例えばbuild.sbtで指定する scala のバージョンを変更した際に自動的にreloadされる。
 ただし、プロジェクトが大きくなると反映に時間がかかってしまう。

Create directories for empty content roots automatically
 自動的に中身が空のディレクトリを作成するということで、
 自動で必要なディレクトリを作ってくれる設定。

Project SDK
 New -> JDK を選択すると自動的にMac内のJDKを指定してくれるので、そのままOKでいい。


設定自体はこれで終了。


「SBT Project Data To import」というダイアログが表示される。

これはマルチプロジェクトをimportする際に表示されるらしい。
プロジェクト内に置きたいモジュールを選択することができる。
とりあえず、root, root-build にチェックが付いている。
よく分からないので、そのままOKで進む。


ここまで進むとやっと IntelliJ が起動する。(すでに起動してるが・・・)
起動するとインデックス作成やプロジェクトのリフレッシュが走るので、終わるまで待つ。
進捗は画面の右下に出ている。

終わったら Run -> Edit Configurations -> 左上のプラス -> Remote でデバッグ実行の設定をする。
といっても、Name を決めて OK を押すだけでいい。
Port は任意に変更してもいいが、初期のやつでいいと思う。

これでデバッグ実行の準備は整った。

IntelliJがコミュニティエディション(無料版)の場合は
activator と連携してデバッグ実行する必要がある。

まずは activator でプロジェクトをデバッグモードで起動する。
5005の部分はIntelliJで指定したポートになる。

$ activator -jvm-debug 5005 run

起動したら、IntelliJデバッグを起動する。
Run から起動してもいいし、虫のアイコンを押してもいい。
成功するとconsoleに Connected to the target VM, address: 'localhost:5005', transport: 'socket' が表示される。

これで接続成功。
どこかにブレークポイントを仕掛ければ止まってくれる。
Controllerにでも仕掛けておけばいい。

ちなみに、activator run は開発モードで起動する。
開発モードだとHTTPのリクエストごとにファイルの更新をチェックして、
更新があればビルドしてからリクエストを実行するので、
わざわざActivatorの実行を止めて再実行する必要はない。


開発環境の構築はこれで終了。
あとは Activator のコマンドでも調べると良い。

new, run の他にも console, compile, test がある。