lunes, 10 de junio de 2013

Ejecutar ASP.Net MVC 4 en Ubuntu

mono works on my machineEl proyecto mono de Miguel de Icaza hace que podamos usar .net en máquinas no windows. Desgraciadamente las últimas versiones de mono que permiten ejecutar el framework 4 de .net no están disponibles en los repositorios de la mayoría de distribuciones populares de linux. En el momento de escribir estas líneas las la versión 3.0.10 está disponible únicamente para Windows, Mac Osx y Open Suse.
En este post voy a indicar los pasos que realicé para hacer funcionar Asp.Net MVC 4 en mi Ubuntu 12.04 LTS.
Antes de empezar es necesario instalar git y las herramientas básicas para compilar
~$ sudo apt-get install build-essential git autoconf 
~$ libtool automake
Después creamos un directorio en el home para guardar los fuentes.
~$ mkdir ~/monosources
~$ cd monosources
Consulto en el sitio de mono de github los pasos para compilar. En las instrucciones se indica que para tener soporte del namespace System.Drawing es necesario la librería libgdiplus. Con la versión de esta librería que está en el repositorio de ubuntu no he sido capaz de hacer funcionar System.Drawing. Así que decido ir a su sitio en github y compilarlo. Así que descargo los fuentes y coloco los fuentes en el último tag
~/monosources$ git clone https://github.com/mono/libgdiplus.git
~/monosources$ cd libgdiplus
~/monosources/libgdiplus$ git checkout 2.10.8
Ahora instalaremos las librería necesarias para compilar libgdipplus.
~/monosources/libgdiplus$ sudo apt-get install libglib2.0-dev libjpeg-dev libpng12-dev libgif-dev libexif-dev libx11-dev libxrender-dev libfreetype6-dev libfontconfig1-dev
Descubro que en los respositorios de Ubuntu 12.04 no está disponible la librería libtiff5-dev, que es necesaria para el proyecto. En versiones posteriores (como la 12.10) sí que lo está y se puede instalar con apt-get, de la misma forma con la que se instalaron el resto de librerías en el paso anterior. Estas cosas no pasan con Windows, busco ayuda y lo comento con Pedro, que es el que sabe de estas cosas. Me dice que compile e instale la librería de forma manual y me manda un correo donde me indica de dónde bajarme los fuentes, así que me pongo manos a la obra
~/monosources/libgdiplus$ cd ..
~/monosources$ wget http://download.osgeo.org/libtiff/tiff-4.0.3.tar.gz 
~/monosources$ tar zxvf tiff-4.0.3.tar.gz
~/monosources$ cd tiff-4.0.3
~/monosources/tiff-4.0.3$ ./configure
Antes de compilar la librería con el script autogen indico la ruta donde se instalará la librería. Después compilo e instalo
~/monosources/tiff-4.0.3$ ./autogen.sh --prefix=/usr/local
~/monosources/tiff-4.0.3$ make
~/monosources/tiff-4.0.3$ sudo make install
Con las dependencias instaladas vuelvo al directorio de los fuentes de libgdiplus, y repito la operación anterior: configuro la ruta de instalación, compilo e instalo
~/monosources/tiff-4.0.3$ cd ..
~/monosources$ cd libgdiplus
~/monosources/libgdiplus$ ./autogen.sh --prefix=/usr/local
~/monosources/libgdiplus$ make
~/monosources/libgdiplus$ sudo make install
Vuelvo al directorio anterior, es hora de bajar mono y compilar la versión 3.0.10
~/monosources/libgdiplus$ cd ..
~/monosources$ git clone https://github.com/mono/mono.git
~/monosources$ cd mono
~/monosources/mono$ git checkout mono-3.0.10
Por tercera vez indico la ruta de instalación
~/monosources/mono$ ./autogen.sh --prefix=/usr/local
Una cosa que me resultó chocante es que para compilar mono es necesario un compilador de mono. En los fuentes de mono ya incluyen un pequeño compilador (monolite) para montar para poder compilar todo el proyecto.
~/monosources/mono$ make get-monolite-latest
Para hacer el make de mono debemos indicarle dónde encontrar el compilado monolite, eso se hace con el parámetro EXTERNAL_MCS. Una vez compilado se instala mono
~/monosources/mono$ make EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/gmcs.exe
~/monosources/mono$ sudo make install
Ya tengo mono en ubuntu, pero necesito un servidor para ejecutar mi sitio ASP.NET. Para eso voy a utilizar el servidor XSP, un pequeño servidor de desarrollo. Vuelvo a monosources  y clonamo el repositorio de github y me coloco en el tag 3.0.11 que en el momento de escribir estas líneas es el último, configuramos la ruta de instalación y compilamos
~/monosources/mono$ cd..
~/monosources$ git clone https://github.com/mono/xsp.git
~/monosources$ cd xsp
~/monosources/xsp$ git checkout 3.0.11
~/monosources/xsp$ ./autogen.sh --prefix=/usr/local
~/monosources/xsp$ make
~/monosources/xsp$ sudo make install

Listo, con esto ya puedo servir paginas Asp.Net, lo único que tengo que hacer es situarme en el directorio donde tenga un sitio web de .net y ejecutar el comando xsp4. Esto montará un servidor web que responderá desde el puerto 8080.

Cosas a tener en cuenta, aunque la versión de mono compilada soporta el framework 4.5, el servicor xsp solo soporta framework 4 así que recuerda indicar esta versión del framework en los proyectos del Visual Studio que compiles para ejecutar desde mono. Por otro lado ten en cuenta que mono solo interpreta dlls manejadas, no nativas, por lo que hay que tener cuidado con las referencias que se añaden al proyecto o puede que no funcionen en mono.

Para probar yo monté una aplicación Asp.Net vacía, de esta forma minimizo las referencias a dlls y añadí un HomeController con una action Index que devuelve una vista. Y funciona perfectamente.

Espero que os resulte útil. De vez en cuando, aunque seas un programador de .net, no está mal salir de windows y ver lo que se hace por el mundo de linux y demás sistemas operativos. Y si con mono podemos ejecutar nuestro código .net mejor que mejor.

No hay comentarios:

Publicar un comentario