Durante el desarrollo de proyectos de software, ya sea para Internet o aplicaciones de escritorio, es práctica habitual la utilización de librerías externas, ya sean propias o de terceros, que encapsulan funcionalidades comunes, o simplemente reutilizan código ya desarrollado.

El problema

Hasta ahora, teníamos dos opciones:

  • Librerías de terceros: descargar la librería del autor (o el código fuente y compilarlo) y copiarla en una carpeta local desde la que se referenciaba en el proyecto.

En este caso, además de la posible configuración manual que cada librería puede llevar, y de sus propias dependencias (NHibernate, por ejemplo), la reutilización de la misma en diversos proyectos solía llevar en una duplicidad de librerías, que además dificultaba la actualización posterior a nuevas versiones.

  • Librerías propias: las primeras veces, empiezas como con una librería de terceros, pero al final, acabábamos incluyendo el proyecto de la librería en la solución de .Net del proyecto completo para facilitar las actualizaciones.

En este caso, el problema lo encontramos por un lado en el control de versiones, ya que cada librería suele tener su propio repositorio de Subversion diferente al del proyecto final, en el gran número de proyectos que componen la solución y en la mezcla de tareas de diferentes programadores que trabajan en diferentes librerías, pero que se interfieren en la misma solución.

La solución

Para solucionar estos problemas, Microsoft está desarrollando Nuget, un gestor de paquetes de código abierto que pretende simplificar la incorporación y mantenimiento de librerías de terceros, o propias en una aplicación .Net.

Básicamente Nuget se compone de 3 piezas:

  1. El repositorio de paquetes: lugar centralizado donde se localizan las librerías y sus actualizaciones para su instalación en los proyectos. El repositorio público está en http://www.nuget.org/List/Packages
  2. Los paquetes: mediante un archivo XML podemos definir el contenido de nuestro paquete, e incluso, modificar los archivos de configuración de la solución o ejecutar scripts de Powershell durante la instalación. Dispone de una herramienta para la creación automatizada tanto del archivo de especificación a partir del proyecto, como del paquete en sí: nuget.exe.
  3. El gestor de paquetes: es la extensión de Visual Studio que nos permitirá navegar por el repositorio de paquetes, instalarlos, actualizarlos o desinstalarlos. Para instalarla: http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c

Adicionalmente, se acaba de publicar una aplicación que nos permite explorar el contenido de un paquete, local o remoto: Nuget Package Explorer

Su utilización

La utilización principal de Nuget es para instalar librerías de terceros que se encuentren en el repositorio público. El site de desarrollo del proyecto cuenta con una documentación muy buena (en inglés) para explicar:

También se incluye en la documentación los pasos para crear nuestros propios paquetes, o para utilizar un repositorio local para nuestros propios paquetes, sin necesidad de publicarlos en el repositorio público.

Además de la propia documentación, son sitios de referencia también los blogs de los propios desarrolladores involucrados en Nuget:

Phil Haack (@haacked): http://haacked.com/tags/NuGet/default.aspx
David Ebbo (@davidebbo): http://blog.davidebbo.com/search/label/NuGet

Conclusiones

Nuget nos simplifica la tarea de instalar y mantener actualizadas las librerías de terceros que usamos en nuestras aplicaciones, automatizando el proceso y manteniendo un repositorio centralizado de las mismas.

Además, nos permite crear nuestros propios paquetes, que pueden incluir las librerías propiamente dichas, contenido estático, código fuente, transformaciones para archivos de configuración o ejecutar scripts de powershell que realicen tareas sobre la solución.

En futuros posts, veremos un ejemplo de cómo montar un repositorio local de Nuget, y publicaremos en él un paquete de ejemplo que usaremos en otro proyecto.

Desde hace más de diez años, venimos desarrollando aplicaciones web utilizando tecnologías de Microsoft, por lo que hemos pasado por ASP classic, ASP.NET 2 con Web Forms y Rest Services con WCF y .NET 3.5.

Recientemente, hemos empezado a desarrollar un proyecto de tamaño considerable y con poco tiempo de desarrollo, por lo que nos planteamos la mejor tecnología a utilizar, teniendo en mente el objetivo de maximizar la reutilización de componentes de código, y la separación entre el desarrollo del backend y el frontend, para aprovechar la especialización de los miembros del equipo.

Estas premisas iniciales nos llevaron a probar el framework MVC de ASP.NET, justo recién salida la versión 3. Como con toda tecnología o framework que se utiliza por primera vez, existe una curva de aprendizaje y de adopción de buenas prácticas que tienes que asumir como inversión, si quieres que el medio plazo la productividad del desarrollo se dispare.

