Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Einfacher bauen SBT im Vergleich zu Ant, Maven & Co. Joachim Hofer imbus AG „ Zeige mir, wie du baust, und ich sage dir, w...
Kurzvorstellung <ul><li>10 Jahre Teamleiter Softwareentwicklung
10 Jahre  zu viel  Erfahrung mit Enterprise Java
Schwerpunkte Softwaretest und Code Coverage
Scala-Enthusiast
Autor von  eCobertura   (schlechte EclEmma-Konkurrenz)
Autor diverser  sbt-Plugins </li><ul><li>findbugs4sbt
cobertura4sbt
cpd4sbt </li></ul></ul>
Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
Moderne Alternativen: Buildr, Gradle, sbt
Umbruch: sbt 0.7.x vs sbt 0.10.x
Einstieg in sbt
Anpassen von sbt
Erweitern von sbt
Fazit </li></ul>
Fahrplan <ul><li>„ Historische“ Wurzeln </li><ul><li>make
Ant
Maven </li></ul><li>Moderne Alternativen: Buildr, Gradle, sbt
Umbruch: sbt 0.7.x vs sbt 0.10.x
Einstieg in sbt
Anpassen von sbt
Erweitern von sbt
Fazit </li></ul>
„Historische“ Wurzeln (0):  make <ul>Aaaaargh! </ul>
„Historische“ Wurzeln (1):  Ant <ul><li>„Another Neat Tool“ </li><ul><li>James Duncan Davidson, 1999 </li></ul><li>XML-bas...
JVM als Engine
große Bibliothek an Tasks
keine  Vorgaben bzgl Projektstruktur
kein  Dependency Management </li><ul><li>üblicherweise: Ergänzung durch Ivy </li></ul></ul>
„Historische“ Wurzeln (2):  Maven <ul><li>„Accumulator of Knowledge“, seit 2003
wie Ant:  </li><ul><li>XML-basiert (oder: Polyglot Maven)
JVM als Engine
große Bibliothek an Tasks </li></ul><li>aber: </li><ul><li>strikt deklarativ
Convention over Configuration
eigenes Dependency Management </li></ul></ul>
Intermezzo: XML ist doof! <ul><li>Buildfiles sollen  lesbar  sein </li><ul><li>XML ist zu verbos
deklarative Alternativen: YAML, JSON </li></ul><li>Builds sind  Skripte </li><ul><li>Overhead für deklarative Builds hoch
Domain-Specific Language (DSL) für Builds
Skriptsprachen </li></ul></ul>„ It's not meant to be a nice language for humans“ – Steve Loughran (über Ant)
Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
Moderne Alternativen </li><ul><li>Buildr
Nächste SlideShare
Wird geladen in …5
×

Einfacher bauen

1.583 Aufrufe

Veröffentlicht am

