auto update - para - ¿Cómo debo implementar un auto-updater?
microsoft autoupdate para mac (15)
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.
Lamentablemente, no importa cuánto me veo, 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 la aplicación de 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.
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 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 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.
Creo que el "lenguaje agnóstico" va a ser un factor limitante 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 alguna ubicación de origen (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 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 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 "parcheado" 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".
Asegúrese de considerar también las implicaciones de seguridad de la succión de información sobre la actualización, así como los binarios de actualización en sí.
¿Confías en la fuente de la descarga? Quizás llames a casa para obtener tu actualización, pero ¿qué sucede 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.
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. (A continuación incluyo algunos de los paquetes disponibles)
Una de las mejores ideas es la distribución de ClickOnce para .NET, es un instalador que guarda la aplicación y se instala en el contexto del 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 componentes de WebUpdate , por ejemplo, GoUpdater parece tener una gama muy amplia 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, 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 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 obtener una actualización).
Pros:
- siempre actualizado
Contras:
- necesita un servidor de aplicaciones (tomcat, JBoss) para distribuir los archivos
- necesitas una conexión a internet para poder obtener la aplicación
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, se trata de un pequeño script que gestiona una cola de ramas de Subversion para ser compiladas 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.
Debido a que 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 misma 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 externa hace 2 cosas muy simples:
-
svn update
en sí mismo y en los archivos de configuración - se lanza de nuevo, esta vez como el "caparazón interno", el que realmente maneja una configuración (y luego se cierra de nuevo).
Este sistema muy simple de actualización-yo-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).
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 según cada instalador: allí, el instalador de Microsoft (con Install Shield Extensions), Ruby gems , Java .jar , 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.
La lectura de la respuesta de Carl Seleborgs me dio algunas ideas sobre cómo un repositorio genérico de códigos podría ser útil.
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 modificados de la revisión real del usuario.
En realidad, tendrá un repositorio con los binarios compilados, y ejecutar svnsync solo obtendrá los 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.
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 simplemente lo registra para ser eliminado en el próximo reinicio ).
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 a pedido. Por ejemplo, http://fly.sf.net/
Una cosa que no se ha mencionado realmente es que debe considerar seriamente que el usuario que ejecuta su programa puede 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 ejecutándome como administrador y luego de descargar simplemente fallan y no ofrezco otra forma de realizar la actualización además de cerrar el programa y ejecutarlo de nuevo 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 las credenciales de administrador cuando sea necesario y continúe con ello.
Voy a asumir una respuesta para Windows.
De esta manera parece funcionar bien.
En el instalador, haga lo siguiente:
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. Cambia el programa principal para buscar actualizaciones cuando comiences usando 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.
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 compilació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 .NET, el uso puede usar un 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 una sola cadena simple como 1.0.1.0.
Otro consejo que puedo dar es 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) 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 aquí es sobre .NET)
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 de código abierto
- herramienta de cliente de actualización de plataforma abierta y multiplataforma
- localizado ya para los idiomas más importantes
- fácil de integrar y fácil de manejar
- plataforma de gestión basada en la nube para definir y gestionar actualizaciones
- proporciona soporte 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 usados, ubicación geográfica, uso de versiones, etc.
- Android API para actualizaciones de aplicaciones móviles
Solo inténtalo.
Por cierto, soy parte del equipo de desarrollo para el cliente de código abierto. :)
Puedes usar mi solución (parte del proyecto Target Eye ). http://www.codeproject.com/Articles/310530/Target-Eye-Revealed-part-Target-Eyes-Unique-Auto