Ir para o conteúdo

Tutorial 4 - Atualizar a sua aplicação

No último tutorial, empacotamos a nossa aplicação como uma aplicação nativa. Se estiver a lidar com uma aplicação do mundo real, este não vai ser o fim da história - provavelmente fará alguns testes, descobrirá problemas e vai precisar de fazer algumas alterações. Mesmo que a sua aplicação seja perfeita, eventualmente desejará publicar a versão 2 da sua aplicação com melhorias.

Então - como é que se atualiza a aplicação instalada quando faz alterações no código?

Atualizar o código da aplicação

Atualmente, a nossa aplicação escreve na consola quando se pressiona o botão. No entanto, as aplicações de GUI não devem realmente usar a consola para os resultados. Elas precisam usar caixas de diálogo para comunicar com os utilizadores.

Vamos adicionar uma caixa de diálogo para dizer olá, em vez de escrever na consola. Modifique chamada de retorno say_hello para que se pareça com isto:

async def say_hello(self, widget):
    await self.main_window.dialog(
        toga.InfoDialog(
            f"Olá, {self.name_input.value}",
            "Olá!",
        )
    )

Precisamos criar o método async para que quando mostrarmos a caixa de diálogo, o resto da aplicação continue a ser executada. Não se preocupe muito com esse detalhe neste momento - vamos dar uma explicação mais detalhada no Tutorial 8.

Isto dirige o Toga a abrir uma caixa de diálogo modal quando o botão é pressionado.

Se executar briefcase dev, digitar um nome e pressionar o botão, vai ver a nova caixa de diálogo:

Caixa de diálogo Hello World Tutorial 4, em
macOS

Caixa de diálogo Hello World Tutorial 4, em
Linux

Caixa de diálogo Hello World Tutorial 4, em
Windows

No entanto, se correr briefcase run, a caixa de diálogo não vai aparecer.

Porquêe isto? Bem, o briefcase dev opera executando o seu código no local - ele tenta produzir um ambiente de tempo de execução o mais realista possível para seu código, mas não fornece nem usa nada da infraestrutura da plataforma para envolver o seu código como uma aplicação. Parte do processo de empacotamento da aplicação envolve copiar o código para o bolo da aplicação - e no momento, a sua aplicação ainda contém o código antigo.

Assim - precisamos dizer ao briefcase para atualizar a sua aplicação, copiando a nova versão do código. Nós podíamos fazer isso apagando o diretório da plataforma antiga e começando do zero. No entanto, o Briefcase oferece uma maneira mais fácil - pode atualizar o código do seu bolo de aplicação existente:

(beeware-venv) $ briefcase update

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizada.
(beeware-venv) $ briefcase update

[helloworld] A finalizar a configuração da aplicação...
A direcionar para ubuntu:jammy (base de fornecedor Debian)
A determinar a versão da glibc... concluído
A direcionar para glibc 2.35
A direcionar para Python 3.10

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído


[helloworld] Aplicação atualizada.
(beeware-venv) C:\...>briefcase update

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizada.

Se o Briefcase não conseguir encontrar o modelo de andaime, ele vai invocar automaticamente o create para gerar um novo andaime.

Agora que atualizamos o código do instalador, podemos executar o briefcase build para recompilar a aplicação, o briefcase run para executar a aplicação atualizada e o briefcase package para reempacotar a aplicação para distribuição.

Nota

Utilizadores do macOS, lembrem-se de que, conforme observado no Tutorial 3, para o tutorial recomendamos executar o briefcase package com a bandeira --adhoc-sign para evitar a complexidade da configurar uma identidade de assinatura de código e manter o tutorial o mais simples possível.

Atualizar e executar num único passo

Se está a iterar rapidamente alterações de código, provavelmente vai querer fazer uma mudança de código, atualizar a aplicação e imediatamente re-correr a sua aplicação. Para a maioria dos propósitos, o modo de desenvolvedor (briefcase dev) será a maneira mais fácil de fazer esse tipo de iteração rápida; no entanto, se estiver a testar algo sobre como sua aplicação corre como um binário nativo, ou caçando um bug que só se manifesta quando sua aplicação está em formato empacotado, pode precisar de usar chamadas repetidas para briefcase run. Para simplificar o processo de atualização e execução do bolo dq aplicação, o Briefcase tem um atalho para suportar este padrão de uso - a opção -u (ou -update) no comando run.

Vamos tentar fazer outra alteração. Deve ter notado que, se não escrever um nome na caixa de entrada de texto, a caixa de diálogo vai dizer "Olá, ". Vamos modificar a função say_hello novamente para lidar com esse caso extremo.

No topo do ficheiro, entre as importações e a definição da classe HelloWorld, adicione um método utilitário para gerar uma saudação apropriada, dependendo do valor do nome que foi fornecido:

def greeting(name):
    if name:
        return f"Olá, {name}"
    else:
        return "Olá, desconhecido"

Depois, modifique a chamada de retorno say_hello para usar esse novo método utilitário:

async def say_hello(self, widget):
    await self.main_window.dialog(
        toga.InfoDialog(
            greeting(self.name_input.value),
            "Olá!",
        )
    )

Execute a sua aplicação no modo de desenvolvimento (com briefcase dev) para confirmar que a nova lógica funciona; em seguida, atualize, crie e execute a aplicação com um único comando:

(beeware-venv) $ briefcase run -u

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizada.

[helloworld] A compilar a aplicação...
...

[helloworld] Compilado build/helloworld/macos/app/Hello World.app

[helloworld] A iniciar a aplicação...
(beeware-venv) $ briefcase run -u

[helloworld] A finalizar a configuração da aplicação...
A direcionar para ubuntu:jammy (base de fornecedor: Debian)
A determinar a versão do glibc... concluído
A direcionar para glibc 2.35
A direcionar para Python 3.10

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizada.

[helloworld] A compilar a aplicação...
...

[helloworld] Compilado build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld

[helloworld] A iniciar a aplicação...
(beeware-venv) C:\...>briefcase run -u

[helloworld] A atualizar o código da aplicação...
A instalar src/helloworld... concluído

[helloworld] A remover conteúdo desnecessário da aplicação...
A remover conteúdo desnecessário do pacote da aplicação... concluído

[helloworld] Aplicação atualizada.

[helloworld] A iniciar a aplicação...

O comando package também aceita o argumento -u, assim se fizer uma alteração no código da sua aplicação e quiser reempacotar imediatamente, poderá executar briefcase package -u.

Próximos passos

Agora temos a nossa aplicação empacotada para distribuição em plataformas de ambiente de trabalho e conseguimos atualizar o código na nossa aplicação.

Mas e quanto aos dispositivos móveis? No Tutorial 5, vamos converter a nossa aplicação num aplicação móvel e vamos implantá-la num simulador de dispositivo, e num telemóvel.