Pregunta

Muchos programas incluyen un actualizador automático, donde el programa ocasionalmente busca actualizaciones en línea y luego descarga y aplica las actualizaciones que se encuentran. Los errores de programa se corrigen, los archivos de soporte se modifican y las cosas (generalmente) se mejoran.

Lamentablemente, no importa lo duro que mire, no puedo encontrar información sobre este proceso en ninguna parte. Parece que los auto-actualizadores que se han implementado han sido patentados o no se consideran importantes.

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

¿Fue útil?

Solución

Creo que " idioma agnóstico " va a ser un factor limitante aqui Las aplicaciones vienen en tantas formas y tamaños que no hay una respuesta única para todos. He implementado varios auto-actualizadores en varios idiomas, y no hay dos similares.

La filosofía más general es que la aplicación verifica con alguna ubicación de inicio (dirección web, consulta web, ubicación de red corporativa, etc.) para preguntar si su versión es actual o para preguntar cuál es la versión más actual. 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 inicie la aplicación. El script puede verificar la versión, descargar actualizaciones si es necesario y pedir comentarios sobre el uso, por ejemplo.

Probablemente podamos ayudarlo mejor si reduce los parámetros.

ACTUALIZACIÓN: el enfoque para " parchear " También depende de la naturaleza de la aplicación, y aquí hay una gran diversidad. Si tiene un solo archivo ejecutable, por ejemplo, probablemente sea más práctico reemplazar el ejecutable. Si su aplicación tiene muchos archivos, debe buscar formas de minimizar el número de archivos reemplazados. Si su aplicación es altamente personalizada o parametrizada, debe esforzarse por minimizar el esfuerzo de adaptación. Si su aplicación emplea un código interpretado (como una aplicación de Excel VBA o MS Access MDB), entonces puede reemplazar partes del código. En una aplicación Java, es posible que solo deba reemplazar un archivo JAR, o incluso un subconjunto de los contenidos de 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 sobre la diversidad. Esta es una de esas muchas veces en que la mejor respuesta usualmente comienza con " ¡Bueno, depende ...! & Quot; Es por eso que tantas respuestas incluyen " Por favor, reduzca los parámetros "

Otros consejos

Asegúrese de considerar también las implicaciones de seguridad de eliminar información sobre la actualización, así como los binarios de actualización en sí mismos.

¿Confías en la fuente de la descarga? Tal vez esté llamando a casa para obtener su actualización, pero ¿qué pasa si hay un hombre en el medio que redirige a un servidor malintencionado? Una conexión segura HTTPS o similar ayudará, pero se recomienda volver a verificar los bits que eventualmente descarga mediante el uso de una comprobación de firma digital.

Primero necesita un archivo en el sitio web de la aplicación con la última versión. Creo que es la mejor manera de tener una tabla SQL especial para esta tarea y rellenarla automáticamente después de publicar la versión nueva / la finalización de la compilación nocturna. Su aplicación crea un nuevo hilo que solicita el enlace http incorporado con la versión y se compara con el actual. En .NET el uso puede usar código como este:

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 solo una cadena simple como 1.0.1.0.

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

(Pero todo aquí es sobre .NET)

La solución más simple (utilizada por muchos programas) es ejecutar el desinstalador para la versión anterior y ejecutar el instalador para el nuevo (opcionalmente, omitir preguntas que el usuario ya ha respondido, como el EULA). El único inconveniente 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 querrá dejar caer un pequeño archivo ejecutable en la carpeta Temp, que ejecuta todo el proceso y luego lo elimina al final de la instancia de la nueva versión que se lanzó (o simplemente registrarla para eliminarla en el siguiente reinicio ).

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 reciente y que proporcione un enlace.

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

La arquitectura general es que tienes un servidor central que controlas que conoce la última versión y dónde obtenerla. Luego los programas consultan al servidor. No voy a incluir código de ejemplo porque es altamente demandado en el servidor y en el formato que elija. Sin embargo, no es terrible difícil.

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

Básicamente, es una pequeña secuencia de comandos que administra una cola de sucursales de Subversion para compilar y empaquetar 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, que consiste en llamar a un montón de scripts. La configuración de cada rama para compilar se escribe en un archivo .INI, almacenado en un repositorio de Subversion junto con la propia herramienta.

