Pergunta

Muitos programas incluem um auto-atualizador, onde o programa ocasionalmente parece on-line para atualizações e downloads em seguida e aplica todas as atualizações que são encontrados. erros de programa são fixos, arquivos de suporte são modificados, e as coisas são (geralmente) feito melhor.

Infelizmente, não importa o quão duro eu olhar, eu não posso encontrar informações sobre este processo em qualquer lugar. Parece que os auto-atualizadores que foram implementadas ou foram proprietária ou não considerada importante.

Parece bastante fácil de implementar o sistema que procura por atualizações em uma rede e downloads-los se eles estão disponíveis. Essa parte da auto-atualizador irá mudar significativamente de implementação para implementação. A questão é quais são as diferentes abordagens de aplicando patches. Apenas o download de arquivos e substituindo as antigas por novas, a execução de um script de migração que foi baixado, macaco remendar partes do sistema, etc.? Conceitos são os preferidos, mas os exemplos em Java, C, Python, Ruby, Lisp, etc. seria apreciado.

Foi útil?

Solução

Eu acho que "agnóstico linguagem" vai ser um fator limitante aqui. Os pedidos vêm em tantas formas e tamanhos que não há one-size-fits-all resposta. Eu tenho implementado várias auto-atualizadores em várias línguas, e não há dois eram semelhantes.

A filosofia mais geral é que os controlos de aplicação com alguns local de origem (endereço web, consulta web, local da rede corporativa, etc.), quer perguntar se é versão é atual, ou perguntar o que a versão mais atual. Se as chamadas de resposta para uma atualização, esse processo será diferente para cada situação.

Uma alternativa popular é convidar o local de origem para executar um script quando a aplicação é iniciada. O script pode verificar a versão, atualizações de download se necessário, e pedir feedback uso, por exemplo.

Podemos provavelmente ajuda melhor se você restringir os parâmetros.

UPDATE: A abordagem para "remendar" também depende da natureza da aplicação, e há uma diversidade muito grande aqui. Se você tiver um único arquivo executável, por exemplo, então provavelmente é mais prático para substituir o executável. Se seu aplicativo tem muitos arquivos, você deve procurar formas de minimizar o número de arquivos substituídos. Se sua aplicação for altamente personalizados ou parametrizado, você deve se esforçar para minimizar o esforço alfaiataria re-. Se o seu aplicativo emprega código interpretado (como um aplicativo Excel VBA ou MS Access aplicação MDB), então você pode ser capaz de substituir partes do código. Em uma aplicação Java você pode precisar apenas de substituir um arquivo JAR, ou mesmo um subconjunto dos conteúdos JAR. Você também precisa ter uma forma de reconhecer a versão atual do cliente, e atualizá-lo de forma adequada. Eu poderia continuar e continuar, mas eu espero que você veja o meu ponto sobre a diversidade. Este é um dos muitos momentos em que a melhor resposta geralmente começa com "Bem, isso depende ...!" É por isso que tantas respostas incluem "Por favor estreitar os parâmetros."

Outras dicas

Certifique-se também considerar as implicações da sugando informações sobre a atualização, bem como os binários se atualizar de segurança.

Você confia a fonte do download? Você talvez telefonar para casa para tem a sua atualização, mas o que se há um homem no meio, que redireciona para um servidor malicioso. Uma conexão segura HTTPS ou similar vai ajudar, mas double verificar os bits que você acabou de baixar usando uma verificação de assinatura digital é recomendado.

Primeiro você precisa de um arquivo em seu aplicativo casa web site com a versão mais recente. A melhor maneira que eu penso ter tabela SQL especial para esta tarefa e preenchê-lo automaticamente depois da publicação da versão nova conclusão build / noturno. Seu aplicativo cria nova discussão que solicita built-in http ligação com a versão e compara com atual. Em .NET uso pode 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
}

Neste exemplo, version.php em apenas uma corda simples, como 1.0.1.0.

Outra dica que posso dar - como fazer o download de uma atualização. Eu gosto muito próxima idéia: nos recursos de sua aplicação há uma série de CLR-code que você compilar on-the-fly (usando CodeDom) para uma pasta temporária, a aplicação principal chama-lo e vai para perto. Updater lê argumentos, configurações ou de registro e downloads de novos módulos. E chama principal aplicação que elimina todos os arquivos temporários. Feito!

(Mas tudo aqui é sobre .NET)

