Configuração do atualizador automático de elétrons com servidor próprio (provedor genérico)

8

Eu tenho meu próprio servidor onde carreguei o instalador de aplicativos via FTP. Seu nome é quickmargo Setup 1.0.0.exee está disponível em

https://quickmargo.pl/dist/download/quickmargo Setup 1.0.0.exe

Também via FTP, enviei latest.ymlpara o mesmo diretório e está disponível em

https://quickmargo.pl/dist/download/latest.yml

No meu projeto no index.js eu tenho

import { autoUpdater } from 'electron-updater'

autoUpdater.setFeedURL('https://quickmargo.pl/dist/download');

autoUpdater.on('update-downloaded', () => {
    autoUpdater.quitAndInstall()
});

autoUpdater.on('update-available', (ev, info) => {
    alert('Update required!');
});

app.on('ready', async () => {
    if (process.env.NODE_ENV === 'production') {
        await autoUpdater.checkForUpdates()
    }
});

No package.json eu tenho "version": "1.0.0",e por dentro build:{}tenho:

"win": {
  "icon": "build/icons/icon.ico",
  "publish": [{
    "provider": "generic",
    "url": "https://quickmargo.pl/dist/download"
  }]
},

(Eu não me importo com outras plataformas)

Agora, digamos que eu fiz algumas alterações no meu aplicativo e quero fazer o upload da versão 1.0.1 e que ele seja atualizado automaticamente se alguém já tiver baixado o instalador e instalado o aplicativo em sua máquina.

Diga-me, por favor, se tudo o que fiz até agora está bom e qual é o próximo passo. Eu considero o seguinte:

  • mude versionpara 1.0.1em package.json
  • execute o comando build no terminal novamente
  • carregar manualmente o novo instalador no mesmo local no meu servidor

Editar

Eu fiz acima de três etapas e também fiz o upload do novo latest.yml (com a versão 1.0.1) e o resultado é que, quando agora executo a versão 1.0.0 instalada anteriormente (antes de fazer o upload da nova versão para o servidor) em outro PC, isso não acontece. detectar que eu adicionei 1.0.1 ao servidor e ele não atualiza ou mostra algum pop-up ou qualquer coisa. O que estou fazendo de errado?

Editar 2

Estou tentando resolvê-lo por conta própria e agora carreguei a versão 1.0.2. Agora, o link para baixar o aplicativo é:

https://quickmargo.pl/dist/download/quickmargo Setup 1.0.2.exe

Editar 3

Eu estava tentando resolvê-lo por conta própria. Editei o código em index.js. Eu editei também acima. alert('Update required!');no update-availableevento nunca ocorre. Deverá me mostrar a janela de mensagem de erro que o alerta não está definido. Mas, aparentemente, o evento disponível para atualização nunca é emitido.