Das "Simple Build Tool" - Vergleich, Einstieg, Anpassung und Plug-ins

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Einfacher bauen

  1. 1. Einfacher bauen SBT im Vergleich zu Ant, Maven & Co. Joachim Hofer imbus AG „ Zeige mir, wie du baust, und ich sage dir, wer du bist.“ – Christian Morgenstern
  2. 2. Kurzvorstellung <ul><li>10 Jahre Teamleiter Softwareentwicklung
  3. 3. 10 Jahre zu viel Erfahrung mit Enterprise Java
  4. 4. Schwerpunkte Softwaretest und Code Coverage
  5. 5. Scala-Enthusiast
  6. 6. Autor von eCobertura (schlechte EclEmma-Konkurrenz)
  7. 7. Autor diverser sbt-Plugins </li><ul><li>findbugs4sbt
  8. 8. cobertura4sbt
  9. 9. cpd4sbt </li></ul></ul>
  10. 10. Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
  11. 11. Moderne Alternativen: Buildr, Gradle, sbt
  12. 12. Umbruch: sbt 0.7.x vs sbt 0.10.x
  13. 13. Einstieg in sbt
  14. 14. Anpassen von sbt
  15. 15. Erweitern von sbt
  16. 16. Fazit </li></ul>
  17. 17. Fahrplan <ul><li>„ Historische“ Wurzeln </li><ul><li>make
  18. 18. Ant
  19. 19. Maven </li></ul><li>Moderne Alternativen: Buildr, Gradle, sbt
  20. 20. Umbruch: sbt 0.7.x vs sbt 0.10.x
  21. 21. Einstieg in sbt
  22. 22. Anpassen von sbt
  23. 23. Erweitern von sbt
  24. 24. Fazit </li></ul>
  25. 25. „Historische“ Wurzeln (0): make <ul>Aaaaargh! </ul>
  26. 26. „Historische“ Wurzeln (1): Ant <ul><li>„Another Neat Tool“ </li><ul><li>James Duncan Davidson, 1999 </li></ul><li>XML-basiert
  27. 27. JVM als Engine
  28. 28. große Bibliothek an Tasks
  29. 29. keine Vorgaben bzgl Projektstruktur
  30. 30. kein Dependency Management </li><ul><li>üblicherweise: Ergänzung durch Ivy </li></ul></ul>
  31. 31. „Historische“ Wurzeln (2): Maven <ul><li>„Accumulator of Knowledge“, seit 2003
  32. 32. wie Ant: </li><ul><li>XML-basiert (oder: Polyglot Maven)
  33. 33. JVM als Engine
  34. 34. große Bibliothek an Tasks </li></ul><li>aber: </li><ul><li>strikt deklarativ
  35. 35. Convention over Configuration
  36. 36. eigenes Dependency Management </li></ul></ul>
  37. 37. Intermezzo: XML ist doof! <ul><li>Buildfiles sollen lesbar sein </li><ul><li>XML ist zu verbos
  38. 38. deklarative Alternativen: YAML, JSON </li></ul><li>Builds sind Skripte </li><ul><li>Overhead für deklarative Builds hoch
  39. 39. Domain-Specific Language (DSL) für Builds
  40. 40. Skriptsprachen </li></ul></ul>„ It's not meant to be a nice language for humans“ – Steve Loughran (über Ant)
  41. 41. Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
  42. 42. Moderne Alternativen </li><ul><li>Buildr
  43. 43. Gradle
  44. 44. sbt </li></ul><li>Umbruch: sbt 0.7.x vs sbt 0.10.x
  45. 45. Einstieg in sbt
  46. 46. Anpassen von sbt
  47. 47. Erweitern von sbt
  48. 48. Fazit </li></ul>
  49. 49. <ul>Moderne Alternativen (1): Buildr </ul><ul><li>seit 2007
  50. 50. wie Maven
  51. 51. aber: Ruby als Build-DSL
  52. 52. gute Scala-Unterstützung
  53. 53. gute Dokumentation </li></ul>
  54. 54. <ul>Moderne Alternativen (2): Gradle </ul><ul><li>seit 2008, JVM-basiert
  55. 55. wie Maven
  56. 56. aber: Groovy als Build-DSL
  57. 57. gute Dokumentation </li></ul>„ I can honestly say if someone had shown me the Programming in Scala book by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy.“ – James Strachan
  58. 58. <ul>Moderne Alternativen (3): sbt </ul><ul><li>„Simple Build Tool“, seit 2008, von Mark Harrah
  59. 59. wie Maven
  60. 60. aber: Scala als Build-DSL
  61. 61. sehr gute Scala-Unterstützung
  62. 62. (bisher) mäßige Dokumentation
  63. 63. interaktiver Modus
  64. 64. Bestandteil des Typesafe-Stacks </li></ul>
  65. 65. Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
  66. 66. Moderne Alternativen: Buildr, Gradle, sbt
  67. 67. Umbruch: sbt 0.7.x vs sbt 0.10.x </li><ul><li>sbt 0.7.x
  68. 68. sbt 0.10.x: Der Umbruch
  69. 69. sbt 0.10.x: Die Änderungen </li></ul><li>Einstieg in sbt
  70. 70. Anpassen von sbt
  71. 71. Erweitern von sbt
  72. 72. Fazit </li></ul>
  73. 73. <ul>sbt 0.7.x – der Anfang </ul><ul><li>Fokus auf Einfachheit </li><ul><li>einfach bedienbar
  74. 74. (relativ) einfach gemacht </li></ul><li>Build-Definition in Scala </li><ul><li>-> project/build/Project.scala </li></ul></ul>
  75. 75. <ul>sbt 0.7.x – die Probleme </ul><ul><li>wenig DSL-Elemente (viele override s, val s)
  76. 76. Dependencies werden pro Projekt heruntergeladen
  77. 77. Build-Engine intern </li><ul><li>objektorientiert
  78. 78. basierend auf Traits </li></ul></ul>
  79. 79. <ul>sbt 0.10.x (1): Der Umbruch </ul><ul><li>Umstellung 2010/2011
  80. 80. erster Release (0.10.0) am 2. Juni 2011
  81. 81. -> Vergessen Sie alles, was Sie über sbt wissen!
  82. 82. -> Schreiben Sie all Ihre Buildskripte neu!
  83. 83. -> Schreiben Sie all Ihre Plug-ins neu!
  84. 84. Lohnt sich das denn? </li></ul>
  85. 85. <ul>sbt 0.10.x (2): Die Änderungen </ul><ul><li>Build-Definition weniger versteckt </li><ul><li>build.sbt (einfache Builds)
  86. 86. oder: project/Build.scala (komplexe Builds) </li></ul><li>etwas mehr DSL-Elemente
  87. 87. Build-Engine intern </li><ul><li>funktional
  88. 88. eigenes Settings-Framework </li></ul><li>-> leider nicht mehr ganz so einfach </li></ul>
  89. 89. Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
  90. 90. Moderne Alternativen: Buildr, Gradle, sbt
  91. 91. Umbruch: sbt 0.7.x vs sbt 0.10.x
  92. 92. Einstieg in sbt
  93. 93. Anpassen von sbt
  94. 94. Erweitern von sbt
  95. 95. Fazit </li></ul>
  96. 96. Fahrplan – Einstieg in sbt <ul><li>Dokumentation
  97. 97. Installation
  98. 98. Erstes Projekt
  99. 99. Beispiel-Settings
  100. 100. Zuweisungs-Syntax
  101. 101. Befehle
  102. 102. Testen
  103. 103. Tipps & Tricks </li></ul>
  104. 104. <ul>Einstieg in sbt (1): Dokumentation </ul><ul><li>Projekt harrah/ xsbt auf GitHub: </li><ul><li>Wiki
  105. 105. API-Dokumentation
  106. 106. Quelltexte , speziell Keys.scala </li></ul><li>Mailing-Liste via Google Groups
  107. 107. Interaktive Hilfe: </li><ul><li>help
  108. 108. tasks
  109. 109. commands </li></ul></ul>
  110. 110. <ul>Einstieg in sbt (2): Installation </ul><ul><li>Download von sbt-launch.jar
  111. 111. Schreiben eines Aufruf-Skripts
  112. 112. keine gesonderte Scala-Installation nötig </li></ul>
  113. 113. <ul>Einstieg in sbt (3): Erstes Projekt </ul><ul><li>sbt im Projektverzeichnis
  114. 114. Setzen der Projekteigenschaften </li><ul><li>interaktiv: set und session save
  115. 115. per build.sbt </li></ul></ul>
  116. 116. <ul>Einstieg in sbt (4): Beispiel-Settings </ul><ul><li>Beispiele für Projekteigenschaften </li><ul><li>Basisinformationen: name , version , organization
  117. 117. Scala-Version: scalaVersion
  118. 118. Abhängigkeiten: libraryDependencies , resolvers
  119. 119. konfigurations- bzw taskabhängig: </li><ul><li>parallelExecution in Test
  120. 120. logLevel in compile
  121. 121. publishArtifact in (Compile, packageDoc) </li></ul></ul></ul>
  122. 122. <ul>Einstieg in sbt (5): Zuweisungs-Syntax </ul><ul><li>einfache Zuweisung: := </li><ul><li>name := „FirstProject“ </li></ul><li>Hinzufügen zu Listen: += und ++= </li><ul><li>scalacOptions += &quot;-deprecation&quot;
  123. 123. javacOptions ++= Seq( &quot;-source&quot;, &quot;1.5&quot;, &quot;-target&quot;, &quot;1.5&quot;) </li></ul><li>Bezugnehmen auf existierende Settings: Präfix mit < </li><ul><li>libraryDependencies <+= scalaVersion( &quot;org.scala-lang&quot; % &quot;scala-compiler&quot; % _ )
  124. 124. watchSources <+= baseDirectory map { _ / &quot;input&quot; } </li></ul></ul>
  125. 125. <ul>Einstieg in sbt (6): Befehle </ul><ul><li>übliche den Stages entsprechende Befehle: </li><ul><li>update , clean , compile , test , package , publish etc </li></ul><li>mehrere Befehle hintereinander: </li><ul><li>; reload ; update ; compile </li></ul><li>durch Quelltextänderung getriggert: </li><ul><li>~ test </li></ul></ul>
  126. 126. <ul>Einstieg in sbt (7): Testen </ul><ul><li>Java – Einbinden von JUnit: </li><ul><ul><li>&quot;com.novocode&quot; % &quot;junit-interface&quot; % &quot;0.6&quot; % &quot;test&quot;
  127. 127. Testklassen nach src/test/java </li></ul></ul><li>Scala – Specs: </li><ul><li>&quot;org.specs2&quot; %% &quot;specs2&quot; % &quot;1.6&quot; % &quot;test&quot;
  128. 128. Spezifikationen nach src/test/scala
  129. 129. zusätzliche Optionen siehe zB asflierl/eulersolutions </li></ul><li>Laufen lassen zB mit </li><ul><li>test
  130. 130. test-only <Klasse>
  131. 131. ~test </li></ul></ul>
  132. 132. <ul>Einstieg in sbt (8): Tipps & Tricks (1) </ul><ul><li>Interaktiv arbeiten! </li><ul><li>Startup-Zeiten vermeiden </li><ul><li>JVM
  133. 133. Scala-Compiler </li></ul><li>getriggerten Compile/Test nutzen
  134. 134. aber: </li><ul><li>hierzu Classunloading einschalten, PermSize erhöhen
  135. 135. -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m </li></ul></ul></ul>
  136. 136. <ul>Einstieg in sbt (9): Tipps & Tricks (2) </ul><ul><li>console-project für REPL in Buildumgebung
  137. 137. inspect zeigt Zusammenhänge
  138. 138. ivy-Home setzen: -Dsbt.ivy.home=/my/ivy/home </li></ul>
  139. 139. Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
  140. 140. Moderne Alternativen: Buildr, Gradle, sbt
  141. 141. Umbruch: sbt 0.7.x vs sbt 0.10.x
  142. 142. Einstieg in sbt
  143. 143. Anpassen von sbt </li><ul><li>Build-Definition in Scala
  144. 144. Plug-ins (Auswahl)
  145. 145. Plug-ins einbinden </li></ul><li>Erweitern von sbt
  146. 146. Fazit </li></ul>
  147. 147. <ul>Anpassen von sbt (1): Build in Scala </ul><ul><li>Rahmen schaffen </li><ul><li>object MyBuild extends Build </li></ul><li>Projekt definieren </li><ul><li>lazy val project = Project( &quot;name&quot;, file(&quot;.&quot;), settings = mySettings) </li></ul><li>Settings einbinden </li><ul><li>val mySettings = Defaults.defaultSettings ++ Seq ( organization := buildOrganization, version := buildVersion, libraryDependencies ++= myDependencies, ...) </li></ul><li>ggf eigene Anpassungen vornehmen </li></ul>
  148. 148. <ul>Anpassen von sbt (2): Plug-ins (Auswahl) </ul><ul><li>IDE-Integration: IDEA, NetBeans, Eclipse
  149. 149. Web-Plugins: Webstart, GWT, CloudBees...
  150. 150. Code Coverage: Cobertura, SCCT
  151. 151. Statische Analyse: FindBugs (nur Java), CPD
  152. 152. Sonstiges: Android, Cucumber, Growl, LWJGL...
  153. 153. siehe Plugin-Übersicht im Wiki
  154. 154. täglich (naja) werden es mehr... </li></ul>
  155. 155. <ul>Anpassen von sbt (3): Plug-ins einbinden </ul><ul><li>Abhängigkeit einfügen (evtl auch Resolver) </li><ul><li>libraryDependencies += &quot;com.github.retronym&quot; %% &quot;sbt-xjc&quot; % &quot;0.3&quot;
  156. 156. globale Plug-ins in ~/.sbt/plugins/build.sbt
  157. 157. projektlokale Plug-ins in project/plugins/build.sbt </li></ul><li>ggf Settings importieren </li><ul><li>seq(findbugsSettings : _*) </li></ul></ul>
  158. 158. Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
  159. 159. Moderne Alternativen: Buildr, Gradle, sbt
  160. 160. Umbruch: sbt 0.7.x vs sbt 0.10.x
  161. 161. Einstieg in sbt
  162. 162. Anpassen von sbt
  163. 163. Erweitern von sbt </li><ul><li>Grundlagen zu Plug-ins
  164. 164. Command Plug-ins
  165. 165. Task Plug-ins </li></ul><li>Fazit </li></ul>
  166. 166. <ul>Erweitern (1): Grundlagen zu Plug-ins </ul><ul><li>minimal: eingebundene JAR </li><ul><li>manuell in project/plugins/lib oder via Ivy </li></ul><li>„echte“ Plug-ins </li><ul><li>in build.sbt : „ sbtPlugin := true “
  167. 167. abgeleitet von sbt.Plugin
  168. 168. können Settings definieren </li></ul></ul>
  169. 169. <ul>Erweitern (2): Grundlagen – Plugin-Arten </ul><ul><li>Command Plug-ins </li><ul><li>definieren zusätzliche Befehle (zB „ eclipse “) </li></ul><li>Task Plug-ins </li><ul><li>definieren zusätzliche Build Tasks (zB „ instrument-code “) </li></ul></ul>
  170. 170. <ul>Erweitern (3): Command Plug-ins </ul><ul><li>Aufgebaut aus: </li><ul><li>Action: val action: (State, T) => State = ...
  171. 171. Parser: val parser: State => Parser[T] = ...
  172. 172. Command: val command: Command = Command(&quot;name&quot;)(parser)(action) </li></ul><li>Command definieren: </li><ul><li>def hello = Command.command(&quot;hello&quot;) { state => println(&quot;Hi!&quot;); state } </li></ul><li>Command zu bestehenden commands hinzufügen: </li><ul><li>override lazy val settings = Seq(commands += hello) </li></ul><li>Beispiel: typesafehub / sbteclipse </li></ul>
  173. 173. <ul>Erweitern (4): Task Plug-ins </ul><ul><li>Task(schlüssel) deklarieren: </li><ul><li>val hello = TaskKey[Unit](&quot;hello&quot;, &quot;<Task Description>&quot;) </li></ul><li>Task definieren: </li><ul><li>def helloTask = { println(&quot;Hello World&quot;) } </li></ul><li>Task einbinden: </li><ul><li>override lazy val settings = Seq(hello := helloTask) </li></ul><li>Task mit Abhängigkeiten: </li><ul><li>hello <<= hello dependsOn otherTask </li></ul><li>Task mit Settings: </li><ul><li>private def someTask = { (baseDirectory, name) map { (baseDir, name) => doSomething(baseDir, name) } } </li></ul></ul>
  174. 174. Fahrplan <ul><li>„Historische“ Wurzeln: make, Ant, Maven
  175. 175. Moderne Alternativen: Buildr, Gradle, sbt
  176. 176. Umbruch: sbt 0.7.x vs sbt 0.10.x
  177. 177. Einstieg in sbt
  178. 178. Anpassen von sbt
  179. 179. Erweitern von sbt
  180. 180. Fazit </li></ul>
  181. 181. <ul>Fazit zu sbt (1) </ul><ul><li>aus Java-Sicht: sbt ist Magie, Finger weg! </li><ul><li>-> Pragmatic Programmer – „Lerne jedes Jahr eine neue Programmiersprache!“ </li></ul><li>mit Scala-Kenntnissen eine gute Alternative
  182. 182. für Scala-Projekte klar gesetzt </li></ul>
  183. 183. <ul>Fazit zu sbt (2) </ul><ul><li>nicht mehr ganz „simple“
  184. 184. Änderungsrate noch hoch
  185. 185. es bleibt spannend: sbt 0.11.x ist bereits auf dem Weg </li><ul><li>Scala 2.9.1 (statt 2.8.1) als Basis für den Build
  186. 186. besserer Bezug Plugin-Version ↔ sbt-Version
  187. 187. ??? </li></ul></ul>
  188. 188. Vielen Dank! Joachim Hofer @johofer imbus AG
  189. 189. Spezialisierter Lösungsanbieter für Software-Qualitätssicherung und Software-Test Innovativ seit 1992 Erfahrung und Know-how aus über 3.000 erfolgreichen Projekten 180 Mitarbeiter an vier Standorten in Deutschland Beratung, Test-Services, Training, Tools, Datenqualität Für den gesamten Software-Lebenszyklus www.imbus.de imbus AG

×