2008-10-24 10 views
54

Muchos programas incluyen un auto-updater, donde el programa ocasionalmente busca actualizaciones en línea, y luego descarga y aplica las actualizaciones que se encuentran. Los errores del programa son fijos, los archivos de soporte se modifican y las cosas (por lo general) se mejoran.¿Cómo debo implementar un auto-updater?

Desafortunadamente, no importa cuánto me mire, no puedo encontrar información sobre este proceso en ninguna parte. Parece que los auto-updaters que se han implementado han sido propietarios o no se han considerado importantes.

Parece bastante fácil implementar el sistema que busca actualizaciones en una red y las descarga si están disponibles. Esa parte del auto-updater cambiará significativamente de implementación a implementación. La pregunta es ¿cuáles son los diferentes enfoques de aplicando parches? ¿Simplemente descargando archivos y reemplazando los viejos por otros nuevos, ejecutando un script de migración que se descargó, mono parcheando partes del sistema, etc.? Se prefieren los conceptos, pero se apreciarán los ejemplos en Java, C, Python, Ruby, Lisp, etc.

+2

He estado buscando en google [omaha] (http://code.google.com/p/omaha/). Podría ser algo para ver si todavía está interesado (4 años después ...) – funseiki

Respuesta

45

Creo que el "agnóstico del idioma" va a ser un factor limitador aquí. Las aplicaciones vienen en tantas formas y tamaños que no hay una respuesta única para todos. Implementé varios auto-updaters en varios idiomas, y no dos fueron similares.

La filosofía más general es que la aplicación comprueba con una ubicación particular (dirección web, consulta web, ubicación de red corporativa, etc.) para preguntar si su versión es actual o preguntar cuál es la versión más reciente. Si la respuesta requiere una actualización, ese proceso será diferente para cada situación.

Una alternativa popular es invitar a la ubicación de inicio a ejecutar un script cuando se inicia la aplicación. La secuencia de comandos puede verificar la versión, descargar actualizaciones si es necesario y solicitar comentarios de uso, por ejemplo.

Probablemente podamos ayudarlo mejor si reduce los parámetros.

ACTUALIZACIÓN: El enfoque de "aplicación de parches" también depende de la naturaleza de la aplicación, y aquí hay una gran diversidad. Si tiene un solo archivo ejecutable, por ejemplo, entonces probablemente sea más práctico reemplazar el ejecutable. Si su aplicación tiene muchos archivos, debe buscar maneras de minimizar la cantidad de archivos reemplazados. Si su aplicación está altamente personalizada o parametrizada, debe esforzarse por minimizar el esfuerzo de re-sastrería. Si su aplicación emplea un código interpretado (como una aplicación Excel VBA o la aplicación MS Access MDB), entonces es posible que pueda reemplazar partes del código. En una aplicación Java, es posible que solo necesite reemplazar un archivo JAR o incluso un subconjunto del contenido JAR. También deberá tener una forma de reconocer la versión actual del cliente y actualizarla adecuadamente. Podría seguir y seguir, pero espero que vea mi punto acerca de la diversidad. Esta es una de esas muchas veces en que la mejor respuesta generalmente comienza con "¡Bueno, depende ...!" Es por eso que muchas respuestas incluyen "Por favor, reduzca los parámetros".

2

El enfoque más simple sería hacer que su programa consulte un servidor (sitio web) para ver si hay una actualización. Si hay una actualización, puede mostrar un mensaje al usuario que le pide que descargue una versión más nueva y proporciona un enlace.

Una solución alternativa y más compleja sería crear un pequeño servicio de Windows (o unix daemon) que verifica periódicamente si hay actualizaciones, este servicio puede descargar la actualización y ejecutar el instalador.

La arquitectura general es que tiene un servidor central que usted controla que conoce la última versión y dónde obtenerla. Luego los programas consultan el servidor. No incluiré código de muestra porque es muy demandado en el servidor y el formato que elija.Aunque no es terriblemente difícil.

+0

La pregunta que estaba buscando (he editado la pregunta para reflejar esto) es cómo se aplican los parches? – num1

8

Primero necesita un archivo en el sitio web de su aplicación con la última versión. La mejor manera que tengo de tener una tabla SQL especial para esta tarea y rellenarla automáticamente después de publicar una nueva versión/finalización de construcción nocturna. Su aplicación crea un nuevo hilo que solicita un enlace HTTP integrado con la versión y se compara con el actual. En el uso de .NET pueden utilizar código como el siguiente:

Version GetLatestVersion() { 
HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(new Uri(new Uri(http://example.net), "version.txt)); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
if (request.HaveResponse) 
{ 
    StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.Default); 
    return new Version(stream.ReadLine()); 
} 
else 
{ 
    return null; 
} 
} 

Version latest = GetLatestVersion(); 
Version current = new Version(Application.ProductVersion); 
if (current < latest) 
{ 
    // you need an update 
} 
else 
{ 
    // you are up-to-date 
} 

En este ejemplo, version.php en una sola cadena de llanura como 1.0.1.0.

Otro consejo que le puedo dar: cómo descargar una actualización. Me gusta mucho la próxima idea: en los recursos de su aplicación hay una cadena de código CLR que compila sobre la marcha (usando CodeDom) en una carpeta temporal, la aplicación principal la llama y se cierra. El actualizador lee argumentos, configuraciones o registro y descarga nuevos módulos. Y llama a la aplicación principal que borra todos los archivos temporales. ¡Hecho!

(Pero todo lo que aquí se trata de .NET)

18

Asegúrese de considerar también las implicaciones de seguridad de succión por la información acerca de la actualización, así como los propios binarios de actualización.

¿Confía en la fuente de la descarga? Tal vez llames a casa para obtener tu actualización, pero ¿qué ocurre si hay un hombre en el medio que redirige a un servidor malicioso? Una conexión segura HTTPS o similar ayudará, pero se recomienda verificar dos veces los bits que eventualmente se descargan mediante el uso de una verificación de firma digital.

0

En una configuración Java-Webstart inicia un archivo JNLP que luego activa la descarga de los archivos Jar necesarios para ejecutar la aplicación. Cada vez que webstart comprueba si hay versiones más nuevas de los Jars y los descarga reemplazando los almacenados en caché localmente. Con una herramienta llamada jardiff creará solo diffs hacia los nuevos jar y los distribuirá a través del servidor (por ejemplo, solo obtendrá una actualización).

Pros:

  • siempre al día

Contras:

  • necesita un servidor de aplicaciones (Tomcat, JBoss) con el fin de distribuir los archivos
  • se necesita una conexión a Internet para obtener la aplicación
+0

Solo señalando que solo necesita un servidor web para distribuir los JAR. Tomcat es uno de esos servidores y también implementa la especificación de servlet. –

2

Esto no es tanto una respuesta completa, sino más bien un ejemplo de mecanismo de actualización automática que implementé recientemente. La situación es un poco diferente de la aplicación de usuario tradicional tipo Firefox, ya que era una herramienta interna utilizada en el trabajo.

Básicamente, es una pequeña secuencia de comandos que gestiona una cola de ramas de Subversion para ser construidas y empaquetadas en un instalador. Lee un pequeño archivo, donde se escriben los nombres de las ramas, toma el primero, lo vuelve a escribir al final del archivo e inicia el proceso de compilación, lo que implica llamar a un conjunto de scripts. La configuración de cada rama para compilar está escrita en un archivo .INI, almacenado en un repositorio de Subversion junto con la herramienta misma.

Como esta herramienta se ejecuta en varias computadoras, quería una forma de actualizarla automáticamente en todas las máquinas tan pronto como realice un cambio en la herramienta en sí o en las secuencias de comandos de configuración.

La forma en que lo implementé fue simple: cuando lance la herramienta, se convierte en una "capa exterior". Esta capa exterior hace 2 cosas muy simples:

  • svn update sobre sí mismo y sobre los archivos de configuración
  • lanzamiento en sí, esta vez como la "cáscara interior", el que realmente maneja una configuración (y cierra todas las aplicaciones de nuevo).

Este sencillo sistema de actualización de mí mismo en un bucle nos ha servido muy bien durante unos meses. Es muy elegante, porque es autónomo: el auto-updater es el programa en sí. Debido a que "shell externo" (la parte de auto-updater) es tan simple, no importa que no se beneficie de las actualizaciones como el "shell interno" (que se ejecuta desde el archivo fuente actualizado cada vez).

+0

Para su información, Metasploit también usa "svn update" para el proceso de actualización. –

5

Las soluciones más simples (utilizadas por muchos programas) son ejecutar el desinstalador para la versión anterior y ejecutar el instalador para la nueva (opcionalmente omitiendo las preguntas que el usuario ya ha respondido, como el EULA). La única pega es que la nueva versión debe poder leer las opciones de configuración de la versión anterior.

Además, en Windows no puede eliminar un archivo ejecutable que esté en uso, por lo que probablemente desee colocar un pequeño ejecutable en la carpeta Temp, que ejecuta todo el proceso y luego eliminarlo al final de la instancia de la nueva versión que se lanzó (o solo register it to be deleted at the next reboot).

+12

si bien no puede eliminar un EXE en uso, puede cambiarle el nombre; haga que la instancia en ejecución cambie el nombre, muestre la nueva versión y haga que verifique la existencia de la versión anterior renombrada en el siguiente inicio y elimínela. –

+0

Guau, ¡eso es increíble! ¡Gracias por el consejo! –

0

La lectura de la respuesta de Carl Seleborgs me dio algunas ideas de cómo podría ser útil un repositorio de códigos genérico.

svn viene con una herramienta llamada svnsync, que se comporta como una exportación de svn pero realiza un seguimiento de la revisión real en la que se encuentra su exportación.

Alguien podría utilizar este sistema para obtener solo los archivos cambiados de la revisión real de los usuarios.

En la actualidad, tendrá un repositorio con los binarios compilados, y ejecutar svnsync solo obtendrá los archivos binarios que se han modificado. También podría fusionar los cambios locales en archivos de configuración basados ​​en texto con nuevas opciones de configuración.

0

La función de instalar un parche en un programa es básicamente una de las funciones básicas de un instalador. El software de instalación está documentado en numerosos lugares, pero generalmente por instalador: existe el Microsoft Installer (con Install Shield Extensions), Ruby gems, Java .jar archivos, los diversos sistemas de gestión de paquetes de Linux (RPM, Apt-get) y otros.

Todos estos son sistemas complejos que resuelven el problema del programa de parches en general, pero para sistemas ligeramente diferentes. Para decidir qué es lo mejor para usted, considere a cuál de estos sistemas su aplicación se parece más. Rodar por su cuenta está bien, pero mirar estos sistemas es un buen lugar para comenzar.

1

Como la actualización automática es un escenario común, la mayoría de los idiomas tienen al menos un paquete disponible para admitir esto.(A continuación incluyo algunos de los paquetes disponibles)

Una de las buenas ideas es la distribución ClickOnce para .NET, es un instalador que almacena su aplicación e instala en el contexto de usuario, por lo que no se requieren derechos de administrador. Puede configurar ClickOnce en su publicación para verificar las actualizaciones de cada aplicación.

Java tiene Java Web Start que ofrece el mismo tipo de funcionalidad para los applets de java.

Delphi tiene numerosos artículos sobre la actualización automática, Torry tiene una lista de WebUpdate components, por ejemplo GoUpdater parece tener una amplia gama de funcionalidades.

Todos usan un sitio web/recurso compartido de red para buscar una nueva versión y luego recuperar un parche o un archivo de instalación completo y ejecutarlo. Por lo tanto, debería intentar encontrar un buen paquete para su aplicación, para ahorrarle la molestia de desarrollar y mantener su propia solución.

0

Puede escribir un módulo interno de su aplicación para hacer actualizaciones. Puede escribir una mini aplicación externa para hacer actualizaciones.

También mire la tecnología de compilación sobre la marcha .NET, hace posible crear dicha mini aplicación sobre la marcha bajo demanda. Por ejemplo, http://fly.sf.net/

2

Una cosa que no se ha mencionado realmente es que se debe considerar seriamente que el usuario que ejecuta su programa podría no tener suficientes privilegios para actualizarlo. Esto debería ser bastante común, al menos para los usuarios de negocios, probablemente menos para los usuarios domésticos.

Siempre estoy trabajando con una cuenta limitada (autoimpuesta) por razones de seguridad y siempre me molesta que la mayoría de los auto-actualizadores simplemente asuman que estoy ejecutando como administrador y luego de la descarga simplemente fallan y no ofrecen otra forma de realizar la actualización que no sea cerrar el programa y volver a ejecutarlo en un contexto administrativo. La mayoría ni siquiera almacena en caché la actualización descargada y tiene que hacerlo todo de nuevo.

Sería mucho mejor si el auto-actualizador simplemente solicitara credenciales de administrador cuando sea necesario y continúe con ello.

+0

Eso es exactamente lo que hace nuestro actualizador. wyUpdate (ver: http://wyday.com/wyupdate/) es un actualizador de código abierto escrito en C#. –

0

Voy a suponer una respuesta para Windows.

De esta manera parece funcionar bien.

En el instalador do:
1. Cree un servicio de inicio manual que se ejecute como LocalSystem que cuando se inicia la actualización se detiene.
2. Cambie los permisos de servicio para que todos los usuarios puedan iniciar el servicio (si todos los usuarios pueden actualizar sin derechos de administrador).
3. Cambie el programa principal para buscar actualizaciones cuando se inicia utilizando un mecanismo simple. Si detecta una actualización, solicite si el usuario desea aplicarla.
4. Si el usuario acepta la actualización, inicie el servicio.

Si la arquitectura lo permite, cree una forma de supervisar la actualización mientras se está ejecutando.

+1

¿Servicio de inicio manual que se ejecuta como LocalSystem y que todos los usuarios pueden iniciar? Esto suena como un desastre de seguridad esperando a suceder. –

+0

Solo si la actualización del software es un desastre de seguridad. La capacidad de iniciar un servicio no es la capacidad de atacarlo a menos que puedan escribir en el servicio binario. – Joshua

-1

Si usted está buscando una solución de actualización de software multiplataforma, echar un vistazo a www.updatenode.com

Algunos aspectos destacados:

  • libre para Open Source proyectos
  • multiplataforma actualización & Open Source herramienta de cliente
  • localizado ya para los idiomas más importantes
  • fácil de integrar y fácil de usar Le
  • nube plataforma de gestión basado para definir y gestionar las actualizaciones
  • proporciona además soporte para la visualización de mensajes (informan sobre los nuevos eventos, productos, etc.)
  • interfaz web está abierto (usted puede crear su propio cliente utilizando el servicio)
  • muchas estadísticas de uso, como los sistemas operativos utilizados, ubicación geográfica, el uso de la versión, etc.
  • Android API para las actualizaciones de aplicaciones móviles

Haga la prueba.

BTW, soy parte del equipo de desarrollo para el cliente de código abierto. :)

+1

¿Trabajas para updatenode.com? Porque has respondido varias viejas preguntas que lo recomiendan. – crashmstr

+0

Contribuyo en el desarrollo de cliente de código abierto: https://bitbucket.org/updatenode/unclient – sarahara

+1

Probablemente deberías leer esto: [¿Cómo menciono mis propios productos en las respuestas?] (Http: //meta.stackexchange. com/q/15787) – crashmstr

Cuestiones relacionadas