SlideShare une entreprise Scribd logo
1  sur  122
Télécharger pour lire hors ligne
SBT 徹底解説

  @xuwei_k
お前だれよ?
● twitter @xuwei_k
● blog http://d.hatena.ne.jp/xuwei/
● github https://github.com/xuwei-k
● Scalaでお仕事してます
● Scala 自体は 2009年の秋くらい ( まだ2.8.0がbeta versionの
  とき? ) に始めたので、もうすぐ2年くらい?
● ScalaDays2011 というアメリカのイベントに行ってOdersky
  先生に会ってきたよ!
● @scalalog っていう単にひたすらコミットログをtweetするbot
  を自分のためにつくって追っかけたりするほどにScala好き
なんでScalaで仕事するという状
況に至ったのか?

という経緯
ちょうど1年くらい前に、ある関数型都市にて
     Scala座というイベントが開催される

● 公式ページ http://scalaza.com/

● togetter http://togetter.com/li/47287

● UST録画 http://bit.ly/qy5Ejs
@hito_asa さんの発表

Scala2.8でひるまのおしごと
        してみたよ

  http://bit.ly/oEFnay
What is SBT?
Simple
Build
Tool
超基本的なこと1

● sbt自体がScalaでつくられている
● そもそもScala用につくられたので、そ
  の他のbuild toolと異なり、デフォルト
  でScalaに対応してる
● Javaにも対応している
超基本的なこと2

● 最新のソースコード
   ○ https://github.com/harrah/xsbt
● 公式ドキュメント
   ○ https://github.com/harrah/xsbt/wiki
● メーリングリスト
   ○ http://groups.google.com/group/simple-
     build-tool
そもそも build tool ってなに?

他にどんなものがあるの?
●make
●ant
●rake
●maven
●ivy
●gradle

etc ・・・・
● Antやmavenでもscalaのビルドはできます


● Scalaの言語自体は実際今現在はAnt?
   ○ sbtも内部でAntよんでる?
   ○ 違う branch で Antに依存しないsbt のversion
     の作ってるのかな?
   ○ https://github.com/scala/scala/tree/xsbt
しかし!
de facto standard !
● sbtが使いやすいか?
● sbt使うべきか?

という問題でない
自身のプロジェクト管理に使わなくても、なんらかのライブラリの、
最新版をちょっと自分でソースからbuildしたいとかっていうときに
使ったりするので、


Scalaやっていれば自然とsbtを使わないとい
         けないときがある
IDEに頼ってる人
   多いェ・・・
   (´・ω・`)
自分もしばらくはIDEだけで
   コンパイルしてました
        ⇓
理由
● buildツールの使い方覚えるのめんどくさい
● とりあえずeclipseでできるならそれでいいじゃん
だんだんそのやり方の問題を実感
● テストどーするの?
● 依存ライブラリがあると管理めんどくさい
● Scala自体のversionを上げるときとか、それに合わ
  せて依存ライブラリをダウンロードしなおしたり、配
  置したりとかあばばばばば(´・ω・`)
● 違うパソコンでコーディングする場合に、完全に無
  駄な単純作業の繰り返し
● gitなどでversion管理する場合どーするのよ?
ちょっと試す程度の場合には使わなくてもいけちゃうけ
ど、ある程度の規模になると何らのそういう管理ツール
     があったほうが結果的に効率いい

            ⇓


  そうはいってもやっぱりめんどくさい(?)
提案
Scala初心者だとしても

最初からSBTを使うことを推進したい!
最初からというのはそもそも

Scala自体をダウンロードする以前
         に 

SBT だけダウンロードしてセットアップ
     しておくというやり方
sbt の launcherは、


● 他に依存せず
● ひとつのjarで
● Javaコマンドだけで起動


      できるように作られている
sbtさえ入れておけば
 大きなプロジェクトを
    管理する場合
でなくても便利に使える
初心者でも便利に使える例
     その1
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ scala-version
[info] 2.8.1
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ scala-version
[info] 2.8.1
$ console
Welcome to Scala version 2.8.1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ scala-version
[info] 2.8.1
$ console
Welcome to Scala version 2.8.1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> List(1,2,3).par
<console>:6: error: value par is not a member of List[Int]
     List(1,2,3).par
             ^
