Your SlideShare is downloading. ×
0
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
scala-kaigi1-sbt
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
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

scala-kaigi1-sbt

10,968

Published on

4 Comments
26 Likes
Statistics
Notes
  • 12枚目

    公式のリポジトリはこっち
    https://github.com/sbt/sbt
    ドキュメントはこっち
    http://www.scala-sbt.org/
    に移りました
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 80ページ目もリンク切れェ・・・unfilteredは、こっちに移動しました

    https://github.com/unfiltered/unfiltered
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • 48枚目のリンク切れてて、wikiがリニューアルされてます

    https://github.com/harrah/xsbt/wiki/Getting-Started-Setup

    同じく48枚目の、日本語訳についても、Setup以外も訳されたものがあるので、こっち読んだほうがいいと思う

    http://eed3si9n.github.com/sbt-getting-started-guide-ja/
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • すでに 0.11.0 release されてて、一部情報古くなってますよ(´・ω・`)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
10,968
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
49
Comments
4
Likes
26
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×