概要
開発サーバ上でサクッと Scala を書く機会があったので、IDE を使わない Scala 環境構築についてまとめてみます。
CLI (CUI) と Vim のみで気軽に Scala を書き始めちゃいましょう。
おまけで AWS SDK を使えるようにする設定も書いてみました。
入れたもの
おまけで入れたもの
CLI 環境で Scala が書きたいだけで余計な情報は必要ないんだよ!って方は、sbt のチャプターだけ読んでいただければ大丈夫かと思います。
scalaenv
Scala のバージョンマネージャです。Ruby では rbenv 、Python では pyenv が有名ですね。
scalaenv は Ruby の rbenv を元に作られたものだそうです。
必須ではありませんが、システム環境を汚すのが余り好きじゃないので使っています。
インストール
README の Installation にしたがってインストールします。
$ git clone git://github.com/mazgi/scalaenv.git ~/.scalaenv
$ echo 'export PATH="${HOME}/.scalaenv/bin:${PATH}"' >> ~/.bash_profile
$ echo 'eval "$(scalaenv init -)"' >> ~/.bash_profile
Scala のインストール
scalaevn を利用して Scala の最新バージョンを導入します。
まずは最新バージョンを確認。
$ scalaenv install -l
どうやら執筆時点 (2015/06/14) ではscala-2.11.6
が最新のようなので、そちらをインストールします。
$ scalaenv install scala-2.11.6
インストール後、scala-2.11.6
を通常使う Scala のバージョンに設定します。
$ scalaenv global scala-2.11.6
以下のコマンドでバージョンを確認できます。
$ scala -version
バージョンが表示されていれば、これで Scala のインストールは完了です。
簡単に動かしてみましょう。
$ scala
scala> println("Hi!")
Hi!
無事、動きました。
sbt
sbt は Scala 用のビルドツールです。プログラムのビルドをよしなにやってくれます。
一言で言うとビルドを超簡単にしてくれるやつで、コマンド一発でビルドできるようになります。
ビルドツールを採用しなかった場合、きっと色々だるいです。
C を使っていたい時代にファイル分割しようとして「だるい!」ってなった記憶があります。
ちなみに、にわか C 使いだったため、Makefile を書いた経験はありません。
ところでなんて読むんでしょうねこれ。酢豚?
インストール
sbt 公式ページに日本語でインストール方法が書いてある親切設計です。
Mac で homebrew を使っている方は、以下のコマンド一発で導入出来ます。
$ brew install sbt
設定
ディレクトリ
まずはプロジェクトのルートとなるディレクトリを作り移動します。
$ mkdir scala-project
$ cd scala-project
そして必要最低限のディレクトリを作成します。
$ mkdir -p src/main/scala
$ mkdir -p src/test/scala
$ mkdir -p lib
名前から推測できるようにsrc/main/scala
が scala のソースファイルを置くところです。
src/test/scala
はテストファイルを格納するディレクトリです。
lib
も名前の通り、ライブラリ置き場です。
src/main/java
を作成して、そこに Java のソースファイルを格納することも出来ます。
また、src/main/scala-x.xx
のようにバージョン指定のフォルダを追加すると、複数バージョンの Scala を共存させることも可能のようです。
プロジェクト
プロジェクトの設定ファイルもプロジェクトルートに簡単に作っておきます。
$ touch build.sbt
lazy val root = (project in file(".")).
settings(
name := "scala-project",
version := "1.0",
scalaVersion := "2.11.6"
)
build.sbt
の詳細はこちらに書いてあります。
実行
プロジェクト内でsbt run
コマンドを叩けばプロジェクトがビルドされ、エントリポイントからプログラムが実行されます。
試しに簡単なファイルを作成し、プロジェクトを実行してみます。
object Hello {
def main(args: Array[String]) = println("Hello, Scala!")
}
では、実行してみます。
$ sbt run
初回ビルドはプロジェクトに必要なライブラリ等をsbt
が大量にダウンロードしてくるため、時間がかかります。
まぁ、そうでなくても Scala のコンパイルは遅いことで有名ですね。
画面にHello, Scala!
と表示されたら成功です。
Git 管理
プロジェクトは現代人らしく Git で管理しましょう。
ビルド時に生成されたtarget
ディレクトリはコンパイル後の Class ファイルなどが格納されているので、管理下に置かないで良いかと思います。
target/
vim-scala
素の Vim だと Scala ファイルのシンタックスハイライトがないため、こちらを導入しておきます。
シンタックスハイライトなしでのコーディングは精神衛生上非常によろしくないのでやめておきましょう。
NeoBundle を使っている方は、以下の1行を.vimrc
に追記するだけで導入できます。
NeoBundle 'derekwyatt/vim-scala'
AWS SDK for Java
ここまでで基本は完了ですが、おまけで AWS SDK を導入してみます。
Scala のものは存在しませんが、Scala では Java の資産が使えるのでそれを使います。
インストール
公式サイトからAWS SDK for Java
をダウンるロードします。
解凍後、lib
およびthird-party
ディレクトリ以下に存在するすべてのjar
ファイルを先ほど作成した Scala プロジェクトのlib
ディレクトリへとコピーします。
$ find ~/Downloads/aws-java-sdk-1.10.0/lib/ -name *.jar | xargs -J% cp -f % lib/
$ find ~/Downloads/aws-java-sdk-1.10.0/third-party/ -name *.jar | xargs -J% cp -f % lib/
lib
ディレクトリ内は以下の様な状態になります。
$ find lib
lib
lib/aspectjrt.jar
lib/aspectjweaver.jar
lib/aws-java-sdk-1.10.0-javadoc.jar
lib/aws-java-sdk-1.10.0-sources.jar
lib/aws-java-sdk-1.10.0.jar
lib/aws-java-sdk-flow-build-tools-1.10.0.jar
lib/commons-codec-1.6.jar
lib/commons-logging-1.1.3.jar
lib/freemarker-2.3.18.jar
lib/httpclient-4.3.6.jar
lib/httpcore-4.3.3.jar
lib/jackson-annotations-2.5.3.jar
lib/jackson-core-2.5.3.jar
lib/jackson-databind-2.5.3.jar
lib/javax.mail-api-1.4.6.jar
lib/joda-time-2.8.jar
lib/spring-beans-3.0.7.jar
lib/spring-context-3.0.7.jar
lib/spring-core-3.0.7.jar
動作確認
DynamoDB のクライアントを作ってみて、エラーが出ないか確認してみます。
Trait を作ってミックスインしてみたり、それをextends
したクラスをインスタンス化してメソッドを呼び出したりしてみました。
クエリの発行等を行ってテストすべきとも思いましたが、諸事情(面倒臭かった)により省略しています。
おまけ項目ですし勘弁して下さい。
object Main extends App {
val hoge = new Hoge()
hoge.greet
println("Hello scala!")
}
class Hoge extends DynamoDB {
// ただ DynamoDB trait をミックスインしただけのクラス
}
import com.amazonaws._
import com.amazonaws.auth._
import com.amazonaws.regions._
import com.amazonaws.services.dynamodbv2._
trait DynamoDB {
val dynamodb = new AmazonDynamoDBClient(
new BasicAWSCredentials(
"アクセスキー",
"シークレットキー"
)
)
dynamodb.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1))
def greet = {
println("I'm dynamoDB")
}
}
DynamoDB を全く使っていませんが、実行してみます。
$ sbt run
I'm dynamoDB
Hello scala!
これで AWS SDK が無事エラーなくインストールされていることを確認できました。
まとめ
sbt を導入することで、驚くほど簡単に Scala プロジェクトを作ることが出来ます。
IDE 使うのめんどくさい!でも Scala ちょっと使いたい!って方は、ぜひ導入してみてください。
IntelliJ を使うと sbt を使ったプロジェクトが GUI で簡単に作れるので、面倒でなければ IntelliJ を入れるのが一番手っ取り早いとは思います。
個人的には、軽いプログラミングなら CLI のみで完結する開発環境が好みです。