As soluções mais simples (usado por muitos programas) está a executar o programa de desinstalação da versão anterior ea executar o instalador para o novo (opcionalmente ignorando questões que o usuário já respondidas, como o EULA). O único problema é que a nova versão deve ser capaz de ler as opções de configuração da versão antiga.

Além disso, no Windows, você não pode excluir um arquivo executável que está em uso, então você provavelmente vai querer soltar um pequeno executável na pasta Temp, que funciona todo o processo e, em seguida, excluí-lo no final da instância de a nova versão que foi lançado (ou apenas registrá-lo para ser excluído na próxima reinicialização ).

A abordagem mais simples seria a de ter sua consulta programa de um servidor (website) para ver se há uma atualização. Se houver uma atualização você pode exibir uma mensagem ao usuário que pede-lhes para baixar uma versão mais recente e fornece um link.

Uma solução alternativa e mais complexa seria a criação de um pequeno serviço de janelas (ou Unix daemon) que verifica periodicamente para ver se há atualizações, este serviço pode baixar a atualização e iniciar o instalador.

A arquitetura geral é que você tem um servidor central que você controla que conhece a versão mais recente e onde obtê-lo. Em seguida, os programas de consultar o servidor. Eu não estou indo para incluir código de exemplo, porque é altamente réu no servidor e o formato que você escolher. Não é terrível embora difícil.

Esta não é tanto uma resposta completa, mas sim um exemplo de mecanismo de atualização automática que implementou recentemente. A situação é um pouco diferente da tradição Firefox tipo de aplicativo do usuário, uma vez que era uma ferramenta interna utilizada no trabalho.

Basicamente, é um pequeno script que gere uma fila de ramos Subversion para ser construído e empacotado em um instalador. Ele lê um pouco de arquivos, onde os nomes dos ramos são escritos, leva o primeiro, re-escreve-lo no final do arquivo, e inicia o processo de construção, que envolve chamar um monte de scripts. A configuração para cada ramo de construção é escrito em um arquivo de inicialização, armazenados em um repositório Subversion, juntamente com a ferramenta em si.

Porque esta ferramenta é executada em vários computadores, que queria uma forma de atualizar automaticamente em todas as máquinas, assim que eu fiz uma alteração, quer da própria ferramenta, ou para os scripts de configuração.

A maneira que eu implementado era simples: quando eu lançar a ferramenta, torna-se uma "casca exterior". Esta casca exterior faz 2 coisas muito simples:

  • svn update sobre si mesmo e sobre os arquivos de configuração
  • lançar-se novamente, desta vez como o "escudo interno", o que realmente lida com uma configuração (e, em seguida, sai de novo).

Este sistema muito simples update-me-in-a-circuito nos serviu muito bem durante alguns meses. É muito elegante, porque é auto-suficiente: o auto-atualizador é o próprio programa. Porque "casca exterior" (a parte auto-atualizador) é tão simples, não importa que ele não beneficiar das atualizações como o "shell interior" (que é executado a partir do arquivo de origem atualizados a cada vez).

Uma coisa que realmente não foi mencionado é que você deve considerar seriamente que o usuário executar o seu programa não pode realmente ter privilégios suficientes para atualizá-lo. Este deve ser bastante comum, pelo menos para usuários de negócios, provavelmente menos para usuários domésticos.

Eu estou sempre trabalhando com uma conta limitada (auto-imposto) por razões de segurança e que sempre me irrita que a maioria das auto-atualizadores simplesmente assumir que eu estou correndo como administrador e, em seguida, depois de baixar apenas falhar e não oferecem nenhuma outra maneira de realizar a atualização diferente de realmente fechar o programa e executá-lo novamente num contexto administrativo. A maioria nem sequer cache a atualização baixada e tem que fazer tudo de novo.

Seria muito melhor se a auto-atualizador simplesmente prompt para credenciais de administrador quando necessário e passar à acção.

Porque atualização automática é um cenário comum, a maioria das línguas têm pelo menos um pacote disponível para apoiar esta. (Abaixo eu listo alguns dos pacotes disponíveis)

Um dos muito bom idéia do é a distribuição ClickOnce para NET, que é um instalador que sandboxes sua aplicação e instala no contexto do usuário, de modo que há direitos de administrador necessário. Você pode configurar o ClickOnce em sua publicação para verificar se há atualizações a cada arranque da aplicação.

Java tem Java Web Start, que oferece a mesma tipo de funcionalidade para applets Java.

Delphi tem inúmeros artigos sobre auto-atualização, Torry tem uma lista de WebUpdate componentes , por exemplo GoUpdater parece ter uma gama muito ampla de funcionalidade.

