Creación de un proyecto Lift con SBT e IntelliJ Idea Community Edition (usando Git o Mercurial)
Voy a tratar de escribir un pequeño instructivo de como iniciar y poner a punto un proyecto Liftweb usando sbt e IntelliJ Idea, usando postgres como DBMS y Squeryl Record como ORM.
Lo primero que debemos hacer es bajarnos la última versión de Liftweb 2.4-M5 una vez descargada, procedemos a descompromirla y veremos que existen 2 carpetas: scala_28 y scala_29 que son las que contienen las distintas variantes de proyectos base con las que podemos iniciar un proyecto nuevo según la versión de Scala que queramos usar, scala_28 para Scala 2.8 y scala_29 para Scala 2.9. En este caso vamos a usar Scala 2.9 asi que ingresamos a la carpeta scala_29.
Dentro de la carpeta scala_29, tenemos nuevamente varias carpetas:
- lift_basic: contiene una clase User, y algunas hojas de estilo, y html5
- lift_blank: es un proyecto vacio, contiene lo esencial, nada de hojas de estilo ni html(a parte del index y los templates base de lift)
- lift_mvc: es para aquellos que quieren usar el patrón MVC en lugar de View First
- lift_xhtml: igual que lift_basic solo que este usa xhtml
En nuestro caso crearemos un proyecto usando lift_blank.
- Creamos un directorio para nuestro proyecto(en este caso liftidea):
- Copiamos los archivos de la carpeta lift_blank a nuestro nuevo proyecto
- Iniciamos el nuevo repositorio con hg init o git init segun sea la herramienta que queramos usar, en este caso vamos a usar mercurial(hg).
- Y agregamos los archivos al proyecto con hg add
- Hacemos un commit a nuestro repositorio local con hg commit -u usuario -m "Commit inicial"
j2@luthien:~$ mkdir liftidea j2@luthien:~$ cp -r lift/scala_29/lift_blank/* liftidea/ j2@luthien:~$ cd liftidea/ j2@luthien:~$ hg init j2@luthien:~$ hg add j2@luthien:~$ hg commit -u usuario -m "Commit inicial"
Seguidamente creamos un archivo .hgignore con el siguiente contenido:
# use glob syntax. syntax: glob *.ser *.class *~ *.bak *.off *.old .DS_Store project/boot/* project/plugins/lib_managed/* project/plugins/project/* project/plugins/src_managed/* project/plugins/target/* # logs derby.log # eclipse conf file .settings .classpath .project .manager # building target build null tmp* dist test-output # sbt target lib_managed src_managed */project/boot */*/project/boot # db lift_proto* # other scm .svn .CVS .hg* # switch to regexp syntax. # syntax: regexp # ^\.pc/ # IntelliJ *.iml *.ipr *.iws .idea # Pax Runner (for easy OSGi launching) runner
Posteriormente debemos editar el archivo project/build/LiftProject.scala, primero hacemos que la clase del proyecto herede de IdeaProject, esto lo hacemos poniendo with IdeaProject justo después de extends DefaultWebProject(info) y antecitos del { , posteriormente agregamos las siguientes lineas justo despues de la linea que dice lazy val JavaNet...:
val lift_postgresql = "postgresql" % "postgresql" % "8.4-701.jdbc4"
override def managedStyle = ManagedStyle.Maven
override def jettyWebappPath = webappPath
override def scanDirectories = Nil
Las tres últimas lineas son importantes porque permiten que cuando ejecutemos el proyecto desde sbt, los cambios a los archivos estáticos:html, css, js, imágenes sean reflejados en la aplicación que se ejecuta sin tener que reiniciar la ejecución de la aplicación(con lo que solo será necesario reiniciar la aplicación cuando cambiemos cosas en el código Scala). En el mismo archivo dentro del método libraryDependencies justo despues de la línea:
"net.liftweb" %% "lift-webkit" % liftVersion.value.toString % "compile",
Agregamos:
"net.liftweb" %% "lift-record" % liftVersion.value.toString % "compile", "net.liftweb" %% "lift-squeryl-record" % liftVersion.value.toString % "compile",
A continuación creamos un archivo llamado Plugins.scala dentro de project/plugins, que nos sirve para poder generar un archivo de configuración para Idea a partir de nuestro proyecto sbt, el contenido del archivo es el que sigue:
import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
val sbtIdeaRepo = "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"
val sbtIdea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.4.0"
}
El siguiente archivo a editar(aunque no es necesario, me imagino que la mayoria lo hará) es: project/build.properties, este archivo contiene el nombre de la organización a la que pertence el proyecto, el nombre del proyecto, la versión del proyecto y otros datos relativos a Sbt, Lift y Scala.
Una vez editados todos estos archivos, procedemos a ejecutar sbt, hacer un update y crear los archivos de configuración para IntelliJ Ide con el comando idea dentro de la consolta sbt:
j2@luthien:~/liftidea$ ./sbt ... > update ... > idea
Esto genera un archivo .iml dentro de la carpeta raiz del proyecto, con este archivo generado ejecutamos Idea, una vez en Idea nos vamos a File > Open project, y seleccionamos la carpeta donde creamos nuestro proyecto(se puede ver que esa carpeta sale con el loguito de IntelliJ Idea), va a tardar un poco en importar el proyecto.(Nota: deben tener instalados los plugins de sbt y scala para IntelliJ Idea antes de importar el proyecto). Debido a que estamos usando la versión Comunnity Idea de IntelliJ va a salir un mensaje que dice Error Loading Project, Cannot load facet.., hacemos click en details, y le damos click a yes(esto eliminara este facet del proyecto).
Lo siguiente que necesitamos es configurar o crear una configuración de ejecución de Idea para eso nos vamos a: Run > Edit configurations, hacemos click en el + -Add New Configuration (Insertar)-, selecionamos Scala console, le asignamos un nombre(name), tickeamos Run Sbt Action, hacemos click en los puntos suspensivos, y escribimos jetty dentro de la caja de texto que aparece, hacemos nuevamente click en Ok, click en Apply, click en Ok.
Una vez se cierre el dialogo de configuración, para ejecutar la aplicación hacemos click en la flechita verde (Run) o presionamos Mayúsculas + F10, podemos ver que abajo en las consolas inferiores la pestaña que dice Sbt empieza a mostrar algo, una vez muestre:
[info] Waiting... (press any key to interrupt)
Significa que todo esta bien, en caso contrario en algo nos hemos equivocado :p, si todo esta bien vamos al navegador y escribimos http://localhost:8080, y veremos ya la aplicacion Lift ejecutandose, claro bien feita pues no tiene nada :p todavia.
PD: las lineas del archivo .hgignore no deben tener espacios delante, si no no ignorara los archivos temporales o que no tienen nada que ver con el proyecto en si.
Notas extra de aclaracion:
- El proyecto no posee los templates html (default.html) adecuados para trabajar con html5, por lo que hay que cambiar a uso de selectores css los binds de este archivo y agregar el soporte de html5 en el archivo Boot.scala