Informação adicional:

  • Meu aplicativo foi gerado com clichê vue-electron v1.0.6 .
  • Minha versão do atualizador de elétrons é 4.1.2
  • npm run buildrealmente invocar algum código clichê que está em .electron-vue/build.js. Você pode ver este arquivo no link acima (por exemplo, definir NODE_ENV à produção Script em package.json é: "build": "node .electron-vue/build.js && electron-builder",.
  • Eu não quero hospedar versões no github porque meu repositório é privado e vi algumas informações nos documentos electron.build que eu não deveria fazer isso.
  • Também vi informações em algumas edições que eu poderia criar um novo repositório apenas para lançamentos, mas considero hospedar tudo no meu próprio servidor como uma abordagem mais limpa.
dopeCode
fonte
Há um exemplo aqui: github.com/iffy/electron-updater-example que cobre atualizações "personalizadas"
Lawrence Cherone
Então, o que eu faço de errado?
dopeCode
Execute o aplicativo embalado via os cmd para ver os registos, tendo estes em questão pode ser útil
oktapodia
Preciso que o aplicativo seja assinado com certificado para executar a atualização automática corretamente?
dopeCode
@dopeCode não, o autoupdate deve funcionar sem assinatura de código; se você não encontrar nenhum erro após iniciar o exe criado no terminal, use um logger electron-logpara fornecer ao autoUpdater um logger para usar ( const logger = require("electron-log"); autoUpdater.logger = logger; logger.transports.file.level = "debug";) - isso deve imprimir informações se o seu servidor foi encontrado e se uma atualização foi encontrada. Se você receber um erro, poderá adicioná-lo à sua pergunta.
Rhayene

Respostas:

9

Consegui definir uma configuração de atualização automática usando uma genericopção de publicação após os documentos, nunca tendo feito isso antes. Portanto, é definitivamente factível e não requer assinatura por meio de um certificado, mas eu inicialmente tive problemas porque havia definido publisherNamena configuração da compilação, mas nenhum certificado. Se a versão atual tiver um editor ou certificado especificado e a nova não, ela também não será instalada.

1. Ative o log

Você pode habilitar o log do electron-updaterpacote instalando electron-loge atribuindo o logger ao autoUpdater:

const log = require('electron-log');
autoUpdater.logger = log;
autoUpdater.logger.transports.file.level = 'info';

Os caminhos de saída padrão são:

  • Linux: ~/.config/<app name>/log.log
  • Mac OS: ~/Library/Logs/<app name>/log.log
  • Janelas: %USERPROFILE%\AppData\Roaming\<app name>\log.log

Se as etapas a seguir não resolverem seus problemas, publique o conteúdo do log.

2. Não ligue autoUpdater.setFeedURL()

Os documentos oficiais declaram:

Não chame setFeedURL . O electron-builder cria automaticamente um app-update.ymlarquivo para você na compilação no resources(este arquivo é interno, você não precisa estar ciente disso).

A URL já está definida no publishobjeto do provedor e é suficiente para o atualizador trabalhar. Além disso, uma string de URL como argumento de setFeedURL()está incorreta, deve ser um objeto de opções . Mas, novamente, especificar tudo em seu publishprovedor é suficiente.

3. Carregue também os .blockmaparquivos no seu servidor

Eles devem ser criados na compilação, além da sua configuração .exe arquivos de . Caso contrário, você verá erros no seu log de que os arquivos da versão antiga e nova não foram encontrados para comparação.

4. Adicione uma barra final à URL do servidor de atualização

Verifique se o url parâmetro do seu objeto provedor termina com uma barra. Embora o arquivo yml ainda possa ser encontrado sem ele, pode haver problemas durante o download real, caso contrário.

5. Tente a abordagem mais simples usando autoUpdater.checkForUpdatesAndNotify()

Em vez de usar a maneira mais flexível, mas também mais complicada, de escutar os diferentes eventos de atualização e reagir a eles no seu aplicativo, tente fazê-lo funcionar primeiro com o código a seguir. Quando isso funcionar, você ainda poderá voltar a manipular os diferentes eventos para obter uma melhor experiência do usuário.

app.on('ready', async () => {
  autoUpdater.checkForUpdatesAndNotify();
});

Isso irá verificar e baixar a atualização em segundo plano e instalá-la automaticamente assim que você fechar o aplicativo. Uma notificação padrão do Windows será exibida para informá-lo sobre a atualização disponível e o procedimento.

Constantin Groß
fonte
Eu adicionei o logger e agora vejo que ele realmente encontra uma nova versão, mostra até quantos kb precisam ser baixados: Full: 151,317.35 KB, To download: 1,152.69 KB (1%) mas depois disso nada acontece .. O aplicativo não está atualizando. Tem certeza de que checkForUpdatesAndNotifyé suficiente para fazer com que o aplicativo seja encerrado se encontrar uma nova versão, faça o download da nova versão e a instale?
dopeCode
Bem, eu adicionei esses ouvintes novamente e, em update-availableseguida, registro algum texto que posso ver, mas update-downloadednunca é emitido, pois não consigo ver o logon neste evento. Qual pode ser o motivo pelo qual ele não inicia / termina (nem sei qual) o download?
dopeCode
checkForUpdatesAndNotifydeve mostrar uma notificação assim que o download foi bem-sucedido e o aplicativo deve ser atualizado assim que você o fechar. Mas se oupdate-downloaded evento nunca for acionado, você não chegará tão longe. No entanto, é difícil para mim dizer o que está causando o problema.
Constantin Groß
Sim, isso é basicamente meu comportamento update-available é emitido, mas update-downloadednão é. Ainda não sei porque. Vou tentar reproduzi-lo, novo repositório emty.
amigos estão dizendo sobre dopeCode
Yhm agora começou a funcionar. Embora eu não tenha mudado uma única linha de código. Eu apenas esperei como um dia, durante esse tempo, reiniciei o PC também. Está funcionando, mas está baixando o aplicativo completo e registra um erro: Cannot download differentially, fallback to full download: Error: Received data length 1527 is not equal to expected 634.Também tenta atualizar após a saída do aplicativo e solicita permissão de administrador. E se eu não permitir, posso executar o aplicativo novamente com a versão anterior, que é um comportamento que eu não quero. Quero forçar os usuários a instalar a atualização. Estou usando o autoUpdater.quitAndInstall (), mas não está saindo.
dopeCode