Generar Instalable del Catálogo
Necesitamos una instalación que haga estos pasos:
- Instalar la aplicación (el exe y las dll).
- Instalar .net 2.0 si no está en el equipo.
- Instalar SQL Server Express y crear una instancia.
- Restaurar la base de datos de los catálogos sobre la instancia de SQL instalada.
- Copiar la carpeta de imágenes del catálogo.
- Además, hay que dar permisos al usuario para SQL: incluirlo en el nuevo grupo SQLUser.
Una primera aproximación fue Clickonce, usando la opción Publicar de los proyectos de Visual Studio 2005. Esto nos permitía en un único paso instalar .net 2.0, SQL Express y la aplicación, pero no controla la restauración de la base de datos ni de la carpeta imágenes (salvo que se quiera incluir en la carpeta de la aplicación). El problema con Clickonce es que sólo instala lo que se incluye en el proyecto, por lo que tendríamos que incluir los 100 Mb de imágenes. Y que por defecto se instala en la ruta de Archivos de programa, y para que no sea así puede cambiarse una etiqueta <TargetPath> en el proyecto. Esto tiene 2 inconvenientes: hay que modificar la etiqueta para todas las imágenes una a una, y por otro lado no puede definirse una ruta basada en las carpetas del sistema. Este segundo problema es más grave, ya que hemos decidido incluir las imágenes en la carpeta de datos de programa común a todos los usuarios (All users en XP, Public en Vista), en Datos de programa\Nibisoft\N2Frax\Imagenes.
La solución adoptada pasa por un proyecto de Setup de Visual Studio 2005, tal como ya hicimos en los catálogos anteriores, pero ampliado.
En primer lugar, incluimos los prerrequisitos de la aplicación: .net 2.0, SqlExpress, MDAC 2.8, Informes de Visual Studio (por si acaso). Además pedimos que se incluyan con la instalación, es decir, que no haya que descargarlos de Internet. Esto nos incluye una carpeta para cada uno, aportando unos 70 Mb, pero permitirá acelerar la instalación, y no pensamos instalar desde Internet sino desde un disco (CD).
Añadimos también las imágenes, en una nueva carpeta creada en Datos de programa de Todos los usuarios. Esta carpeta no se ofrece en el Sistema de archivos del Setup, en cambio sí se ofrece Datos de programa del Usuario. Pero descubrí que se puede cambiar en el archivo de proyecto del Setup, sustituyendo AppDataFolder por CommonAppDataFolder. En Visual Studio se sigue mostrando como título que la carpeta es del usuario, pero al guardar de nuevo respeta el Common..., y al instalar sí usa All users.
Para instalar la BD sobre la nueva instancia instalada de SQL Express (o una anterior si ya existía), utilizo acciones personalizadas en la instalación (custom actions). En primer lugar, incluyo un archivo bak con la copia de seguridad de la base de datos en el Setup, situándolo en la misma carpeta anterior de All users. Para restaurar la base de datos, añado una clase Installer (Instalador.cs) en el proyecto del catálogo (exe), en la que sobreescribo el método Install. En un principio usé el método Commit, pero me parece más lógico hacerlo en Install después de llamar al base para que realice la instalación de los archivos (y copie el archivo .bak en su destino). Además el Commit me dio un fallo, que aunque encontré la solución me convenció aún más de usar el Install. Otra diferencia está en que durante el Install se ofrece disponible al usuario el botón Cancelar para abortar la instalación, mientras que durante el Commit se deshabilita. En ese método Install utilicé nuestra librería AdministradorBD para restaurar (tras hacerle algunos cambios para que funcionara sin pivotar, en modo local, y con distintos nombres lógicos y de base de datos, aunque esto precisa una discusión mayor).
En este punto nos encontramos con el problema de que aunque SQL Express se había instalado correctamente, el usuario actual no tenía permisos para conectarse, por lo que no podíamos restaurar la base de datos. Así que como primer paso del método Install en la nueva clase Instalador incluimos al usuario actual (Enviroment.UserName) en el grupo creado para SQLUser. Para hacer esto sobre el sistema local (no sobre AD - ActiveDirectory), utilizamos el espacio de nombres System.DirectoryServices, pero con la raíz WinNT: que identifica el sistema local. No me funcionó usando la propiedad member, y sí con invoke al método Add. Por supuesto el usuario debe tener permisos para hacer esto, pero estamos instalando la aplicación, ¿no?
Así tenemos un Setup en condiciones que podemos distribuir en un disco (son 180 Mb con las imágenes y los prerrequisitos, lo que es la aplicación son unos 3 Mb).
Etiquetas: setup

0 Comments:
Publicar un comentario
<< Home