Scalaの環境を作る
Scalaの環境を作る
この章ではsbtというScala向けのビルドツール(JavaのGradleやMaven,Pythonのpipやvenvのようなものです)のみを利用します1,2.sbtは単なるビルドだけでなく言語仮想環境や外部ライブラリの管理などもでき,作業がこれ一つで完結します.なお,ScalaのプログラムもsbtもJVM上で動作するため実行環境としてJDK8+を利用しますが,scalaコマンドのインストールすら不要です.……ですが,それすら面倒な場合はオンライン実行環境であるScastie(https://scastie.scala-lang.org)を利用することで,ローカルの環境構築を全てスキップしてScalaを試すことができます.Scastieについてはこの章の最後に紹介します.
sbtをインストールする
利用するOSに応じてインストールを行ってください.sbtのバージョンは,2018年2月現在1系がメインストリームとなっています3.出来る限り最新のバージョン(2018年2月現在では1.1.0)を利用しましょう.
Windowsの場合
公式に頒布されているインストーラを利用する方法が一番かんたんでしょう.リリースページ(https://github.com/sbt/sbt/releases/latest)のDownloadsからsbt-${バージョン}.msiをダウンロードして実行してください.
別の選択肢としては,Windows向けのパッケージマネージャであるChocolatey(https://chocolatey.org/)経由でインストールする方法もあります.Chocolateyが導入済みであれば,PowerShell上で,
choco install sbt
と実行することでインストールできます.
MacOSの場合
MacOS用パッケージマネージャであるHomebrew(https://brew.sh/index_ja.html)を利用します.Homebrewをインストールした後,ターミナル上で,
brew install sbt
と実行することでインストールできます.
Linuxの場合
多くのディストリビューションのパッケージマネージャで提供されていますが,基本的にリポジトリを追加する必要があります.詳しくは公式マニュアル(http://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Linux.html)からそれぞれの環境にあったものを選択して実行してください.どれも数コマンドをコピペするだけでインストールが可能です.
sbtでテンプレートからプロジェクトを作る
ここからは各OS共通の処理になります.ターミナル上で
sbt new amaya382/simplest.g8
と実行するだけです4.ここで指定しているamaya382/simplest.g8というのはプロジェクトのテンプレートです.テンプレートリスト(https://github.com/foundweekends/giter8/wiki/giter8-templates)で挙げられているように,様々なタイプのアプリケーション向けにテンプレートが用意されています.今回利用するテンプレートは単にHello Worldと出力するだけの非常に簡易なプログラムのテンプレートです.
実行するとプロジェクト名(=プロジェクトルートディレクトリ名)等を聞かれるので適当に決めましょう.空欄のままエンターで進むとデフォルト値が利用されます.今回はプロジェクト名をscala-tour-example,パッケージ名はデフォルトのexample,クラス名をScalaTourとして進めていきます.
$ sbt new amaya382/simplest.g8
The simplest Scala project for beginners
name [simplest]: scala-tour-example
package [example]:
classname [Simplest]: ScalaTour
Template applied in ./scala-tour-example
テンプレートから作成されたプロジェクトの雛形も確認しておきましょう.これは今回のテンプレートに限らず,全てのsbtベースプロジェクトの基本になります.ディレクトリ構成は以下のようになっているはずです(target/のみ最初は存在せず,後から生成されます).
scala-tour-example/
├ build.sbt
├ project/
│ └ build.properties
├ src/
│ ├ main/
│ │ └ scala/
│ │ └ exapmle/
│ │ └ ScalaTour.scala
│ └ test/
│ └ scala/
│ └ example/
└ target/
上から見ていきましょう.まずプロジェクトルートにあるbuild.sbtはプロジェクトの設定を管理します.この設定ファイルはScalaのDSLとして書くことができ,主に
・プロジェクトのメタ情報(プロジェクト名,プロジェクトバージョン,etc.)
・利用するScalaのバージョン
・利用するライブラリ
を設定します.詳しい設定内容は追い追い紹介していきます.
project/build.propertiesは主にビルドに利用するsbtのバージョンを設定します.src/にはMavenと同じディレクトリ構造が用いられています.src/main/以下にプログラム本体のソースファイルを,src/test/以下にテスト用のソースファイルを置きます.src/main/・src/test/どちらも言語別のディレクトリ,今回はScalaなのでscalaを作り,更にその下にexampleのようにパッケージ名のディレクトリを切ることになります.
ちなみにエントリポイントとなるソースファイルは基本的にsrc/main/scala/以下にあればどこに属していてもよく,コンパイラが自動的に適切なメインメソッドを探索してくれます(もし複数見つかった場合コンパイル時にどうするか聞かれることになります).最後のtarget/はコンパイル時に自動的に生成され,コンパイル結果の保存先になります.つまりtarget/以下はGit等で管理する必要はないということです.
sbtでプログラムを実行する
作ったプロジェクトディレクトリに移動して実行してみましょう.
cd scala-tour-example
sbt # sbt-shell が起動する
sbt-shellが起動するので,加えて以下を実行してください.
run
初回はビルドのための様々なダウンロードが行われるため少々時間がかかるはずです5.2回目以降はキャッシュが効くので,それほど待たされることはないでしょう.とりあえずHello Worldと出力されれば成功です.
sbt-shellを使う
sbtはsbtコマンドでsbt-shellを常に立ち上げておき,そこから各コマンドを利用しましょう.Shell上からsbt runのように直接サブコマンドとして利用することも可能ですが,毎回JVMの起動が行われるため動作が遅くなります.
sbtでScala REPLを使う
REPLとはRead-eval-print loopの略でコードを対話的に逐次実行できる環境です.Scalaはコンパイラ言語ですがREPL上ではスクリプトのように実行できます.REPLをsbtプロジェクト内で実行することで,build.sbtで指定したScalaのバージョンや外部ライブラリといった設定も利用できます.
sbt-shell上で
console
と実行することでデフォルトのScala REPLが開きます.REPL上ではTabキーで補完機能を利用することができます.
scala> val message = "Hello World"
message: String = Hello World
scala> println(message)
Hello World
scala> 1 + 1
res1: Int = 2
scala> println(res1)
2
明示的に変数に代入しなかった場合は,上記サンプルres1のように自動的に変数が作成され,参照可能になります.
:pasteコマンドを実行することで,複数行に渡るコードを入力してCtrl-Dで一括実行することもできます.一括実行であるため,相互参照を含むコードも扱うことができます.
scala> :paste
// Entering paste mode (ctrl-D to finish)
val message = "Hello World"
println(message)
// Exiting paste mode,now interpreting.
Hello World
message: String = Hello World
:quitコマンドでREPLを, Ctrl+Cでsbtごと終了できます.
【コラム】Scastie
■Scastieとは
Scastieは,Scala公式のオンライン実行環境です.本格的な開発はできませんが,Scalaをかなりリッチな環境で試すことができます.
■Scastieの使い方
1.https://scastie.scala-lang.orgを開く!
2.表示されるエディタにコードを書く!
3.Runボタンを押す!
以上です6.
Formatボタンを押すと,いい感じにコードの整形もしてくれます.Build Settingsタブから外部ライブラリへの依存を追加することもできます.ライブラリは名前で検索して選択するだけで追加されます.最新バージョンがデフォルトで選択されるので,そのままで良いでしょう.ライブラリ以外にも設定項目がありますが,特別に違うバージョンのコンパイラを試したいと行ったことがなければ,デフォルトで良いでしょう.
注意点として,Worksheetモードというものがあります.ツールバーのWorksheetアイコンの丸が黒になっていればオフ,黄緑色になっていればオンを意味します(デフォルトではオンになっているはずです).オフになっていると通常のプログラムとして実行されるため,メインメソッドのようなエントリポイントが必要になります.一方オンになっているとエントリポイントは不要になります.
また,GitHubアカウントでログインした状態でSaveボタンを押すとソースコードを個別のURLに紐付けて保存でき,更にSaveボタンをおした後に表示されるDownloadボタンを押すと,sbtのプロジェクトとしてソースコード一式をダウンロードすることもできます.
【コラム】サンプルコード
本書のサンプルコードは以下の区分で実行できます.サンプルコードセットはGitHub(https://github.com/amaya382/scalatour-resources)でも公開しています.
■サンプルコードの実行
◆行番号のあるサンプルコード
REPL/ScastieWorksheetオンで実行できます.REPLを利用する場合は:pasteコマンドを利用してください.Scastieの場合はWorkSheetオンの状態でRunボタンを押すことで実行するものとします.一部,直前のサンプルコードと組み合わせる必要がある場合があります.
1: val message = "Hello World"
2: println(message)
一部のサンプルコードはsbtプロジェクト/ScastieWorksheetオフで実行できます.
sbtプロジェクトの場合は2.2節で作成したプロジェクトの
src/main/scala/example/ScalaTour.scalaを書き換え,sbt-shell上のrunで実行するものとします.Scastieの場合はWorksheetオフの状態でRunボタンを押すことで実行するものとします.
1: package example
2:
3: object ScalaTour {
4: def main(args: Array[String]): Unit = {
5: val message = "Hello World"
6: println(message)
7: }
8: }
◆行番号のないサンプルコード
一般的な形を示すためのScalaの擬似コードか他の言語のコードであり,実行を目的としていません.
def メソッド名(引数名: 引数の型,...): 返り値の型 = 式
final String message = "Hello World";
■サンプルコード中のコメント
サンプルコード中のコメントは以下の規則に従っています.
== | 糖衣構文による等価なコード | |
>> | 期待される結果の値 | |
>> : | 期待される結果の型 | |
/* | 出力+期待される改行を含む出力+*/ |
判りやすさのため文字列の場合はクォーテーション(")で括っています.
val message = "Hello" + " " + "World"
// == "Hello".+(" ").+("World")
// >> "Hello World"
// >> :String
println(message)
/* 出力
"Hello World"
*/
(次回へ続く)