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.481 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

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

Keine Downloads
Aufrufe
Aufrufe insgesamt
1.481
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
33
Aktionen
Geteilt
0
Downloads
1
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

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

×