scala>
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ scala-version
[info] 2.8.1
$ console
Welcome to Scala version 2.8.1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> List(1,2,3).par
<console>:6: error: value par is not a member of List[Int]
     List(1,2,3).par
             ^
scala> :q
>
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ scala-version
[info] 2.8.1
$ console
Welcome to Scala version 2.8.1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> List(1,2,3).par
<console>:6: error: value par is not a member of List[Int]
     List(1,2,3).par
             ^
scala> :q
> set scalaVersion := "2.9.0-1"
>
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ scala-version
[info] 2.8.1
$ console
Welcome to Scala version 2.8.1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> List(1,2,3).par
<console>:6: error: value par is not a member of List[Int]
     List(1,2,3).par
             ^
scala> :q
> set scalaVersion := "2.9.0-1"
> console
Welcome to Scala version 2.9.0-1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
$ sbt
[info] Set current project to default-ee3801 (in build /sample/)
$ scala-version
[info] 2.8.1
$ console
Welcome to Scala version 2.8.1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> List(1,2,3).par
<console>:6: error: value par is not a member of List[Int]
     List(1,2,3).par
             ^
scala> :q
> set scalaVersion := "2.9.0-1"
> console
Welcome to Scala version 2.9.0-1 (Java HotSpot(TM) Client VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> List(1,2,3).par
res0: scala.collection.parallel.immutable.ParSeq[Int] = ParVector(1, 2, 3)
複数versionのScalaが超簡単に切り替えられる!

● しかも新しいversionがでた場合に、手動でダウンロー
  ドしなくても、全く同じ方法で切り替えられる
● SBTさえ入れておけば、windowsだろうがmacだろうが
  全く同じ方法が通用!パスの設定とか悩む必要ない!
● 一番最新のSNAPSHOTを試したい! とか すごく古い
  Scalaのversionを試したい! という場合以外は、この方
  法困ることないはず
● いわゆるRubyにおけるRVMの役割を果たせるので
  は?(むしろ他にもっと手軽でいい方法あるなら教えてくれ)
 ○ macやLinuxならyuroyoroさんが作ったやつあるよ
 ○ https://github.com/yuroyoro/svm
● ちょっとだけ試したい時にIDEの起動時間待つのめん
  どくさくありませんか?
初心者でも便利に使える例
     その2
依存ライブラリの追加も超簡単
> set libraryDependencies += "org.scala-tools.time" %% "time" % "0.4"

> console

Welcome to Scala version 2.9.0.final (Java HotSpot(TM) 64-Bit Server VM,
Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import org.scala_tools.time.Imports._
import org.scala_tools.time.Imports._

scala> DateTime.now + 1.days
http://mvnrepository.com/
● 基本的な操作がSBTのコンソールの対話環境のみですむ
● 反応がすぐに返ってきて、なにやってるかわかる
● とりあえずSBTのみ使う場合に、IDEを使うときによくあるモッサリするこ
  とに対するイライラが少ない
● SBTのコンソールのみで済むので思考が中断されない
● Scala 自体の REPL と同じように
   ○ タブキーでコマンドの補完が効く
   ○ ↑ キーを押せば以前に入力したコマンドの表示
● サーバーにsbt入れとけば、sshでつないで同じ方法で試すことが可能
● 一度でもそのマシンで使ったことがあるライブラリは、自動でキャッ
  シュされるから、 毎回ネットからダウンロードする無駄がない( Scala
  のコンパイラやライブラリ自体も )
   ○ ivyとかmavenのシステム利用しているらしい
大きなプロジェクト管理に使う用途でなくても色々便利なので



   初心者こそとにかく
   SBTを使うべき!!


                大事なことなので2回(ry
つまり build toolとしてではなく

最小限の入力で依存ライブラリをとっ
てきたり、Versionを切り替えられたり
           する

 対話型の   環境という捉え方
というわけで、sbt入れてない人は
今すぐここで入れるべき( ー`дー´)キリッ
インストール方法

● これ読め
  ○ https://github.com/harrah/xsbt/wiki/Setup
● 英語自信ないけど日本語訳してみた
  ○ https://gist.github.com/1139288
インストール時の注意点
● sbtは起動しっぱなしだと、コンパイル => クラスファイル生
  成を繰り返す
● デフォルトのメモリの設定だと足りなくなって落ちる
● 公式ドキュメントに書いてあるように、以下の設定をちゃん
  としておいたほうが良い
   ○ CMSClassUnloadingEnabled
   ○ MaxPermSize
● これ設定しても落ちる場合がある気がするんだけど、どうい
  うことなの・・・(´・ω・`)
IDEとの関係
● もちろんそれぞれの IDE 用にプラグインがある
    ○ https://github.com/mpeltonen/sbt-idea/tree/sbt-0.10
    ○ https://github.com/remeniuk/sbt-netbeans-plugin
    ○ https://github.com/typesafehub/sbteclipse
    ○ ほかにも?
● それぞれのIDEのplugin試すとかまでできてません、すいません(´・ω・`)
● eclipse に対する plugin とか数種類でてきてる・・・?
● そのあたりは完全に情報が不足してるので、共有しましょう
● しかし、まずはコマンドからの使い方だけおぼえればいいんじゃないかと個人的に
  は思う
● そのほうが覚えること少ないし
● ScalaDays行ったときにScalazのデモやってた人も、eclipse でコーディング =>
  sbt のコマンドは直接シェルからたたくとか・・・
sbtとIDEとの関係について
  今後の展開を含めた
    自分なりの考察
sbtのeclipse plugin作成してる
                 @takezoen さん

https://bitbucket.org/takezoe/eclipse-scala-tools/

http://d.hatena.ne.jp/takezoe/20110820#p1
● mavenやantなどは設定がxml
● xmlのスキーマが決まっていれば、IDE側から
  xmlをパースして、値を順次取っていくという感
  じ(?)
● しかし、sbtはプロジェクトの設定ファイル自体
  がScalaのファイルなので、実行しないと分か
  らない部分が・・・?
● そしてbasicの場合は、中途半端にScalaファイ
  ルのようでそうではない
● sbt側で、IDE側に対するインターフェイスとか用意と
  かしないと作るの難しいんじゃ・・・?
● sbt自体がスゴイ勢いで開発されていて、仕様決まっ
  てないというか、あるかどうかもわからない
● すると結局、最新の機能を利用したり、複雑なことを
  したい場合は、pluginだけでは完結しない
● そもそもScalaのpluginとの連携とかどうしていく方針
  なのだろうか?
● もちろんsbtのIDEに対するplugin自体に反対している
  わけではない
● だがしかし、現状結構厳しい(?)というかsbtの情報でさ
  え少ないのにsbt pluginの日本語情報とかほとんどな
  いから、なんとかしないと・・・?
● sbtのIDE連携で困ったら、
   ○ 英語のMLで聞く?
   ○ ソースコード読む?
● もちろんすごく便利なsbtのIDEプラグインができてき
  たら、自分もそれつかうかもしれないけれど、こういっ
  た理由から今自分は使ってない
● sbtのIDEプラグインを結構使いこなしている人い
  たら情報ください(´・ω・`)
● IDE連携が完璧にできたら素敵ですけど、とりあえ
  ずsbt単体でもとても便利ですよっていう話
sbtとはそもそも


Build tool
自分がbuild toolに対して期待すること
● 依存ライブラリの管理
● ファイルを一部だけ変更して場合、classファイルをキャッシュしてお
  いて速くコンパイルしてくれるとか
● テスト
● Jarを生成したり
● テスト時とデプロイ時で設定のためのリソースファイルが異なるのを
  管理したり
● 複数の子プロジェクト作ってそれらをまとめて管理したり
● webプロジェクト場合、サーバーが付属してて、簡単にサーバー起
  動して試したりとか
● etc・・・
● ちょっとした使い捨てのプログラムでない限り以下のサイク
  ルはほぼ必須(?)
   ○ コンパイル
   ○ テスト
   ○ Jarのやwarの生成
● このあたりは、完全Javaと共通
● だったらmavenとかあるし、plugin入れればScalaもビルドで
  きるけど、そこでsbtってなんなのか・・・?
自分が思う
   sbtがほかのbuild toolと比べて
       明らかに異なる2点

1. 設定ファイル自体がScalaのファイルと
   いうこと
2. 強力な対話環境
設定ファイル自体が 
Scala のソースコード
   ・・・(´・ω・`)?
mavenやAntは

<hoge>xml</hoge>
XML・・・
((((;゚Д゚))))ガクガクブルブル
xml
それなりに利点もある

が、人が読む場合に冗長
例えば・・・

twitter4j への依存を定義したい
maven
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"                         <dependency>
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http:        <groupId>org.twitter4j</groupId>
//maven.apache.org/maven-v4_0_0.xsd">                               <artifactId>twitter4j-core</artifactId>
                                                                    <version>2.2.4</version>
 <modelVersion>4.0.0</modelVersion>                                </dependency>
 <groupId>com.example</groupId>                                   </dependencies>
 <artifactId>sample</artifactId>
 <version>1.0-SNAPSHOT</version>                                  <build>
                                                                   <sourceDirectory>src/main/scala</sourceDirectory>
 <repositories>                                                    <plugins>
    <repository>                                                     <plugin>
    <id>scala-tools.org</id>                                          <groupId>org.scala-tools</groupId>
    <name>Scala-tools Maven2 Repository</name>                        <artifactId>maven-scala-plugin</artifactId>
    <url>http://scala-tools.org/repo-releases</url>                   <version>2.15.2</version>
  </repository>                                                      </plugin>
 </repositories>                                                   </plugins>
                                                                  </build>
 <pluginRepositories>                                            </project>
  <pluginRepository>
     <id>scala-tools.org</id>
     <name>Scala-tools Maven2 Repository</name>
     <url>http://scala-tools.org/repo-releases</url>
  </pluginRepository>
 </pluginRepositories>

 <dependencies>
  <dependency>
   <groupId>org.scala-lang</groupId>
   <artifactId>scala-library</artifactId>
   <version>2.8.1</version>
  </dependency>
sbt



"org.twitter4j" % "twitter4j" % "2.2.4"
mavenでscalaをbuildする場合や
    らないといけないこと
1. ライブラリとしてScalaのJarを参照するためにScala-toolsへのリ
   ポジトリ定義  <repositories>
2. mavenのpluginを利用してとしてコンパイル時にScalaを一緒にコ
   ンパイルしてもらうために、scala-toolsへのリポジトリ定義
   <pluginRepository>
3. そして、scala-library.jarへの依存 <dependencies>
4. pluginの設定 <plugin>
5. さらに、コンソール利用する場合には、もっと設定が必要・・・
SBTはそもそもScalaのbuildのた
めにつくられたものなので、maven
 の場合に設定しなければならな
  い、めんどくさい設定が不要!
Versionの話
主に2系統ある
この違い最低限知っておいたほうが良い
0.7系                     0.10系
● 0.7.7までいって開発Stop       ● 0.10.0のtagが2011年6月3日
● sbtを作成しているscala自体が       (ScalaDaysに合わせた?)
  2.7.7                  ● 最新のtagは0.10.1
● twitter製ライブラリやLiftなど   ● 0.10.2を開発中? 
  一部のプロジェクトではまだ          ● Scalaのversionは2.8.1
  こっちつかってる               ● 結構有名なプロジェクトの大半
● google code の wiki       は早々とこっちに移行してる
                         ● github の wiki
● プロジェクトの定義をそれぞれのScalaのVersionで書かなければいけな
  いところに注意
    ○ 0.7系   => 2.7.7
    ○ 0.10系 => 2.8.1
● 0.7系と0.10系はあまり互換性ない
    ○ アーキテクチャ、設計思想が結構変わってる
    ○ プロジェクトの定義のファイルの書きかえないといけない場合が・・・
● どっちを使うべきか難しい?
    ○ これから使い出すなら0.10系でいいんじゃね?
    ○ 0.10系のpluginの開発は最近盛んだし
● 個人的には0.10系を使っていくつもり
その他細かい話
● 0.9系とかありますが0.10系の開発のためだけのversionだったらしいの
  で気にしないでください
● つい最近0.11のbranchがきられた!
    ○ scalaの2.9系で開発するみたい
    ○ まだ使ってるプロジェクトはみたことない
    ○ READMEにはソースからビルドして使ってね♡って的なことが書い
      てあるだけでどこにもJarは置いてない(?)
● 0.10系と0.11系はどうなるんだろう・・・(´・ω・`)
    ○ しばらく両方平行して開発?
    ○ 0.10系はStopして0.11系だけ開発進むの?
    ○ 0.10と0.11の互換性は・・・?
ところで、
   自分が0.7系あまり詳しくないので、
ここから先(というかこれ以前の話もそうですが) 0.10系前提
           で話をします
Projectの定義方法が2種類


  Full Configuration

          or

  Basic Configuration
Full Configuration

● projectディレクトリ配下に、sbt.Build というtraitを
  継承したscalaのobjectを定義
● 完全なScalaとしてのソースコード
● ファイル名、object名は何でもいい
  ○ 慣習的には以下のどれか?
     ■ プロジェクト名.scala
     ■ プロジェクト名+Build.scala
     ■ 単に Build.scala
https://github.com/n8han/Unfiltered/blob/master/project/build.scala
Basic Configuration

● Projectのルートディレクトリの直下
  にbuild.sbt というファイルを作成し
  てその中に設定を記述
● FullConfigurationとはちょっと記述
  方法異なる
https://github.com/etorreborre/specs2/blob/1.5/specs2.sbt
Projectの設定ファイルについて
         どっちを使うべきなのか?
           どう使い分けるのか?


● 基本的なことは、どっちでもできる
● Basicのほうがちょっとだけ短く書ける
● 複数プロジェクトを定義するなど、複雑なことをする場合
  は、Full
SBTの内部DSLの
文法的な仕組みの話
一番良くつかうライブラリの
     依存定義の構文

val twitter4j = "org.twitter4j" % "twitter4j" % "2.2.4"
%ってなに・・・?(´・ω・`)

  演算子?メソッド?
以下のコードと等価


sbt.toGroupID("org.twitter4j").%("twitter4j").%("2.2.4")



 https://github.com/harrah/xsbt/blob/0.10/ivy/DependencyBuilders.scala
sbt以前のScalaの文法の基礎知識
● Scalaは、メソッド名に記号が使える
● メソッドの引数が0または1つの場合、以下のよ
  うな記述が可能

      obj.method(param)
              ⇓
      obj method param
※このスライドを書いた時点のsbt0.10系のソースを調べただけなので今後変わる可能性はあり



 ● sbtのpackage objectがsbt.impl.DependencyBuildersというtraitを継承して
   いて、そこにtoGroupIDというGroupIDを生成するimplicitなメソッドが定義して
   あります。

 ● GroupIDには%という、Stringを引数にとって、 GroupArtifactIDを返すメソッド
   が定義してあります。

 ● そして、GroupArtifactIDにも%というメソッドがあり、Stringを引数にとって、
   sbt.ModuleIDを返すメソッドが定義されています

 ● さらに、ModuleIDにも%というメソッドがあり(ry
え?(´・ω・`)
● もちろん、それらの文法的な意味を完全に把握している必要はな
  い
● しかしsbtは、"sbtに慣れた人にとっての読みやすさ" をかなり追求
● とても短く書ける反面、初心者にとってのわかりにくさ
● ちょっと複雑なことをやる場合以下のようなスキルが必要かも
   ○ ある程度の基本的なScalaの知識
   ○ sbtの英語のwikiをじっくり読む能力 or MLを調べる or MLで質問
     する能力
● 内部DSLとしての典型的な例
● 他にもTupleに対するヘテロなリストへのimplicitな変換など、一見す
  ると、文法的にわかりにくいものが数点
Scalaとしての文法とか
厳密な型が気になる人のための

 console-project

  というコマンド
Setting
● sbtの0.10系で、基礎となる概念
● これが完璧にわかれば、sbtを半分以上理解したと言っても過
  言ではない(?)
● そのあたりとか色々含めて、自身もsbtの0.10系使ってライブ
  ラリ作成しているeed3si9nさんがとてもわかりやすい解説書い
  てるので、読んだほうがいいよ
   ○ http://eed3si9n.com/ja/sbt-010-guide
プロジェクトのSettingとして定義されているもの

● プロジェクト名、依存ライブラリ一覧、コンパイル時
  引数、コンパイラプラグイン、Jvm引数、などなど
  ・・・
Settingに使う記号メソッド ェ・・・
https://github.com/harrah/xsbt/wiki/Settings


                 <<=
                  :=
                  +=
                 ++=
                 <+=
                <++=
                  ~=
こいつらがわかりづらいけど
     結構重要だから
丁寧に一個づつ説明します(`・ω・´)



  公式のwikiをなんとなく噛み砕いて説明するだけなので
 英語をスラスラ読める人は直接読めばいいと思うよ(´・ω・`)
<<=
The most general method is <<=. All other methods can be
 implemented in terms of <<=. <<= defines a setting using
                     other settings

もっとも一般的なメソッドで、他のすべてのメソッドはこれを使って
          実装することができる
現在のlibraryDependenciesの定義を参照して、junitへの依存を
追加した値を返し、それをlibraryDependenciesに代入



libraryDependencies <<= libraryDependencies apply { (deps:
Seq[ModuleID]) =>
   deps :+ ("junit" % "junit" % "4.8" % "test")
}
文法的なポイント
● libraryDependencies というものそのものは、SettingKey
  [Seq[ModuleID]] という型である
● この変数自体はvalであり変更不可能
● つまりlibraryDependenciesという変数そのものを単に上書きし
  ているわけではない
● applyを呼ぶことによって、libraryDependenciesの中のSeq
  [ModuleID] という値の状態を参照できるイメージ
● この仕組によって、   短く書けるかつ      という型安全 
  仕組みを実現しているが、慣れないとかなりわかりづらい
:=

:= is used to define a setting that overwrites any
previous value without referring to other settings.


:= は、他の設定値を参照せずに、値を上書きする場合



              name := "My Project"
+=
+= is used to define a setting that will append a single
value to the current sequence without referring to other
settings.


他の設定値を参照せずに、Seq型のSettingに対して、値を
一つ追加する場合
つまり以下の2つは全く同じ意味

libraryDependencies <<= libraryDependencies
apply { (deps: Seq[ModuleID]) =>
   deps :+ ("junit" % "junit" % "4.8" % "test")
}


libraryDependencies +=
  "junit" % "junit" % "4.8" % "test"
++=

The related method ++= appends a sequence to the current
        sequence, also without using other settings



(+=に関連する) ++= というメソッドは、現在のSequence に
Sequence を追加する。これもまた(+=と同じように)他の設
定値は参照しない
以下の3つも全く同じ意味

libraryDependencies <<= libraryDependencies apply {
(deps: Seq[ModuleID]) =>
   deps :+ ("junit" % "junit" % "4.8" % "test")
}


libraryDependencies +=
  "junit" % "junit" % "4.8" % "test"


libraryDependencies ++=
  Seq( "junit" % "junit" % "4.8" % "test" )
<+=
The <+= method is a hybrid of the += and <<= methods


          <+=メソッドは+=と<<=のハイブリッド
hybrid?(´・ω・`)
<<= は、現在の設定値を使用して、新しい設定値を作成

+= は現在の設定値を使用せずに、1つだけ値を追加

               ⇓

<+= は現在の設定値を参照して、値
を追加
● 参照する値の型と、設定する型が異なってもいいというのがポ
   イント


libraryDependencies <+= scalaVersion( "org.scala-lang" %
"scala-compiler" % _ )


 ● 現在のプロジェクト自体のScalaのversionの値を参照して、それ
   に応じてscala-compilerへのJarの設定を作成したものを
   libraryDependenciesに追加するという意味
 ● 言い換えれば、追加するscala-compilerのversionは、現在のプ
   ロジェクト自体のScalaのversionに依存して定義するということ
<++=

This next example adds a dependency on
  the Scala compiler to the current list of
 dependencies. Because another setting
    (scalaVersion) is used and a Seq is
      appended, the method is <++=.
今までのメソッドの命名規則から、な
んとなく使い方想像つきませんか
・・?(・ω・`)
● 他の値を参照しつつ
 ● 複数の値を
 ● 追加する


libraryDependencies <++= scalaVersion { sv =>
      ("org.scala-lang" % "scala-compiler" % sv) ::
      ("org.scala-lang" % "scala-swing" % sv) ::
      Nil
 }
~=

~= is used to transform the current value of
                  a setting


           ~= は現在の値を変換
現在のコンパイルオプションのSettingのSequenceから、"-Y"
で始まるものだけを除去


scalacOptions in Compile ~= { (options: Seq[String]) =>
  options filterNot ( _ startsWith "-Y" )
}
Taskという概念
● settingはプロジェクトの初期化時に決まるが、タスクの値
  は、プロジェクトを再読み込みしなくても生成できる
● Taskの依存関係を定義できる
● "あるTaskが失敗した場合" だけ実行するTaskとか定義で
  きる
Plugin
       https://github.com/harrah/xsbt/wiki/Plugins
https://github.com/harrah/xsbt/wiki/sbt-0.10-plugins-list

● pluginの使用者はproject/plugins/に、設定ファイルをおく
● 基本的には、pluginが独自のsettingのSeqを提供するので、自分の
  projectのsettingに、それらを追加する
● 0.7系まで、pluginのプロジェクトを継承する形だったらしいが、0.10
  系では、仕組みがかなり異なっている
● 独自のコマンドが定義されてる場合も
    ○ たとえばweb plugin なら、jetty-run など
ところでsbtの(full configurationの)ファイルは
         単なる
    Scalaのソースコード

               ⇓
  じゃあとにかくコード読もうぜ!
コードを読みやすくするために
    https://github.com/harrah/browse
というコンパイラプラグインを使って、htmlファイルを
                生成してみた

生成するためのコード
 http://github.com/xuwei-k/sbt-project-files-sxr

生成したhtml
 http://xuwei-k.github.com/sbt-project-files-sxr
● sourceGenerators っていうBuild時にコード生成
 するための、マニアックな機能があるらしい(つまりメ
 タプロの機能?)
● 実際にScalaz が、Build時コード生成とか変態的
  なことをやってる(あとでコード読む?)
● それを真似して、Build時にgithubにhttpのrequest
  投げて、コード取得とかやってみた
● http://bit.ly/pXaPfz
SBT関係ないけど
              https://github.com/harrah/browse
                            の説明
● そもそもScalaにはコンパイラプラグインという仕組みがある
● browse( sxr とも呼ばれてる? ) は、コンパイル時に解析したAST情報
  をもとに、読みやすいhtmlを生成するコンパイラプラグイン
● つまりコンパイル通らないと生成できなけどね・・(´・ω・`)
● 作者は、sbtの作者と同じ人
● 生成しておくと便利ですよ
● いくつか公式にサンプル置いてある(ちょっと古いけど)
    ○ http://harrah.github.com/browse/samples/index.html
● sbtからコンパイルプラグインを利用する場合

  addCompilerPlugin("org.scala-tools.sxr" %% "sxr" % "0.2.7" )
browseの説明のつづき
● 変数名やclass名が自動でhtmlのリンクになって、クリックでジャンプ!
● 変数名やメソッドにマウスをかざすと、型の名前が表示される !
● 作成しておいたlink情報を、ほかのsxr生成時にリンクする機能まであ
  る
● Vimのタグジャンプファイル生成機能とか隠し機能(?)まであるっぽい
  んだけど、READMEになにも書いてなくて使い方わからないから誰か
  試してよ!(´・ω・`)
    ○ https://github.
      com/harrah/browse/tree/master/src/main/scala/vim
まだまだsbtの機能としては色々あるんですが、
          残り時間は、


● 実際のProject設定ファイルのコー
  ドリーディング
● デモしながら説明
● 質問タイム 
おわり

ありがとうございました

Contenu connexe

Tendances

明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
kimukou_26 Kimukou
 
Ruby on Rails3 Tutorial Chapter2
Ruby on Rails3 Tutorial Chapter2Ruby on Rails3 Tutorial Chapter2
Ruby on Rails3 Tutorial Chapter2
Sea Mountain
 
Sd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 WhiteSd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 White
Akio Katayama
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
guest5f4320
 

Tendances (20)

laravel x モバイルアプリ
laravel x モバイルアプリlaravel x モバイルアプリ
laravel x モバイルアプリ
 
REST with Spring Boot #jqfk
REST with Spring Boot #jqfkREST with Spring Boot #jqfk
REST with Spring Boot #jqfk
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
 
Ruby on Rails3 Tutorial Chapter2
Ruby on Rails3 Tutorial Chapter2Ruby on Rails3 Tutorial Chapter2
Ruby on Rails3 Tutorial Chapter2
 
Sd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 WhiteSd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 White
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
Grails 2.0.0.M1の話
Grails 2.0.0.M1の話 Grails 2.0.0.M1の話
Grails 2.0.0.M1の話
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
ScalaCL in ScalaKaigi
ScalaCL in ScalaKaigiScalaCL in ScalaKaigi
ScalaCL in ScalaKaigi
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
react_rails
react_railsreact_rails
react_rails
 
覚醒!JavaScript
覚醒!JavaScript覚醒!JavaScript
覚醒!JavaScript
 
fanscala1 3 sbt
fanscala1 3 sbtfanscala1 3 sbt
fanscala1 3 sbt
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 

En vedette

Scala design pattern
Scala design patternScala design pattern
Scala design pattern
Kenji Yoshida
 
sbt 0.10 for beginners?
sbt 0.10 for beginners?sbt 0.10 for beginners?
sbt 0.10 for beginners?
k4200
 
Real-Time 3D Programming in Scala
Real-Time 3D Programming in ScalaReal-Time 3D Programming in Scala
Real-Time 3D Programming in Scala
Hideyuki Takeuchi
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
Jason Namkung
 
私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asa私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asa
Hitoshi Asai
 
Grass
GrassGrass
Grass
k4200
 
Cleaner scala stack
Cleaner scala stackCleaner scala stack
Cleaner scala stack
osamu kimura
 
Twitter4JとScalaと何か
Twitter4JとScalaと何かTwitter4JとScalaと何か
Twitter4JとScalaと何か
Yusuke Yamamoto
 

En vedette (20)

Scala repl
Scala replScala repl
Scala repl
 
Scala design pattern
Scala design patternScala design pattern
Scala design pattern
 
Scala lang evolution
Scala lang evolutionScala lang evolution
Scala lang evolution
 
20120718 scalaで転職
20120718 scalaで転職20120718 scalaで転職
20120718 scalaで転職
 
Lifthub (rpscala #31)
Lifthub (rpscala #31)Lifthub (rpscala #31)
Lifthub (rpscala #31)
 
sbt 0.10 for beginners?
sbt 0.10 for beginners?sbt 0.10 for beginners?
sbt 0.10 for beginners?
 
Real-Time 3D Programming in Scala
Real-Time 3D Programming in ScalaReal-Time 3D Programming in Scala
Real-Time 3D Programming in Scala
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 
Lifthub (#rpscala 26)
Lifthub (#rpscala 26)Lifthub (#rpscala 26)
Lifthub (#rpscala 26)
 
私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asa私とScalaと2010 @hito_asa
私とScalaと2010 @hito_asa
 
Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)Scala勉強会 in 渋谷 2010→2011(鹿島)
Scala勉強会 in 渋谷 2010→2011(鹿島)
 
Grass
GrassGrass
Grass
 
Cleaner scala stack
Cleaner scala stackCleaner scala stack
Cleaner scala stack
 
Twitter4JとScalaと何か
Twitter4JとScalaと何かTwitter4JとScalaと何か
Twitter4JとScalaと何か
 
Scalaz
ScalazScalaz
Scalaz
 
第一回Scala会議
第一回Scala会議第一回Scala会議
第一回Scala会議
 
「管理」をなくせばうまくいく
「管理」をなくせばうまくいく「管理」をなくせばうまくいく
「管理」をなくせばうまくいく
 
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
 
Pythonで簡単ネットワーク分析
Pythonで簡単ネットワーク分析Pythonで簡単ネットワーク分析
Pythonで簡単ネットワーク分析
 
Gensim
GensimGensim
Gensim
 

Similaire à scala-kaigi1-sbt

Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
Shinpei Ohtani
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
Makoto Haruyama
 

Similaire à scala-kaigi1-sbt (20)

【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!Appsody でnodejsのアプリを立ち上げよう!
Appsody でnodejsのアプリを立ち上げよう!
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Javaどこよりも早い Spring Boot 1.2 解説 #渋谷Java
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
Sbtのマルチプロジェクトはいいぞ
SbtのマルチプロジェクトはいいぞSbtのマルチプロジェクトはいいぞ
Sbtのマルチプロジェクトはいいぞ
 
Dev love関西 forslideshare
Dev love関西 forslideshareDev love関西 forslideshare
Dev love関西 forslideshare
 
第8回 天領倉敷 ScalaScala In Kurashiki 8
第8回 天領倉敷 ScalaScala In Kurashiki 8第8回 天領倉敷 ScalaScala In Kurashiki 8
第8回 天領倉敷 ScalaScala In Kurashiki 8
 
sbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころsbtマルチプロジェクトビルドの使いどころ
sbtマルチプロジェクトビルドの使いどころ
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
 
TDD勉強会キックオフ for Java
TDD勉強会キックオフ for JavaTDD勉強会キックオフ for Java
TDD勉強会キックオフ for Java
 
「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ「html5 boilerplate」から考える、これからのマークアップ
「html5 boilerplate」から考える、これからのマークアップ
 
Skinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scalaSkinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scala
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 

scala-kaigi1-sbt