Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
SBT 徹底解説  @xuwei_k
お前だれよ?● twitter @xuwei_k● blog http://d.hatena.ne.jp/xuwei/● github https://github.com/xuwei-k● Scalaでお仕事してます● Scala 自体は 2...
なんでScalaで仕事するという状況に至ったのか?という経緯
ちょうど1年くらい前に、ある関数型都市にて     Scala座というイベントが開催される● 公式ページ http://scalaza.com/● togetter http://togetter.com/li/47287● UST録画 htt...
@hito_asa さんの発表Scala2.8でひるまのおしごと        してみたよ  http://bit.ly/oEFnay
What is SBT?
SimpleBuildTool
超基本的なこと1● sbt自体がScalaでつくられている● そもそもScala用につくられたので、そ  の他のbuild toolと異なり、デフォルト  でScalaに対応してる● Javaにも対応している
超基本的なこと2● 最新のソースコード   ○ https://github.com/harrah/xsbt● 公式ドキュメント   ○ https://github.com/harrah/xsbt/wiki● メーリングリスト   ○ htt...
そもそも build tool ってなに?他にどんなものがあるの?
●make●ant●rake●maven●ivy●gradleetc ・・・・
● Antやmavenでもscalaのビルドはできます● Scalaの言語自体は実際今現在はAnt?   ○ sbtも内部でAntよんでる?   ○ 違う branch で Antに依存しないsbt のversion     の作ってるのかな?...
しかし!
de facto standard !
● sbtが使いやすいか?● sbt使うべきか?という問題でない自身のプロジェクト管理に使わなくても、なんらかのライブラリの、最新版をちょっと自分でソースからbuildしたいとかっていうときに使ったりするので、Scalaやっていれば自然とsbt...
IDEに頼ってる人   多いェ・・・   (´・ω・`)
自分もしばらくはIDEだけで   コンパイルしてました        ⇓理由● buildツールの使い方覚えるのめんどくさい● とりあえずeclipseでできるならそれでいいじゃん
だんだんそのやり方の問題を実感● テストどーするの?● 依存ライブラリがあると管理めんどくさい● Scala自体の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$ consoleWelcome to Scala ...
$ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome to Scala ...
$ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome to Scala ...
$ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome to Scala ...
$ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome to Scala ...
$ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome to Scala ...
複数versionのScalaが超簡単に切り替えられる!● しかも新しいversionがでた場合に、手動でダウンロー  ドしなくても、全く同じ方法で切り替えられる● SBTさえ入れておけば、windowsだろうがmacだろうが  全く同じ方法が...
● いわゆるRubyにおけるRVMの役割を果たせるので  は?(むしろ他にもっと手軽でいい方法あるなら教えてくれ) ○ macやLinuxならyuroyoroさんが作ったやつあるよ ○ https://github.com/yuroyoro/s...
初心者でも便利に使える例     その2
依存ライブラリの追加も超簡単> set libraryDependencies += "org.scala-tools.time" %% "time" % "0.4"> consoleWelcome to Scala version 2.9.0...
http://mvnrepository.com/
● 基本的な操作がSBTのコンソールの対話環境のみですむ● 反応がすぐに返ってきて、なにやってるかわかる● とりあえずSBTのみ使う場合に、IDEを使うときによくあるモッサリするこ  とに対するイライラが少ない● SBTのコンソールのみで済むの...
大きなプロジェクト管理に使う用途でなくても色々便利なので   初心者こそとにかく   SBTを使うべき!!                大事なことなので2回(ry
つまり build toolとしてではなく最小限の入力で依存ライブラリをとってきたり、Versionを切り替えられたり           する 対話型の   環境という捉え方
というわけで、sbt入れてない人は今すぐここで入れるべき( ー`дー´)キリッ
インストール方法● これ読め  ○ https://github.com/harrah/xsbt/wiki/Setup● 英語自信ないけど日本語訳してみた  ○ https://gist.github.com/1139288
インストール時の注意点● sbtは起動しっぱなしだと、コンパイル => クラスファイル生  成を繰り返す● デフォルトのメモリの設定だと足りなくなって落ちる● 公式ドキュメントに書いてあるように、以下の設定をちゃん  としておいたほうが良い  ...
IDEとの関係● もちろんそれぞれの IDE 用にプラグインがある    ○ https://github.com/mpeltonen/sbt-idea/tree/sbt-0.10    ○ https://github.com/remeniu...
sbtとIDEとの関係について  今後の展開を含めた    自分なりの考察
sbtのeclipse plugin作成してる                 @takezoen さんhttps://bitbucket.org/takezoe/eclipse-scala-tools/http://d.hatena.ne.j...
● mavenやantなどは設定がxml● xmlのスキーマが決まっていれば、IDE側から  xmlをパースして、値を順次取っていくという感  じ(?)● しかし、sbtはプロジェクトの設定ファイル自体  がScalaのファイルなので、実行しな...
● sbt側で、IDE側に対するインターフェイスとか用意と  かしないと作るの難しいんじゃ・・・?● sbt自体がスゴイ勢いで開発されていて、仕様決まっ  てないというか、あるかどうかもわからない● すると結局、最新の機能を利用したり、複雑なこ...
● もちろんsbtのIDEに対するplugin自体に反対している  わけではない● だがしかし、現状結構厳しい(?)というかsbtの情報でさ  え少ないのにsbt pluginの日本語情報とかほとんどな  いから、なんとかしないと・・・?● s...
● sbtのIDEプラグインを結構使いこなしている人い  たら情報ください(´・ω・`)● IDE連携が完璧にできたら素敵ですけど、とりあえ  ずsbt単体でもとても便利ですよっていう話
sbtとはそもそもBuild tool
自分がbuild toolに対して期待すること● 依存ライブラリの管理● ファイルを一部だけ変更して場合、classファイルをキャッシュしてお  いて速くコンパイルしてくれるとか● テスト● Jarを生成したり● テスト時とデプロイ時で設定のた...
● ちょっとした使い捨てのプログラムでない限り以下のサイク  ルはほぼ必須(?)   ○ コンパイル   ○ テスト   ○ Jarのやwarの生成● このあたりは、完全Javaと共通● だったらmavenとかあるし、plugin入れればSca...
自分が思う   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"             ...
sbt"org.twitter4j" % "twitter4j" % "2.2.4"
mavenでscalaをbuildする場合や    らないといけないこと1. ライブラリとしてScalaのJarを参照するためにScala-toolsへのリ   ポジトリ定義  <repositories>2. mavenのpluginを利用し...
SBTはそもそもScalaのbuildのためにつくられたものなので、maven の場合に設定しなければならな  い、めんどくさい設定が不要!
Versionの話
主に2系統あるこの違い最低限知っておいたほうが良い
0.7系                     0.10系● 0.7.7までいって開発Stop       ● 0.10.0のtagが2011年6月3日● sbtを作成しているscala自体が       (ScalaDaysに合わせた?) ...
● プロジェクトの定義をそれぞれのScalaのVersionで書かなければいけな  いところに注意    ○ 0.7系   => 2.7.7    ○ 0.10系 => 2.8.1● 0.7系と0.10系はあまり互換性ない    ○ アーキテク...
その他細かい話● 0.9系とかありますが0.10系の開発のためだけのversionだったらしいの  で気にしないでください● つい最近0.11のbranchがきられた!    ○ scalaの2.9系で開発するみたい    ○ まだ使ってるプロ...
ところで、   自分が0.7系あまり詳しくないので、ここから先(というかこれ以前の話もそうですが) 0.10系前提           で話をします
Projectの定義方法が2種類  Full Configuration          or  Basic Configuration
Full Configuration● projectディレクトリ配下に、sbt.Build というtraitを  継承したscalaのobjectを定義● 完全なScalaとしてのソースコード● ファイル名、object名は何でもいい  ○ ...
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のほうがちょっとだけ短く書ける● 複数プロジェクトを定義するなど、複雑なこ...
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/DependencyB...
sbt以前のScalaの文法の基礎知識● Scalaは、メソッド名に記号が使える● メソッドの引数が0または1つの場合、以下のよ  うな記述が可能      obj.method(param)              ⇓      obj m...
※このスライドを書いた時点のsbt0.10系のソースを調べただけなので今後変わる可能性はあり ● sbtのpackage objectがsbt.impl.DependencyBuildersというtraitを継承して   いて、そこにtoGro...
え?(´・ω・`)
● もちろん、それらの文法的な意味を完全に把握している必要はな  い● しかしsbtは、"sbtに慣れた人にとっての読みやすさ" をかなり追求● とても短く書ける反面、初心者にとってのわかりにくさ● ちょっと複雑なことをやる場合以下のようなスキ...
Scalaとしての文法とか厳密な型が気になる人のための console-project  というコマンド
Setting● sbtの0.10系で、基礎となる概念● これが完璧にわかれば、sbtを半分以上理解したと言っても過  言ではない(?)● そのあたりとか色々含めて、自身もsbtの0.10系使ってライブ  ラリ作成しているeed3si9nさんが...
プロジェクトの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      ...
現在のlibraryDependenciesの定義を参照して、junitへの依存を追加した値を返し、それをlibraryDependenciesに代入libraryDependencies <<= libraryDependencies app...
文法的なポイント● libraryDependencies というものそのものは、SettingKey  [Seq[ModuleID]] という型である● この変数自体はvalであり変更不可能● つまりlibraryDependenciesとい...
:=:= is used to define a setting that overwrites anyprevious value without referring to other settings.:= は、他の設定値を参照せずに、値を...
+=+= is used to define a setting that will append a singlevalue to the current sequence without referring to othersettings...
つまり以下の2つは全く同じ意味libraryDependencies <<= libraryDependenciesapply { (deps: Seq[ModuleID]) =>   deps :+ ("junit" % "junit" % ...
++=The related method ++= appends a sequence to the current        sequence, also without using other settings(+=に関連する) ++...
以下の3つも全く同じ意味libraryDependencies <<= libraryDependencies apply {(deps: Seq[ModuleID]) =>   deps :+ ("junit" % "junit" % "4....
<+=The <+= method is a hybrid of the += and <<= methods          <+=メソッドは+=と<<=のハイブリッド
hybrid?(´・ω・`)
<<= は、現在の設定値を使用して、新しい設定値を作成+= は現在の設定値を使用せずに、1つだけ値を追加               ⇓<+= は現在の設定値を参照して、値を追加
● 参照する値の型と、設定する型が異なってもいいというのがポ   イントlibraryDependencies <+= scalaVersion( "org.scala-lang" %"scala-compiler" % _ ) ● 現在のプロ...
<++=This next example adds a dependency on  the Scala compiler to the current list of dependencies. Because another settin...
今までのメソッドの命名規則から、なんとなく使い方想像つきませんか・・?(・ω・`)
● 他の値を参照しつつ ● 複数の値を ● 追加するlibraryDependencies <++= scalaVersion { sv =>      ("org.scala-lang" % "scala-compiler" % sv) ::...
~=~= is used to transform the current value of                  a setting           ~= は現在の値を変換
現在のコンパイルオプションのSettingのSequenceから、"-Y"で始まるものだけを除去scalacOptions in Compile ~= { (options: Seq[String]) =>  options filterNot...
Taskという概念● settingはプロジェクトの初期化時に決まるが、タスクの値  は、プロジェクトを再読み込みしなくても生成できる● Taskの依存関係を定義できる● "あるTaskが失敗した場合" だけ実行するTaskとか定義で  きる
Plugin       https://github.com/harrah/xsbt/wiki/Pluginshttps://github.com/harrah/xsbt/wiki/sbt-0.10-plugins-list● pluginの...
ところでsbtの(full configurationの)ファイルは         単なる    Scalaのソースコード               ⇓  じゃあとにかくコード読もうぜ!
コードを読みやすくするために    https://github.com/harrah/browseというコンパイラプラグインを使って、htmlファイルを                生成してみた生成するためのコード http://githu...
● sourceGenerators っていうBuild時にコード生成 するための、マニアックな機能があるらしい(つまりメ タプロの機能?)● 実際にScalaz が、Build時コード生成とか変態的  なことをやってる(あとでコード読む?)●...
SBT関係ないけど              https://github.com/harrah/browse                            の説明● そもそもScalaにはコンパイラプラグインという仕組みがある● br...
browseの説明のつづき● 変数名やclass名が自動でhtmlのリンクになって、クリックでジャンプ!● 変数名やメソッドにマウスをかざすと、型の名前が表示される !● 作成しておいたlink情報を、ほかのsxr生成時にリンクする機能まであ ...
まだまだsbtの機能としては色々あるんですが、          残り時間は、● 実際のProject設定ファイルのコー  ドリーディング● デモしながら説明● 質問タイム 
おわりありがとうございました
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
Upcoming SlideShare
Loading in …5
×

27

Share

Download to read offline

scala-kaigi1-sbt

Download to read offline

Related Audiobooks

Free with a 30 day trial from Scribd

See all

scala-kaigi1-sbt

  1. 1. SBT 徹底解説 @xuwei_k
  2. 2. お前だれよ?● 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好き
  3. 3. なんでScalaで仕事するという状況に至ったのか?という経緯
  4. 4. ちょうど1年くらい前に、ある関数型都市にて Scala座というイベントが開催される● 公式ページ http://scalaza.com/● togetter http://togetter.com/li/47287● UST録画 http://bit.ly/qy5Ejs
  5. 5. @hito_asa さんの発表Scala2.8でひるまのおしごと してみたよ http://bit.ly/oEFnay
  6. 6. What is SBT?
  7. 7. SimpleBuildTool
  8. 8. 超基本的なこと1● sbt自体がScalaでつくられている● そもそもScala用につくられたので、そ の他のbuild toolと異なり、デフォルト でScalaに対応してる● Javaにも対応している
  9. 9. 超基本的なこと2● 最新のソースコード ○ https://github.com/harrah/xsbt● 公式ドキュメント ○ https://github.com/harrah/xsbt/wiki● メーリングリスト ○ http://groups.google.com/group/simple- build-tool
  10. 10. そもそも build tool ってなに?他にどんなものがあるの?
  11. 11. ●make●ant●rake●maven●ivy●gradleetc ・・・・
  12. 12. ● Antやmavenでもscalaのビルドはできます● Scalaの言語自体は実際今現在はAnt? ○ sbtも内部でAntよんでる? ○ 違う branch で Antに依存しないsbt のversion の作ってるのかな? ○ https://github.com/scala/scala/tree/xsbt
  13. 13. しかし!
  14. 14. de facto standard !
  15. 15. ● sbtが使いやすいか?● sbt使うべきか?という問題でない自身のプロジェクト管理に使わなくても、なんらかのライブラリの、最新版をちょっと自分でソースからbuildしたいとかっていうときに使ったりするので、Scalaやっていれば自然とsbtを使わないとい けないときがある
  16. 16. IDEに頼ってる人 多いェ・・・ (´・ω・`)
  17. 17. 自分もしばらくはIDEだけで コンパイルしてました ⇓理由● buildツールの使い方覚えるのめんどくさい● とりあえずeclipseでできるならそれでいいじゃん
  18. 18. だんだんそのやり方の問題を実感● テストどーするの?● 依存ライブラリがあると管理めんどくさい● Scala自体のversionを上げるときとか、それに合わ せて依存ライブラリをダウンロードしなおしたり、配 置したりとかあばばばばば(´・ω・`)● 違うパソコンでコーディングする場合に、完全に無 駄な単純作業の繰り返し● gitなどでversion管理する場合どーするのよ?
  19. 19. ちょっと試す程度の場合には使わなくてもいけちゃうけど、ある程度の規模になると何らのそういう管理ツール があったほうが結果的に効率いい ⇓ そうはいってもやっぱりめんどくさい(?)
  20. 20. 提案
  21. 21. Scala初心者だとしても最初からSBTを使うことを推進したい!
  22. 22. 最初からというのはそもそもScala自体をダウンロードする以前 に SBT だけダウンロードしてセットアップ しておくというやり方
  23. 23. sbt の launcherは、● 他に依存せず● ひとつのjarで● Javaコマンドだけで起動 できるように作られている
  24. 24. sbtさえ入れておけば 大きなプロジェクトを 管理する場合でなくても便利に使える
  25. 25. 初心者でも便利に使える例 その1
  26. 26. $ sbt[info] Set current project to default-ee3801 (in build /sample/)
  27. 27. $ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1
  28. 28. $ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome 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>
  29. 29. $ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome 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>
  30. 30. $ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome 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>
  31. 31. $ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome 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">
  32. 32. $ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome 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"> consoleWelcome 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>
  33. 33. $ sbt[info] Set current project to default-ee3801 (in build /sample/)$ scala-version[info] 2.8.1$ consoleWelcome 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"> consoleWelcome 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).parres0: scala.collection.parallel.immutable.ParSeq[Int] = ParVector(1, 2, 3)
  34. 34. 複数versionのScalaが超簡単に切り替えられる!● しかも新しいversionがでた場合に、手動でダウンロー ドしなくても、全く同じ方法で切り替えられる● SBTさえ入れておけば、windowsだろうがmacだろうが 全く同じ方法が通用!パスの設定とか悩む必要ない!● 一番最新のSNAPSHOTを試したい! とか すごく古い Scalaのversionを試したい! という場合以外は、この方 法困ることないはず
  35. 35. ● いわゆるRubyにおけるRVMの役割を果たせるので は?(むしろ他にもっと手軽でいい方法あるなら教えてくれ) ○ macやLinuxならyuroyoroさんが作ったやつあるよ ○ https://github.com/yuroyoro/svm● ちょっとだけ試したい時にIDEの起動時間待つのめん どくさくありませんか?
  36. 36. 初心者でも便利に使える例 その2
  37. 37. 依存ライブラリの追加も超簡単> set libraryDependencies += "org.scala-tools.time" %% "time" % "0.4"> consoleWelcome 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
  38. 38. http://mvnrepository.com/
  39. 39. ● 基本的な操作がSBTのコンソールの対話環境のみですむ● 反応がすぐに返ってきて、なにやってるかわかる● とりあえずSBTのみ使う場合に、IDEを使うときによくあるモッサリするこ とに対するイライラが少ない● SBTのコンソールのみで済むので思考が中断されない● Scala 自体の REPL と同じように ○ タブキーでコマンドの補完が効く ○ ↑ キーを押せば以前に入力したコマンドの表示● サーバーにsbt入れとけば、sshでつないで同じ方法で試すことが可能● 一度でもそのマシンで使ったことがあるライブラリは、自動でキャッ シュされるから、 毎回ネットからダウンロードする無駄がない( Scala のコンパイラやライブラリ自体も ) ○ ivyとかmavenのシステム利用しているらしい
  40. 40. 大きなプロジェクト管理に使う用途でなくても色々便利なので 初心者こそとにかく SBTを使うべき!! 大事なことなので2回(ry
  41. 41. つまり build toolとしてではなく最小限の入力で依存ライブラリをとってきたり、Versionを切り替えられたり する 対話型の 環境という捉え方
  42. 42. というわけで、sbt入れてない人は今すぐここで入れるべき( ー`дー´)キリッ
  43. 43. インストール方法● これ読め ○ https://github.com/harrah/xsbt/wiki/Setup● 英語自信ないけど日本語訳してみた ○ https://gist.github.com/1139288
  44. 44. インストール時の注意点● sbtは起動しっぱなしだと、コンパイル => クラスファイル生 成を繰り返す● デフォルトのメモリの設定だと足りなくなって落ちる● 公式ドキュメントに書いてあるように、以下の設定をちゃん としておいたほうが良い ○ CMSClassUnloadingEnabled ○ MaxPermSize● これ設定しても落ちる場合がある気がするんだけど、どうい うことなの・・・(´・ω・`)
  45. 45. 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 のコマンドは直接シェルからたたくとか・・・
  46. 46. sbtとIDEとの関係について 今後の展開を含めた 自分なりの考察
  47. 47. sbtのeclipse plugin作成してる @takezoen さんhttps://bitbucket.org/takezoe/eclipse-scala-tools/http://d.hatena.ne.jp/takezoe/20110820#p1
  48. 48. ● mavenやantなどは設定がxml● xmlのスキーマが決まっていれば、IDE側から xmlをパースして、値を順次取っていくという感 じ(?)● しかし、sbtはプロジェクトの設定ファイル自体 がScalaのファイルなので、実行しないと分か らない部分が・・・?● そしてbasicの場合は、中途半端にScalaファイ ルのようでそうではない
  49. 49. ● sbt側で、IDE側に対するインターフェイスとか用意と かしないと作るの難しいんじゃ・・・?● sbt自体がスゴイ勢いで開発されていて、仕様決まっ てないというか、あるかどうかもわからない● すると結局、最新の機能を利用したり、複雑なことを したい場合は、pluginだけでは完結しない● そもそもScalaのpluginとの連携とかどうしていく方針 なのだろうか?
  50. 50. ● もちろんsbtのIDEに対するplugin自体に反対している わけではない● だがしかし、現状結構厳しい(?)というかsbtの情報でさ え少ないのにsbt pluginの日本語情報とかほとんどな いから、なんとかしないと・・・?● sbtのIDE連携で困ったら、 ○ 英語のMLで聞く? ○ ソースコード読む?● もちろんすごく便利なsbtのIDEプラグインができてき たら、自分もそれつかうかもしれないけれど、こういっ た理由から今自分は使ってない
  51. 51. ● sbtのIDEプラグインを結構使いこなしている人い たら情報ください(´・ω・`)● IDE連携が完璧にできたら素敵ですけど、とりあえ ずsbt単体でもとても便利ですよっていう話
  52. 52. sbtとはそもそもBuild tool
  53. 53. 自分がbuild toolに対して期待すること● 依存ライブラリの管理● ファイルを一部だけ変更して場合、classファイルをキャッシュしてお いて速くコンパイルしてくれるとか● テスト● Jarを生成したり● テスト時とデプロイ時で設定のためのリソースファイルが異なるのを 管理したり● 複数の子プロジェクト作ってそれらをまとめて管理したり● webプロジェクト場合、サーバーが付属してて、簡単にサーバー起 動して試したりとか● etc・・・
  54. 54. ● ちょっとした使い捨てのプログラムでない限り以下のサイク ルはほぼ必須(?) ○ コンパイル ○ テスト ○ Jarのやwarの生成● このあたりは、完全Javaと共通● だったらmavenとかあるし、plugin入れればScalaもビルドで きるけど、そこでsbtってなんなのか・・・?
  55. 55. 自分が思う sbtがほかのbuild toolと比べて 明らかに異なる2点1. 設定ファイル自体がScalaのファイルと いうこと2. 強力な対話環境
  56. 56. 設定ファイル自体が Scala のソースコード ・・・(´・ω・`)?
  57. 57. mavenやAntは<hoge>xml</hoge>
  58. 58. XML・・・((((;゚Д゚))))ガクガクブルブル
  59. 59. xmlそれなりに利点もあるが、人が読む場合に冗長
  60. 60. 例えば・・・twitter4j への依存を定義したい
  61. 61. 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>
  62. 62. sbt"org.twitter4j" % "twitter4j" % "2.2.4"
  63. 63. 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. さらに、コンソール利用する場合には、もっと設定が必要・・・
  64. 64. SBTはそもそもScalaのbuildのためにつくられたものなので、maven の場合に設定しなければならな い、めんどくさい設定が不要!
  65. 65. Versionの話
  66. 66. 主に2系統あるこの違い最低限知っておいたほうが良い
  67. 67. 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
  68. 68. ● プロジェクトの定義をそれぞれのScalaのVersionで書かなければいけな いところに注意 ○ 0.7系   => 2.7.7 ○ 0.10系 => 2.8.1● 0.7系と0.10系はあまり互換性ない ○ アーキテクチャ、設計思想が結構変わってる ○ プロジェクトの定義のファイルの書きかえないといけない場合が・・・● どっちを使うべきか難しい? ○ これから使い出すなら0.10系でいいんじゃね? ○ 0.10系のpluginの開発は最近盛んだし● 個人的には0.10系を使っていくつもり
  69. 69. その他細かい話● 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の互換性は・・・?
  70. 70. ところで、 自分が0.7系あまり詳しくないので、ここから先(というかこれ以前の話もそうですが) 0.10系前提 で話をします
  71. 71. Projectの定義方法が2種類 Full Configuration or Basic Configuration
  72. 72. Full Configuration● projectディレクトリ配下に、sbt.Build というtraitを 継承したscalaのobjectを定義● 完全なScalaとしてのソースコード● ファイル名、object名は何でもいい ○ 慣習的には以下のどれか? ■ プロジェクト名.scala ■ プロジェクト名+Build.scala ■ 単に Build.scala
  73. 73. https://github.com/n8han/Unfiltered/blob/master/project/build.scala
  74. 74. Basic Configuration● Projectのルートディレクトリの直下 にbuild.sbt というファイルを作成し てその中に設定を記述● FullConfigurationとはちょっと記述 方法異なる
  75. 75. https://github.com/etorreborre/specs2/blob/1.5/specs2.sbt
  76. 76. Projectの設定ファイルについて どっちを使うべきなのか? どう使い分けるのか?● 基本的なことは、どっちでもできる● Basicのほうがちょっとだけ短く書ける● 複数プロジェクトを定義するなど、複雑なことをする場合 は、Full
  77. 77. SBTの内部DSLの文法的な仕組みの話
  78. 78. 一番良くつかうライブラリの 依存定義の構文val twitter4j = "org.twitter4j" % "twitter4j" % "2.2.4"
  79. 79. %ってなに・・・?(´・ω・`) 演算子?メソッド?
  80. 80. 以下のコードと等価sbt.toGroupID("org.twitter4j").%("twitter4j").%("2.2.4") https://github.com/harrah/xsbt/blob/0.10/ivy/DependencyBuilders.scala
  81. 81. sbt以前のScalaの文法の基礎知識● Scalaは、メソッド名に記号が使える● メソッドの引数が0または1つの場合、以下のよ うな記述が可能 obj.method(param) ⇓ obj method param
  82. 82. ※このスライドを書いた時点のsbt0.10系のソースを調べただけなので今後変わる可能性はあり ● sbtのpackage objectがsbt.impl.DependencyBuildersというtraitを継承して いて、そこにtoGroupIDというGroupIDを生成するimplicitなメソッドが定義して あります。 ● GroupIDには%という、Stringを引数にとって、 GroupArtifactIDを返すメソッド が定義してあります。 ● そして、GroupArtifactIDにも%というメソッドがあり、Stringを引数にとって、 sbt.ModuleIDを返すメソッドが定義されています ● さらに、ModuleIDにも%というメソッドがあり(ry
  83. 83. え?(´・ω・`)
  84. 84. ● もちろん、それらの文法的な意味を完全に把握している必要はな い● しかしsbtは、"sbtに慣れた人にとっての読みやすさ" をかなり追求● とても短く書ける反面、初心者にとってのわかりにくさ● ちょっと複雑なことをやる場合以下のようなスキルが必要かも ○ ある程度の基本的なScalaの知識 ○ sbtの英語のwikiをじっくり読む能力 or MLを調べる or MLで質問 する能力● 内部DSLとしての典型的な例● 他にもTupleに対するヘテロなリストへのimplicitな変換など、一見す ると、文法的にわかりにくいものが数点
  85. 85. Scalaとしての文法とか厳密な型が気になる人のための console-project というコマンド
  86. 86. Setting● sbtの0.10系で、基礎となる概念● これが完璧にわかれば、sbtを半分以上理解したと言っても過 言ではない(?)● そのあたりとか色々含めて、自身もsbtの0.10系使ってライブ ラリ作成しているeed3si9nさんがとてもわかりやすい解説書い てるので、読んだほうがいいよ ○ http://eed3si9n.com/ja/sbt-010-guide
  87. 87. プロジェクトのSettingとして定義されているもの● プロジェクト名、依存ライブラリ一覧、コンパイル時 引数、コンパイラプラグイン、Jvm引数、などなど ・・・
  88. 88. Settingに使う記号メソッド ェ・・・https://github.com/harrah/xsbt/wiki/Settings <<= := += ++= <+= <++= ~=
  89. 89. こいつらがわかりづらいけど 結構重要だから丁寧に一個づつ説明します(`・ω・´) 公式のwikiをなんとなく噛み砕いて説明するだけなので 英語をスラスラ読める人は直接読めばいいと思うよ(´・ω・`)
  90. 90. <<=The most general method is <<=. All other methods can be implemented in terms of <<=. <<= defines a setting using other settingsもっとも一般的なメソッドで、他のすべてのメソッドはこれを使って 実装することができる
  91. 91. 現在のlibraryDependenciesの定義を参照して、junitへの依存を追加した値を返し、それをlibraryDependenciesに代入libraryDependencies <<= libraryDependencies apply { (deps:Seq[ModuleID]) => deps :+ ("junit" % "junit" % "4.8" % "test")}
  92. 92. 文法的なポイント● libraryDependencies というものそのものは、SettingKey [Seq[ModuleID]] という型である● この変数自体はvalであり変更不可能● つまりlibraryDependenciesという変数そのものを単に上書きし ているわけではない● applyを呼ぶことによって、libraryDependenciesの中のSeq [ModuleID] という値の状態を参照できるイメージ● この仕組によって、 短く書けるかつ という型安全  仕組みを実現しているが、慣れないとかなりわかりづらい
  93. 93. :=:= is used to define a setting that overwrites anyprevious value without referring to other settings.:= は、他の設定値を参照せずに、値を上書きする場合 name := "My Project"
  94. 94. +=+= is used to define a setting that will append a singlevalue to the current sequence without referring to othersettings.他の設定値を参照せずに、Seq型のSettingに対して、値を一つ追加する場合
  95. 95. つまり以下の2つは全く同じ意味libraryDependencies <<= libraryDependenciesapply { (deps: Seq[ModuleID]) => deps :+ ("junit" % "junit" % "4.8" % "test")}libraryDependencies += "junit" % "junit" % "4.8" % "test"
  96. 96. ++=The related method ++= appends a sequence to the current sequence, also without using other settings(+=に関連する) ++= というメソッドは、現在のSequence にSequence を追加する。これもまた(+=と同じように)他の設定値は参照しない
  97. 97. 以下の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" )
  98. 98. <+=The <+= method is a hybrid of the += and <<= methods <+=メソッドは+=と<<=のハイブリッド
  99. 99. hybrid?(´・ω・`)
  100. 100. <<= は、現在の設定値を使用して、新しい設定値を作成+= は現在の設定値を使用せずに、1つだけ値を追加 ⇓<+= は現在の設定値を参照して、値を追加
  101. 101. ● 参照する値の型と、設定する型が異なってもいいというのがポ イントlibraryDependencies <+= scalaVersion( "org.scala-lang" %"scala-compiler" % _ ) ● 現在のプロジェクト自体のScalaのversionの値を参照して、それ に応じてscala-compilerへのJarの設定を作成したものを libraryDependenciesに追加するという意味 ● 言い換えれば、追加するscala-compilerのversionは、現在のプ ロジェクト自体のScalaのversionに依存して定義するということ
  102. 102. <++=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 <++=.
  103. 103. 今までのメソッドの命名規則から、なんとなく使い方想像つきませんか・・?(・ω・`)
  104. 104. ● 他の値を参照しつつ ● 複数の値を ● 追加するlibraryDependencies <++= scalaVersion { sv => ("org.scala-lang" % "scala-compiler" % sv) :: ("org.scala-lang" % "scala-swing" % sv) :: Nil }
  105. 105. ~=~= is used to transform the current value of a setting ~= は現在の値を変換
  106. 106. 現在のコンパイルオプションのSettingのSequenceから、"-Y"で始まるものだけを除去scalacOptions in Compile ~= { (options: Seq[String]) => options filterNot ( _ startsWith "-Y" )}
  107. 107. Taskという概念● settingはプロジェクトの初期化時に決まるが、タスクの値 は、プロジェクトを再読み込みしなくても生成できる● Taskの依存関係を定義できる● "あるTaskが失敗した場合" だけ実行するTaskとか定義で きる
  108. 108. Plugin https://github.com/harrah/xsbt/wiki/Pluginshttps://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 など
  109. 109. ところでsbtの(full configurationの)ファイルは 単なる Scalaのソースコード ⇓ じゃあとにかくコード読もうぜ!
  110. 110. コードを読みやすくするために 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
  111. 111. ● sourceGenerators っていうBuild時にコード生成 するための、マニアックな機能があるらしい(つまりメ タプロの機能?)● 実際にScalaz が、Build時コード生成とか変態的 なことをやってる(あとでコード読む?)● それを真似して、Build時にgithubにhttpのrequest 投げて、コード取得とかやってみた● http://bit.ly/pXaPfz
  112. 112. 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" )
  113. 113. browseの説明のつづき● 変数名やclass名が自動でhtmlのリンクになって、クリックでジャンプ!● 変数名やメソッドにマウスをかざすと、型の名前が表示される !● 作成しておいたlink情報を、ほかのsxr生成時にリンクする機能まであ る● Vimのタグジャンプファイル生成機能とか隠し機能(?)まであるっぽい んだけど、READMEになにも書いてなくて使い方わからないから誰か 試してよ!(´・ω・`) ○ https://github. com/harrah/browse/tree/master/src/main/scala/vim
  114. 114. まだまだsbtの機能としては色々あるんですが、 残り時間は、● 実際のProject設定ファイルのコー ドリーディング● デモしながら説明● 質問タイム 
  115. 115. おわりありがとうございました
  • behind-indra

    Aug. 4, 2015
  • dxhuy88

    Jun. 24, 2015
  • hiroakisengoku

    Jun. 10, 2014
  • fokizaki

    Mar. 19, 2014
  • esehara

    Nov. 24, 2013
  • suguruoho

    Oct. 30, 2013
  • tskuroino

    Oct. 28, 2013
  • 1643110

    Sep. 20, 2013
  • satooshi

    Mar. 25, 2013
  • pesblog

    Nov. 29, 2012
  • ursk

    Nov. 15, 2012
  • TokyoIncidents

    Nov. 13, 2012
  • kazufumiotani

    Oct. 21, 2012
  • freebase3a3k

    Sep. 10, 2012
  • EisukeKuwahata

    Aug. 21, 2012
  • choplin

    Jul. 20, 2012
  • masahitojp

    May. 14, 2012
  • ikeike443

    May. 14, 2012
  • takumakei

    Apr. 13, 2012
  • TakeshiWatanabe2

    Nov. 21, 2011

Views

Total views

13,434

On Slideshare

0

From embeds

0

Number of embeds

3,597

Actions

Downloads

53

Shares

0

Comments

0

Likes

27

×