Atualização automatizada genérica de aplicativos de desktop

0

Existe um aplicativo que atualizará silenciosamente uma pasta local contendo todos os arquivos em um diretório da web? Ou melhor ainda, se houver um arquivo .zip, ele extrairá os arquivos na pasta especificada?

Eu tenho um aplicativo da web de desktop simples (HTML / Javascript usando jQuery) em uma pasta local, e sempre que ele é atualizado, gostaria que os computadores em nosso escritório instalassem automaticamente a atualização baixando algo como 'latest.zip' automaticamente (através de download HTTP, não de download por FTP) e deixe o atualizador copiar os arquivos para o diretório do aplicativo.

Eu tenho pesquisado, mas tudo que vejo são a sincronização de arquivos, que é bidirecional e programas que são muito complicados para usar ou são muito pesados. Meu objetivo é poder atualizar silenciosamente o diretório do aplicativo com uma interação mínima com o usuário. Mas como o JavaScript não pode gravar em discos rígidos, ele precisa ser feito usando outro aplicativo (arquivo exe) que será executado periodicamente.

Talvez exista algo como um aplicativo genérico de atualização no qual você pode colocar um endereço da web dos arquivos e o diretório local onde os arquivos devem ser copiados?

    
por rationalboss 17.02.2013 / 14:00

2 respostas

1

Como a questão menciona um arquivo .exe, presumo que você esteja no Windows. Se assim for, você pode fazer isso com o PowerShell.

O script

# Set some variables to hold the source, name and destination of the update file
$UpdateUrl = "http://example.com/"
$UpdateFile = "update.zip"
$Destination = "C:\Path\to\application\"
$TempDir = $Env:Temp + "\"

# Download the update file to a temporary directory
$Client = New-Object System.Net.WebClient
$Client.DownloadFile($UpdateUrl + $UpdateFile, $TempDir + $UpdateFile)

# Calculate MD5 hash of the downloaded update file
$MD5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$Hash1 = [System.BitConverter]::ToString(
    $MD5.ComputeHash([System.IO.File]::ReadAllBytes($TempDir + $UpdateFile))
)

# If an old update file exists at the destination, calculate its MD5 hash as well
If (Test-Path ($Destination + $UpdateFile)) {
    $Hash2 = [System.BitConverter]::ToString(
        $MD5.ComputeHash([System.IO.File]::ReadAllBytes($Destination + $UpdateFile))
    )
} Else {
    $Hash2 = ""
}

# Compare the MD5 hashes
# If they're not equal, then copy the new update file to the destination and extract its contents
If ($Hash1 -ne $Hash2) {
    Copy-Item ($TempDir + $UpdateFile) $Destination
    $Shell = New-Object -ComObject Shell.Application
    $Shell.NameSpace($Destination).CopyHere(
        $Shell.NameSpace($Destination + $UpdateFile).Items(),
        20
    )
}

# Delete the downloaded update file
Remove-Item ($TempDir + $UpdateFile)

Explicação

O primeiro bloco declara algumas variáveis que contêm o nome, a origem e o destino do arquivo de atualização, bem como um diretório temporário para conter o arquivo de atualização baixado. Não se esqueça das barras à direita quando você as altera para seus próprios caminhos.

O próximo bloco usa o objeto WebClient para baixar o arquivo para o diretório temporário.

Em seguida, o script calcula o hash MD5 do arquivo baixado. Se você quiser calcular um hash diferente, como SHA-1, confira as classes disponíveis no System.Security Namespace de criptografia .

Em seguida, o script verifica a existência de um arquivo de atualização antigo na pasta de destino e calcula seu hash MD5.

Em seguida, os dois hashes são comparados. Se eles não são iguais, significa que houve uma atualização. O script usa o objeto Shell do Windows para copiar o arquivo de atualização para a pasta de destino e extrair seu conteúdo. O número 20 é a soma de duas opções da função CopyHere () - 4 (que suprime o diálogo de progresso) e 16 (que responde "Yes to All" a qualquer diálogo, sobrescrevendo automaticamente os arquivos existentes).

Por fim, a última linha exclui o arquivo de atualização baixado do diretório temporário.

Referências

Para mais informações sobre as classes, métodos e cmdlets usados, consulte os seguintes links:

por 18.02.2013 / 09:35
0

O problema que vejo é que seus computadores clientes não têm acesso à sua pasta local, então não há como eles saberem que é hora. Se for pequeno, você pode fazer automaticamente o download de uma nova cópia de qualquer maneira, ou talvez fazer um script shell / bash que eles usam para lançá-lo, que verifica e faz o download de uma nova versão cada vez que abrir. >

Caso seja útil, se você estiver no Windows, dê uma olhada no aplicativo RealtimeSync que vem com o FreeFileSync, configure-o para monitorar uma pasta em busca de alterações e, em seguida, execute um comando quando as alterações forem descobertas - como como um script em lote para carregá-los para que as outras máquinas façam o download.

link

    
por 17.02.2013 / 15:19