Debido a que esta herramienta se ejecuta en varias computadoras, quería una manera de actualizarla automáticamente en todas las máquinas tan pronto como hice un cambio en la herramienta en sí, o en los scripts de configuración.

La forma en que lo implementé fue simple: cuando lanzo la herramienta, se convierte en un " shell externo " ;. Esta capa exterior hace 2 cosas muy simples:

  • svn update en sí mismo y en los archivos de configuración
  • iniciarse de nuevo, esta vez como " shell interno " ;, el que realmente maneja una configuración (y luego sale de nuevo).

Este sencillo sistema de actualización en un bucle nos ha servido muy bien durante algunos meses. Es muy elegante, porque es autónomo: el auto-actualizador es el programa en sí. Porque " capa exterior " (la parte del auto-actualizador) 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).

Una cosa que realmente no se ha mencionado es que debe considerar seriamente que el usuario que ejecuta su programa puede no tener los privilegios suficientes para actualizarlo. Esto debería ser bastante común, al menos para los usuarios empresariales, 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, después de la descarga, simplemente fallan y no ofrecen otra. forma de realizar la actualización que no sea cerrar el programa y ejecutarlo nuevamente en un contexto administrativo. La mayoría ni siquiera almacena en caché la actualización descargada y tiene que hacerlo de nuevo.

Sería mucho mejor si el auto-actualizador simplemente solicitara las credenciales de administrador cuando sea necesario y siga adelante.

Debido a que 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. (Abajo listo algunos de los paquetes disponibles)

Una de las ideas realmente agradables es la distribución ClickOnce para .NET, es un instalador que protege su aplicación y la instala en el contexto del usuario, por lo que no se requieren derechos de administrador. Puede configurar ClickOnce en su publicación para verificar si hay actualizaciones en cada inicio de aplicación.

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

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

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

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 verifica si hay versiones más recientes de los Jars y las descargaría en lugar de las almacenadas localmente en caché. Con una herramienta llamada jardiff, solo creará diferencias hacia los frascos más nuevos y los distribuirá a través del servidor (por ejemplo, solo obtenga una actualización).

Pros:

  • siempre actualizado

Contras:

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

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

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

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

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

La función de instalar un parche en un programa es básicamente una de las funciones básicas de un instalador. El software del instalador está documentado en numerosos lugares, pero generalmente por instalador: existe el Microsoft Installer (con Install Shield Extensions), Ruby gems , archivos .jar de Java, 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 parcheo en general pero para sistemas ligeramente diferentes. Para decidir qué es lo mejor para usted, considere cuál de estos sistemas se parece más a su aplicación. Rodar el tuyo está bien, pero mirar estos sistemas es un lugar para comenzar.

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

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

Voy a asumir la respuesta para Windows.

Esta forma 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 del servicio para que todos los usuarios puedan iniciar el servicio (si todos los usuarios deberían poder actualizar sin derechos de administrador).
3. Cambie el programa principal para buscar actualizaciones cuando se inicie usando un mecanismo simple. Si detecta una actualización, pregunte si el usuario quiere aplicarla.
4. Si el usuario acepta la actualización, inicie el servicio.

Si la arquitectura lo permite, cree una forma de monitorear la actualización mientras se ejecuta.

Si su software es de código abierto y está dirigido a Linux o desarrolladores. Es interesante instalar tu software como un repositorio git. Y hacer que tire de la rama estable de vez en cuando o cada vez que se inicie.

Esto es particularmente fácil cuando su aplicación se administra a través de npm, sbt, mavan, stack, elm-package o similar.

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

Algunos aspectos destacados:

  • gratis para proyectos Open Source
  • multiplataforma & amp; Herramienta de cliente de actualización de código abierto
  • localizado ya para los idiomas más importantes
  • fácil de integrar y fácil de manejar
  • plataforma de administración basada en la nube para definir y administrar actualizaciones
  • proporciona asistencia adicional para mostrar mensajes (informar sobre nuevos eventos, productos, etc.)
  • la interfaz web está abierta (puede crear su propio cliente utilizando el servicio)
  • muchas estadísticas de uso, como sistemas operativos utilizados, ubicación geográfica, uso de la versión, etc.
  • API de Android para actualizaciones de aplicaciones móviles

Solo inténtalo.

Por cierto, formo parte del equipo de desarrollo para el cliente de código abierto. :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top