Todos eles usam a / compartilhamento de rede website para verificar se há uma nova versão e de recuperar qualquer um patch ou uma instalação completa do arquivo e executá-lo. Então você deve tentar encontrar um bom pacote para a sua aplicação, para salvar o trabalho de desenvolvimento e manutenção de sua própria solução.

Em um Java-Webstart configuração que você iniciar um arquivo JNLP que então aciona o download dos arquivos jar necessários para executar o aplicativo. Everytime webstart verifica se há versões mais recentes do Jars e iria transferi-los substituindo os armazenados em cache localmente. Com uma ferramenta chamada jardiff você irá criar apenas diffs para os potes mais recentes e distribuí-los através do servidor (por exemplo, só obter uma atualização).

Pros:

  • sempre atualizado

Contras:

  • você precisa de um servidor de aplicação (Tomcat, JBoss), a fim de distribuir os arquivos
  • você precisa de uma conexão com a internet, a fim de obter o aplicativo

Leitura Carl Seleborgs resposta me deu algumas idéias de como um código de repositório genérico poderia ser útil.

svn vem com uma ferramenta chamada svnsync, que tipo de comporta-se como uma exportação svn, mas mantém o controle da revisão real do seu exportação está.

Alguém poderia utilizar este sistema, a fim de única buscar os arquivos alterados dos usuários de revisão real.

Na realidade, você terá um repositório com os binários compilados, e correndo svnsync só vai buscar os binários que foi modificado. Ele também pode ser capaz de mesclar as alterações locais para arquivos de configuração baseados em texto com novas configuração de opções.

A função de instalar um remendo para um programa é, basicamente, uma das funções básicas de um instalador. software instalador está documentado em numerosos lugares, mas geralmente em uma base per-installer: Há Microsoft Installer (com Instalar extensões de blindagem), rubi , Java .jar arquivos, os vários sistemas gerenciador de pacotes do Linux ( RPM , Apt-get ) e outros.

Estes são todos os sistemas complexos que resolver o problema da aplicação de patches programa em geral, mas para sistemas ligeiramente diferentes. Para decidir o que é melhor para você, considere qual destes o seu sistema de aplicação mais se assemelha. Rolling seu próprio é bom, mas olhando para estes sistemas é um lugar para começar.

Você pode escrever um módulo interno do seu aplicativo para fazer atualizações. Você pode escrever um mini-aplicativo externo para fazer atualizações.

Também olhar para .NET on-the-fly tecnologia de compilação, torna possível a criação de tais mini-aplicativo on-the-fly on demand. Por exemplo, http://fly.sf.net/

Eu vou assumir resposta para o Windows.

Desta forma, parece funcionar bem.

No instalador fazer:
1. Criar um manual de serviço de arranque que é executado como LocalSystem que quando começou faz a atualização depois pára.
2. Alterar as permissões de serviços para todos os usuários podem iniciar o serviço (se todos os usuários devem ser capazes de atualização w / o de administração de direitos).
3. Altere o principal programa para verificar se há atualizações quando começou a usar um mecanismo simples. Se ele detectar uma atualização, alerta se o usuário deseja aplicá-la.
4. Se o usuário aceita a atualização, inicie o serviço.

Se a arquitetura permite para isso, criar uma maneira de monitorar a atualização, uma vez que está em execução.

Se o seu software é código aberto, e alvo Linux ou desenvolvedores. É interessante para instalar o seu software como um repositório git. E tê-lo puxar o ramo estável ocasionalmente ou sempre quando for lançado.

Isto é particularmente fácil quando seu aplicativo é gerenciado via npm, sbt, mavan, pilha, elm-pacote ou iguais.

Se você estiver procurando por uma solução de atualização de software multi-plataforma, dê uma olhada www.updatenode.com

Alguns destaques:

  • livre para projetos Open Source
  • multi-plataforma e ferramenta de actualização de cliente Open Source
  • já localizado para a maioria das línguas importantes
  • fácil de integrar e fácil de manusear
  • plataforma de gerenciamento baseado em nuvem para definir e gerenciar atualizações
  • proporciona adicionalmente suporte para exibição de mensagens (informar sobre novos eventos, produtos, etc.)
  • interface web é aberta (você pode criar seu próprio cliente usando o serviço)
  • muitas estatísticas de uso, como sistemas operacionais usados, localização geo, uso de versão, etc.
  • API Android para celular App atualizações

Apenas experimentá-lo.

BTW, eu sou parte da equipe de desenvolvimento para o cliente de código aberto. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top