2008-11-10 22 views
36

He estado pensando en rodar mi propio código para permitir que mi aplicación Delphi se actualice sin problemas, ya que voy a ir por la mentalidad de "liberar a menudo, liberar pronto". Existen varias soluciones Delphi (tanto gratuitas como de pago) y me gustaría preguntar si ha estado usando alguna de ellas o simplemente ha seguido con sus propias soluciones en esta área. Cualquier comentario sobre el tema de actualización automática es bienvenido.Delphi: ¿Cómo se actualizan automáticamente sus aplicaciones?

Respuesta

13

Hace años escribí una herramienta simple que se inicia en lugar del programa real, busca actualizaciones, las carga y las instala (si hay alguna disponible), y finalmente inicia la aplicación real.

Sin embargo, hay problemas con este enfoque si su programa funciona en un entorno administrado correctamente, donde los usuarios normalmente no tienen acceso de escritura a los directorios del programa. Ya no puede simplemente actualizar su propio programa en dichos entornos. Es por eso que en la actualidad muchos programas vienen con su propia herramienta de actualización, que se puede instalar para ejecutar con permisos elevados, de modo que las actualizaciones del programa se pueden aplicar aunque solo los usuarios estándar inicien sesión en el sistema.

Tiene que decidir si se puede suponer que su público objetivo se ejecuta en cuentas de usuario o administrador, o si tendrá que tratar con los problemas mencionados anteriormente. Con Vista las cosas se pusieron considerablemente más difíciles.

Con todos estos problemas (acceso de red sobre proxies, permisos de escritura faltantes para directorios de instalación, la necesidad de actualizar archivos que el actualizador está utilizando, por nombrar algunos) No volvería a intentar codificar esto en mi propio. Mucho mejor para comprobar si alguna de las soluciones disponibles hace todo lo que necesita.

4

Normalmente utilizamos la herramienta de terceros. Pero en algunas situaciones no era utilizable, así que creé una solución propia, que era bastante estándar:

  • Obtenga xml (o cualquier otro formato) con información de actualización.
  • Si se publican archivos más recientes, descárguelos e instálelos.
6

Creé mi propia solución también basada en Indy para la descarga y http://sourceforge.net/projects/makeupdate/ para el parcheo de archivos. Antes de eso, he usado y probado varias herramientas comerciales, pero nadie estaba haciendo exactamente lo que necesitaba.

7

Utilizo las rutinas Synapse GetHTTP para devolver un recurso específico, y si se encuentra, consulte con el sistema local para ver si es necesaria una actualización. Si es así, el recurso me dice qué página voy a iniciar y lanzo la URL al shell para que se muestre el navegador preferido de los usuarios .

La mayoría de las veces, la descarga es un programa de instalación creado por InnoSetup que actualiza el sistema y la base de datos de los usuarios a la última versión. Cuando se necesita una nueva actualización "pagada", entonces envío al usuario a un formulario de "actualización de compra". Mis recursos web son páginas ASP, por lo que puedo redireccionar a un recurso diferente según el número de versión del cliente.

Para la aplicación principal (nuestra aplicación tiene una pieza de servidor y un cliente) Tengo un cargador que verificará el servidor para ver si la versión del archivo de cliente en el servidor es diferente a la versión del cliente ... si es así, indica al usuario si el usuario desea actualizar/revertir. Elegimos avisar al usuario, ya que a veces un error accidental podría ingresar al sistema y el usuario tiene que degradar/actualizar solo las máquinas específicas para ayudar a solucionar los problemas. Mantengo un registro de la base de datos con la versión mínima requerida que se actualiza a través del parche de la base de datos, por lo que si se debe retirar una versión, el registro se actualiza en consecuencia.

17

Cualquiera que sea el esquema que utilice, puede ser útil saber que realmente puede cambiar el nombre de un archivo .exe en ejecución. Así que cambie el nombre del archivo, copie en un nuevo archivo y funcione bien. Y la próxima vez que alguien lance el programa lanzarán una nueva versión. Esto es, por supuesto, muy útil en el entorno en el que muchos usuarios ejecutan el mismo archivo .exe, como en los casos de uso compartido de citrix/servidor de terminal/red.

4

Yo uso TWebUpdate. Funciona bien y tiene un montón de opciones interesantes, pero la documentación no es tan buena y me encontré con algunos problemas, por lo que descargo un instalador completo, en lugar de solo los archivos ...

Lo haré estar atento a esta pregunta, por cierto ...

+0

utilizo TWebUpdate, también. Stg lo dice todo, funciona, pero los documentos podrían ser mucho mejor. Sin embargo, el soporte en línea a través de sus grupos de noticias y correos electrónicos de soporte es bueno. Es lo suficientemente barato como para poder probarlo y ver si es lo suficientemente bueno mientras agrega otras funciones. – GuyWithDogs

5

Yo uso TmxWebUpdate. Es gratis, simple y le da un buen control sobre el proceso. En realidad, soy el propietario de TMS Component Pack con TWebUpdate, pero nunca encontré una buena razón para cambiar.

Editar: Enlace actualiza

+0