Después de casi 2 meses de investigaciones, pruebas varias, discusiones y marcha atrás en algunos aspectos del diseño de la aplicación, os dejo una recopilación de enlaces que nos han servido para adoptar buenas prácticas y para implementar técnicas que han mejorado, o lo harán, el desarrollo de cualquier aplicación web.

Formación MVC

Por supuesto, empezamos por el principio, la formación:

Blogs de referencia:

Desarrollando con MVC

Una vez hemos pasado el periodo inicial de formación, o si bien ya teníamos experiencia con MVC, aquí comparto una serie de herramientas que se han vuelto imprescindibles en el desarrollo del día a día y que mejoran notablemente la productividad y mantenimiento de la aplicación:

  1. T4MVC: Esta librería nos crea automáticamente clases tipadas que eliminan la necesidad de utilizar literales de cadena para acceder a nuestras vistas, controladores, acciones y recursos estáticos.

Por ejemplo, en lugar de

podemos utilizar

Lo que además significa que tenemos IntelliSense incluido, con lo que la productividad se incrementa. La lista completa de funcionalidades la podemos encontrar en http://mvccontrib.codeplex.com/wikipage?title=T4MVC_doc&referringTitle=T4MVC

  • Con T4MVC tenemos acceso a nuestros recursos con IntelliSense, pero cada vez que añadimos un nuevo elemento, tenemos que volver a ejecutar la plantilla para que genere las nuevas clases que añamos incluido. Para evitar esto y que se generen automáticamente, instalamos una extensión para Visual Studio llamada Chirpy.Este plugin (que sirve para otras cosas interesantes, que no usamos, pero que merece la pena que investiguéis) se integra directamente con T4MVC y permite que se ejecute automáticamente en cada build que hagamos. Además, permite ejecutar cualquier template T4 propio que podamos tener.

Optimizando la aplicación web MVC

Normalmente, las aplicaciones se suelen desarrollar sin tener en cuenta desde el inicio las posibles optimizaciones que se deben realizar para aumentar el rendimiento de la misma, teniendo que ir modificándola a posteriori conforme van apareciendo los problemas.

El mejor resumen de técnicas de optimización para sitios web podría ser el elaborado por Yahoo: http://developer.yahoo.com/performance/rules.html, que además viene acompañado por una utilidad que nos permitirá comprobar estas reglas en nuestro sitio web: http://developer.yahoo.com/yslow/

También es interesante echarle un ojo a PageSpeed de Google, que también nos proporciona una herramienta para mejorar el rendimiento de nuestra aplicación.

A continuación os muestro algunas librerías que utilizamos para optimizar nuestras aplicaciones y aplicar las reglas anteriores, y que se integran muy bien con el desarrollo de MVC desde el inicio, por lo que es muy recomendable tenerlas en cuenta.

  1. Utiliza CDNs para acceder a frameworks generalistas (como JQuery).

Tanto Google como Microsoft disponen de un CDN que aloja algunos de los frameworks de javascript más comunes. Se recomienda utilizarlos para liberar peticiones HTTP de nuestro servidor y porque si el usuario ha visitado otra web que también use el CDN, ya tendrá el archivo cacheado en el navegador.

  • Combres: Esta librería integra minimización, compresión, combinación y cacheo de archivos JS y CSS. Permite, por tanto, reducir el ancho de banda utilizado por nuestros archivos de script y css, y reducir las peticiones HTTP que recibe nuestro servidor. Más detalles en http://www.codeproject.com/KB/aspnet/combres2.aspx. Otra ventaja incluida indirectamente es que, al centralizar las referencias a librerías de JS y de CSS, nos permite cambiar un archivo por otro en un único punto de la aplicación (p. ej. cambiar la versión de JQuery), y no tener que modificar todas las páginas que lo referencian.

    Combres también permite utilizar recursos externos, por lo que podemos (y debemos) cargar los scripts del CDN y que Combres los minimice y combine con los nuestros propios.

  • ASP.NET Sprite and Image Optimization: Utilizar Sprites para servir las imágenes de la aplicación. Esta librería se encarga de generar automáticamente archivos de Sprites de imágenes a partir de las imágenes de nuestra aplicación, y decide, en función del navegador del usuario, cuál es la mejor manera de servir cada imagen.

Optimizaciones en el servidor IIS

A nivel de IIS, lo más importante es configurarlo correctamente  para habilitar la compresión de las respuestas y la caché en nuestra aplicación.

  1. Configuración de la compresión de la respuesta con Gzip: http://www.iis.net/ConfigReference/system.webServer/httpCompression
  2. Configuración de la caché de respuesta: http://www.iis.net/ConfigReference/system.webServer/caching