Aujourd'hui je vais vous présenter comment créer un projet en scala.
Pour commencer nous avons besoin d'un IDE, d'un outil de compilation sympa et rapide et un peu de scala.
IDE : IntelliJ Idea
Après avoir très déçu par Netbeans (6.9) et après avoir lu que c'était pire sous Eclipse, j'ai installé Idea (9.0.4) et là j'ai trouvé un super IDE.
Installation
Pour installer Idea, cliquez sur le lien ci dessous et choisissez la
Community Edition (gratuit)
http://www.jetbrains.com/idea/download/
Ensuite je vous laisse le soin de l'installer suivant votre OS. Vous devrez surement spécifier le chemin du JDK_HOME
Configurer les raccourci clavier
Une fois démarré, si vous n'avez pas l'habitude des raccourci clavier de Idea, vous pouvez utiliser ceux de Netbeans ou d'Eclipse. Pour cela File -> Setting puis cliquez sur Keymap puis choisissez votre keymap préféré.
|
Choisir un keymap que l'on connait pour idea |
Installer le plugin Scala pour Idea
Toujours dans File -> Settings, choisissez Plugins, sélectionnez l'onglet avalaible et recherchez 'scala'. Puis enfin clique droit, Download and Install. Le plugin se télécharge, cliquez sur Apply et Idea redémarre.
|
Choisir le plugin scala pour Idea |
C'est bon vous être pret pour avec IntelliJ Idea. Mais maintenant pour avoir un super environnement de travail je vous conseil de continuer avec la suite.
Outil de compilation : Simple Build Tool
Simple Build Tool ou sbt est un outil de compilation à la maven et exclusivement pour scala.
Comme maven il s'occupe de télécharger sur Internet les dépendances de votre projet.
Mais contrairement à maven, la syntaxe n'est pas du XML mais du code Scala, bien plus concis et efficace.
Installation
Télécharger le jar (la version actuelle est 0.7.5-RC0)
et lancer sbt en appelant le jar de cette façon ( facile ;-) ):
java -jar ~/Téléchargements/sbt-launch-0.7.5-RC0.jar
Si vous souhaitez vous simplifiez la vie dans le futur, créez vous un petit script shell (ou bat pour windows)
Voici mon script sbt : /usr/local/bin/sbt
#!/bin/bash
java -Xmx1024M -jar ~/Téléchargement/sbt-launch-0.7.5-RC0.jar "$@"
Maintenant créez un nouveau dossier pour votre projet.
$ mkdir my-project
$ cd my-project
$ java -jar ~/Téléchargements/sbt-launch-0.7.5-RC0.jar
Project does not exist, create new project? (y/N/s)y
Name: my-project
Version [1.0]: (appuez sur Entrer, vous choisissez la version par défaut)
Scala version [2.7.9]: 2.8.1 (choisissez la dernière version)
Maintenant sbt va télécharger toute les librarires necessaire pour s’exécuter (dont la librairie scala, scalac, ... ça peut être utile quand même)
Une fois terminé, on vous propose de rester dans une sorte de shell. Bienvenu dans sbt.
Faites un Ctr + C pour sortir
Si vous appelez la commande tree (sudo apt-get install tree si vous ne l'avez pas) voici ce qui a été installé sur votre poste.
tree ~/tmp/my-project
.
|-- lib
|-- project
| |-- boot
| | |-- sbt.boot.lock
| | |-- scala-2.7.7
| | | |-- lib
| | | | |-- scala-compiler.jar
| | | | `-- scala-library.jar
| | | `-- org.scala-tools.sbt
| | | `-- sbt
| | | `-- 0.7.5.RC0
| | | |-- classpath_2.7.7-0.7.5.RC0.jar
| | | |-- compile_2.7.7-0.7.5.RC0.jar
| | | |-- compiler-interface-bin_2.7.7.final
| | | | `-- compiler-interface-bin-0.7.5.RC0.jar
| | | |-- compiler-interface-bin_2.8.0.final
| | | | `-- compiler-interface-bin-0.7.5.RC0.jar
| | | |-- compiler-interface-bin_2.8.1.final
| | | | `-- compiler-interface-bin-0.7.5.RC0.jar
| | | |-- compiler-interface-src
| | | | |-- compiler-interface-src-0.7.5.RC0.jar
| | | | `-- jline-0.9.94.jar
| | | |-- control_2.7.7-0.7.5.RC0.jar
| | | |-- io_2.7.7-0.7.5.RC0.jar
| | | |-- ivy-2.2.0.jar
| | | |-- ivy_2.7.7-0.7.5.RC0.jar
| | | |-- jsch-0.1.31.jar
| | | |-- launcher-interface-0.7.5.RC0.jar
| | | |-- sbt_2.7.7-0.7.5.RC0.jar
| | | |-- test-interface-0.5.jar
| | | `-- xsbti
| | | `-- interface-0.7.5.RC0.jar
| | |-- scala-2.8.1
| | | `-- lib
| | | |-- scala-compiler.jar
| | | `-- scala-library.jar
| | `-- update.log
| `-- build.properties
|-- src
| |-- main
| | |-- resources
| | `-- scala
| `-- test
| |-- resources
| `-- scala
`-- target
Le dossier project contient toute les dependances de votre projet.
Le dossier src contient les sources de votre projet.
Vous pourriez commencer à coder comme ça. Il vous suffirait de créer un fichier scala dans le repertoire src.
Puis dans sbt, vous exécuteriez la commande :
> compile
Maintenant si vous souhaitez allier la puissance de SBT avec Idea, suivez le guide.
Simple-Build-Tool + Idea
Il existe un super plugin pour SBT qui génère automatiquement un projet idea.
Sur ce site Internet, toute la démarche est expliqué, mais la voici en français.
Dans le répertoire project, créez le repertoire plugins, puis dans ce repertoire le fichier Plugins.scala
import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
val repo = "GH-pages repo" at "http://mpeltonen.github.com/maven/"
val idea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.1-SNAPSHOT"
}
Dans ce fichier scala nous configurons un nouveau repository maven :
Le code :
val repo = "GH-pages repo" at "http://mpeltonen.github.com/maven/"
Est equivalent au XML maven
<repositories>
<repository>
<id>GH-pages repo</id>
<url>http://mpeltonen.github.com/maven/>
</repository>
</repositories>
Le nom de la variable n'est pas important, si on a plusieurs repository on peut les appeler repo1, repo2, ...
Et une nouvelle dépendance maven.
Le code
val idea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.1-SNAPSHOT"
est équivalent au XML maven :
<dependency>
<groupId>com.github.mpeltonen</groupId>
<artifactId>sbt-idea-plugin</artifactId>
<version>0.1-SNAPSHOT</version>
</dependency>
Le nom de la variable n'a pas d'importance. Je l'ai appelé idea mais j'aurais pu également l'appeler patate.
On voit à quel point scala peut être concis.
Cette façon de gérer des dépendances maven n'est pas unique à sbt. On la retouve également dans ivy, gradle, grapes, buildr ...
Maintenant nous allons utiliser ce plugin dans notre projet sbt.
Dans le répertoire project, créez le reporte build, puis dans ce repertoire le fichier Project.scala
import sbt._
class Project(info: ProjectInfo) extends DefaultProject(info) with IdeaProject{
val scalatest = "org.scalatest" % "scalatest" % "1.2" % "test"
}
Je déclare une nouvelle classe Project héritant à la fois de la classe DefaultProject de sbt et d'une classe IdeaProject. La classe IdeaProject appartient au jar sbt-idea-plugin que nous avons déclaré en plugin. Cette classe sera téléchargée automatiquement par le mécanisme de dépendance.
Dans mon projet je déclare également un dépendance vers scalatest.
ScalaTest est un framework de test plus agréable à utiliser que JUnit.
Courage c'est bientôt la fin, maintenant il suffit d’exécuter les commandes ci dessous pour générer les fichiers idea.
> update
....
> idea
[info]
[info] == idea ==
[info] Created /home/romain/tmp/my-project/.idea
[info] Created /home/romain/tmp/my-project/project/sbt_project_definition.iml
[info] Created /home/romain/tmp/my-project/my-project.iml
[info] == idea ==
[success] Successful.
Félicitation, vous pouvez maintenant lancer idea et ouvrir votre projet avec.
PS : Si vous modifiez vos dépendances vous devrez exécutez de nouveau les commandes : update + idea, afin qu'Idea connaisse les librairies pour son auto-completion.
Un Hello World en Scala
Créez une classe simple possédant une fonction qui retourne le texte "Hello World" :
package my.project
class MyFirstScalaClass{
def helloWorld={
"Hello World"
}
}
Créez le test correspondant :
package my.project
import org.scalatest.matchers.ShouldMatchers
import org.scalatest.FunSuite
class MyFirstScalaClassSpec extends FunSuite with ShouldMatchers {
test("I describe here that my class should tell 'Hello World' when I ask it.") {
new MyFirstScalaClass().helloWorld should equal ("Hello World")
}
}
Et maintenant testez avec sbt :
> test
[info]
[info] == compile ==
[info] Source analysis: 0 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling main sources...
[info] Nothing to compile.
[info] Post-analysis: 1 classes.
[info] == compile ==
[info]
[info] == test-compile ==
[info] Source analysis: 1 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling test sources...
[info] Compilation successful.
[info] Post-analysis: 2 classes.
[info] == test-compile ==
[info]
[info] == copy-test-resources ==
[info] == copy-test-resources ==
[info]
[info] == copy-resources ==
[info] == copy-resources ==
[info]
[info] == test-start ==
[info] == test-start ==
[info]
[info] == my.project.MyFirstScalaClassSpec ==
[info] Test Starting: I describe here that my class should tell 'Hello World' when I ask it.
[info] Test Passed: I describe here that my class should tell 'Hello World' when I ask it.
[info] == my.project.MyFirstScalaClassSpec ==
[info]
[info] == test-complete ==
[info] == test-complete ==
[info]
[info] == test-finish ==
[info] Passed: : Total 1, Failed 0, Errors 0, Passed 1, Skipped 0
[info]
[info] All tests PASSED.
[info] == test-finish ==
[info]
[info] == Test cleanup 1 ==
[info] Deleting directory /tmp/sbt_2f6b2318
[info] == Test cleanup 1 ==
[info]
[info] == test-cleanup ==
[info] == test-cleanup ==
[info]
[info] == test ==
[info] == test ==
[success] Successful.
[info]
[info] Total time: 6 s, completed 7 déc. 2010 21:54:19
>
Ca marche !!!!!
Pour allez plus loin je vous conseil de lire :