el enlace está roto. – none

+0

Puede obtenerlo aquí: http://www.torry.net/authorsmore.php?id=3079 – Mick

1

Igual que "STG" y "GuyWithDogs", estoy usando TWebUpdate de TMS. Aunque la documentación no es tan buena, no es tan difícil de aprender.

Con TWebUpdate, tiene algunas opciones sobre el protocolo que utiliza, podría hacerse a través de HTTP, FTP o acceso a la red.

Para la capa de comunicación, TWebUpdate usa WinInet. En algunas máquinas, el caché de URL de Windows/IE puede ser frustrante, así que he agregado una rutina para borrar la dirección del servidor de actualización automática del caché primero para garantizar que la información recopilada del servidor esté actualizada.

4

Hicimos nuestra también. Realmente no es muy difícil.

Nuestro proceso es algo como:

  • Cuando se inicia la aplicación principal, se comprueba (mediante funcs de la biblioteca sinapsis) si hay una actualización disponible (asumiendo su configurado para comprobar, por supuesto).

  • En caso afirmativo, notifica al usuario y le pregunta si desea actualizar.

  • Si lo hacen, inicia un .exe de actualización y cierra la aplicación principal.

  • El actualizador exe descarga los nuevos archivos según el contenido de un archivo de texto que recupera, manteniendo los archivos en la memoria.

  • Cuando el programa de actualización finaliza la descarga de todo correctamente, guarda los archivos descargados en el disco y hace una copia de seguridad de los archivos que reemplaza. De esta forma, si la descarga se interrumpe, no terminará con la mitad de los archivos instalados.

  • Finalmente, vuelve a abrir la aplicación principal y se cierra solo.

El truco con Vista es que necesita tener una entrada en el manifiesto del programa de actualización para forzarlo a ejecutar con derechos de administrador.

4

usamos nuestra propia solución que sigue estos pasos:

  1. aplicación se conecta al recurso HTTP y el archivo de descargas de información (archivo de texto ini) a la memoria, comprueba el número de versión de la versión más reciente.
  2. Si hay una versión más nueva disponible, la aplicación descarga el paquete binario comprimido a la ubicación del exe.
  3. Cuando finaliza la descarga, se solicita al usuario que reinicie la aplicación.
  4. Al inicio, la aplicación comprueba la presencia del paquete de actualización
  5. La aplicación extrae los contenidos del paquete (generalmente un nuevo exe de aplicación, pero también recursos adicionales, por ejemplo, archivos de idioma actualizados, etc.). antiguo archivo a un nombre temporal primero, luego extrae el nuevo archivo. Si el proceso falla en algún punto, los archivos temporales se restauran.
  6. Cuando termina, la aplicación ejecuta el nuevo exe y se cierra solo.

No se necesita un programa de actualización adicional, el administrador de aplicaciones puede manejarlo solo.

Para el paquete comprimido utilizamos nuestro propio generador de actualizaciones. El paquete contiene un índice de archivos con un hash de archivo, carpeta de destino (ruta relativa al exe principal) y los archivos comprimidos. Durante la actualización, comparamos el hash almacenado con el archivo extraído para detectar archivos corruptos.

Con Vista veo dos soluciones que permiten a cuentas de usuario estándar para actualizar los archivos de aplicaciones realidad:

  1. Configure su configuración para cambiar los permisos del directorio de instalación de programas. De esta forma, los archivos de "C: \ Archivos de programa (x86) \ Su empresa \ Usted aplicación" se pueden modificar en Cuentas con derechos limitados.

    código de ejemplo para InnoSetup sería:

    [Dirs] 
    Name: "{app}"; Permissions: users-modify 
    
  2. instalar archivos que va a actualizar a la carpeta Datos de programa en lugar del directorio definido por el usuario y utilizar este directorio como un directorio override. Si existen archivos en ProgramData, utilícelos; de lo contrario, compruebe en el directorio de instalación.

    código InnoSetup:

    [Files] 
    Source: "C:\Your Project\YourApp.exe"; DestDir: "{commonappdata}\Company Name\App Name\"; 
    
+0

Solo para obtener información, las configuraciones de Inno tienen una opción de línea de comando/DIR = "" que se puede usar para anular DestDir - Utilizo esto cuando ejecuto una instalación Inno descargada y reemplazo con la carpeta donde la aplicación está realmente instalada. – Stuart

+1

Otorgar derechos a los usuarios para modificar archivos en el directorio "Archivos de programa" (o sus subcarpetas) es un ** PROBLEMA DE SEGURIDAD MUY GRANDE **. Si el usuario se infecta, cualquier virus en nombre del usuario puede modificar el código de su programa. –

+0

Es mejor: 1) crear un usuario local con una contraseña compleja, dedicada a la actualización (solo su actualizador debe conocer esta contraseña, es decir,¡nadie más debería poder iniciar sesión con el usuario!); 2) otorgarle a este usuario los derechos para modificar el contenido de la carpeta de su programa; 2) crear el actualizador como un servicio; 3) configurar el servicio para ejecutar como el usuario dedicado; –

Cuestiones relacionadas