いいものをつくろう

CTOの日記

Scala

sbtが全然わからない人向け入門

投稿日:

こんにちは

プロジェクトの中でも sbt を触ってきたのですが

分からない部分が結構多くある中使ってきたので

今日は怖いところがなくなるように勉強していきたいと思います。 

 

Scalaのとっつきにくさの一つとしてその件ご自身の学習コストの高さもあるのですがさらに

そのビルドツールである学習コストも高い個体と筆者は感じています。

その代表格が SBT なんですが、今日は

sbtも初心にもどって位置から学びます

 

勉強法ですが

SBT の本家ホームページを参考にするのが一番いいと思います

しかしながらそうは言っても本家のドキュメントは少し読みづらいので理解するのが難しいと感じる方が多いと思います

色々なサイトでビルドの要点をかいつまんでサイトがあるのですが私も

いろいろ読み漁ってエッセンスを抽出したいと思いますので

最後まで読んでいただけると嬉しいです 

 

余談ですが、

SBT の勉強に限らないのですが

 の勉強に限らないのですがあっ の勉強に限らないのですが新しい技術を学ぶときはいる

 の勉強に限らないのですが新しい技術を学ぶときは色々なまとめサイトを読むのではなくまず 

本家のウェブサイトのドキュメントを読むことをお勧めします

それが私がここ3年ぐらいで学んだことの一つです 

 

ということで本題に入ります 

まずはじめに

SBT を勉強する上で 、最も重要な概念は .sbt ビルド定義、 スコープ、と タスク・グラフ に書かれている。 

 

基本は、プロジェクト単位で設定するんだっていうこと

セッティングの中身はキーバリューのペアで設定を書くということ

さらにはその書き方はセッティング色と言う SBT 独自の dsl で記述するということが特徴である

build.sbt はどのように settings を定義するか 

build.sbt において定義されるサブプロジェクトは、キーと値のペア列を持つと言ったが、 このペアはセッティング式 (setting expression) と呼ばれ、build.sbt DSL にて記述される。

ThisBuild / organization := "com.example"
ThisBuild / scalaVersion := "2.12.10"
ThisBuild / version      := "0.1.0-SNAPSHOT"

lazy val root = (project in file("."))
.settings(
name
:= "hello"
)

 

中には以下引用画像のような制約が隠されているので知らないと驚いてしまうがこういう dsl というぐらいなのでこういう仕組みが用意されているということを念頭においておこう

https://www.scala-sbt.org/1.x/docs/ja/Basic-Def.html

 

自分でtaskを作れます。

ThisBuild / scalaVersion := "2.12.7"

lazy val hello = taskKey[Unit]("An example task")

lazy val root = (project in file("."))
  .settings(
    hello := { println("Hello!") }
  )

そして上の新しく作ったタスクを実行するには以下のように実行します 

 

sbt hello

>> Hello!

taskKeyはsbtで実行できる、settingKeyは普通に参照できる

lazy val hello = taskKey[Unit]("An example task")

lazy val miso = settingKey[String]("Soup")

lazy val root = (project in file("."))
  .settings(
    hello := { println("Hello!") },
    miso := "Soup!"
  )

それで

sbt miso

>> Soup!

補足

なぜか別の環境で`sbt`すると

[error] java.io.IOError: java.lang.RuntimeException: /packages cannot be represented as URI
[error] 	at java.base/jdk.internal.jrtfs.JrtPath.toUri(JrtPath.java:176)

というエラーが発生。scala 2.12.7のバグのようなので

2.12.10に上げたら解消された。(どういうことですか。。。まぁ進みます。)

 

 

 

超重要要素

超重要要素その一 Key

Key

 

キーの定義を見るにはここが一番わかりやすい

https://www.scala-sbt.org/0.13/sxr/sbt/Keys.scala.html

 

超重要要素その二 Scope

SBT を少し難しくしているのがScopeという概念です

 

 SBT のも難しいところはこのスコープを使い出すとどこに何があるから分かりにくくなるというところです。 

どのスコープに何を提供したかっていうのがわからなくなってきたきてしまった時のために一応インスペクトというコマンドがあります

 

sbtの動画、難しい

ですが、この記事を、動画と本家のページを読んだ後は

sbt入門をスラスラ読めるだろう。

 

以上です

-Scala

Copyright© CTOの日記 , 2020 All Rights Reserved.