Tutorial 3 - Empacotando para Distribuição

Até o momento, executamos nossa aplicação no «modo de desenvolvedor». Isso facilita a execução da nossa aplicação localmente - mas o que realmente queremos é poder fornecer nossa aplicação para outras pessoas.

Entretanto, não queremos ter que ensinar aos nossos usuários como instalar o Python, criar um ambiente virtual, clonar um repositório git e executar o Briefcase no modo de desenvolvedor. Queremos é fornecer um instalador, garantindo a execução imediata da aplicação.

O Briefcase pode ser usado para empacotar sua aplicação para distribuição dessa maneira.

Criando a estrutura da sua aplicação

Como esta é a primeira vez que estamos empacotando nossa aplicação, precisamos criar alguns arquivos de configuração e outras estruturas de suporte ao processo de empacotamento. No diretório helloworld, execute:

(beeware-venv) $ briefcase create

[helloworld] Generating application template...
Using app template: https://github.com/beeware/briefcase-macOS-app-template.git, branch v0.3.18
...

[helloworld] Installing support package...
...

[helloworld] Installing application code...
Installing src/helloworld... done

[helloworld] Installing requirements...
...

[helloworld] Installing application resources...
...

[helloworld] Removing unneeded app content...
Removing unneeded app bundle content... done

[helloworld] Created build/helloworld/macos/app

É provável que você tenha observado uma grande quantidade de texto passando pelo seu terminal… mas o que exatamente aconteceu? O Briefcase fez o seguinte:

  1. Ele gerou um modelo de aplicação (template). Existem muitos arquivos e configurações necessárias para construir um instalador nativo, além do código da sua aplicação. Essa estrutura extra é quase igual para todas as aplicações na mesma plataforma, exceto pelo nome da aplicação que está sendo construída - um modelo de aplicação (template) é fornecido pelo Briefcase para cada plataforma que ele suporta. Esta etapa implementa o modelo, substituindo o nome da sua aplicação, ID do pacote e outras propriedades do seu arquivo de configuração conforme necessário para suportar a plataforma na qual você está construindo.

    Caso o modelo fornecido pelo Briefcase não seja satisfatório, é possível você fornecer um modelo próprio. Entretanto, é recomendável que isso não seja feito antes de se obter maior familiaridade com o modelo padrão do Briefcase.

  2. Ele baixou e instalou um pacote de suporte. A abordagem de empacotamento adotada pelo Briefcase é melhor descrita como «a coisa mais simples que poderia funcionar» - ele inclui um interpretador Python completo e isolado como parte de cada aplicativo criado. Isso apresenta uma ligeira ineficiência em termos de espaço - se você tiver 5 aplicativos empacotados com o Briefcase, terá 5 cópias do interpretador Python. No entanto, essa abordagem garante que cada aplicação seja completamente independente, usando uma versão específica do Python que comprovadamente funciona com tal aplicação.

    Novamente, o Briefcase fornece um pacote de suporte padrão para cada plataforma; entretanto, caso deseje, você pode fornecer seu próprio pacote de suporte e incluí-lo como parte do processo de construção. Isso pode ser útil se você necessita de opções específicas habilitadas no interpretador Python, ou se deseja remover módulos da biblioteca padrão que não são necessários em tempo de execução.

    O Briefcase mantém um cache local de pacotes de suporte. Portanto, uma vez que você tenha baixado um pacote de suporte específico, essa cópia armazenada será utilizada em compilações futuras.

    As noted above, when Briefcase packages an app as a native Linux system package (the default package format for Linux), a support package is not included with the app. Instead, the app will use the Python that is provided by the distribution of Linux being targeted.

  3. Ele instalou os requisitos da aplicação. Seu aplicativo pode especificar quaisquer módulos de terceiros necessários em tempo de execução. Estes serão instalados utilizando o pip no instalador da sua aplicação.

  4. Ele instalou o código da sua aplicação. Sua aplicação terá seu próprio código e recursos (por exemplo, imagens necessárias em tempo de execução); estes arquivos são copiados para o instalador.

  5. Ele instalou os recursos requeridos pela sua aplicação. Por fim, são adicionados recursos adicionais requeridos pelo próprio instalador. Isso inclui elementos como ícones que serão anexados à aplicação final e imagens de tela de abertura.

Assim que concluído, ao verificar o diretório do projeto, você deverá encontrar um diretório correspondente à sua plataforma (macOS, linux ou windows) contendo arquivos adicionais. Esta é a configuração de empacotamento específica para a plataforma da sua aplicação.

Compilando sua aplicação

Agora você pode compilar sua aplicação. Este passo executa qualquer compilação binária necessária para que sua aplicação seja executável na plataforma de destino.

(beeware-venv) $ briefcase build

[helloworld] Adhoc signing app...
...
Signing build/helloworld/macos/app/Hello World.app
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 00:07

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

No macOS, o comando build não necessita compilar nada, mas precisa assinar o conteúdo do binário para que ele possa ser executado. Essa assinatura é do tipo ad hoc - só funcionará no seu computador. Se você deseja distribuir a aplicação para outras pessoas, será necessário fornecer uma assinatura completa.

Rodando sua aplicação

Agora você pode utilizar o Briefcase para executar sua aplicação:

(beeware-venv) $ briefcase run

[helloworld] Starting app...
===========================================================================
Configuring isolated Python...
Pre-initializing Python runtime...
PythonHome: /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib
PYTHONPATH:
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python311.zip
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib/lib-dynload
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/app_packages
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/app
Configure argc/argv...
Initializing Python runtime...
Installing Python NSLog handler...
Running app module: helloworld
---------------------------------------------------------------------------

Isso iniciará a execução de seu aplicativo nativo, usando a saída do comando build.

Você pode notar algumas pequenas diferenças na aparência do seu aplicativo quando ele estiver em execução. Por exemplo, os ícones e o nome exibidos pelo sistema operacional podem ser ligeiramente diferentes daqueles vistos durante a execução no modo de desenvolvedor. Isso também ocorre porque você está usando o aplicativo empacotado, e não apenas executando o código Python. Do ponto de vista do sistema operacional, agora você está executando «um aplicativo», não «um programa Python», e isso se reflete na aparência do aplicativo.

Criando o seu instalador

Agora você pode empacotar seu aplicativo para distribuição, usando o comando package. O comando package faz qualquer compilação necessária para converter o projeto de andaime em um produto final e distribuível. Dependendo da plataforma, isso pode envolver a compilação de um instalador, a execução de assinatura de código ou outras tarefas de pré-distribuição.

(beeware-venv) $ briefcase package --adhoc-sign

[helloworld] Signing app...

*************************************************************************
** WARNING: Signing with an ad-hoc identity                            **
*************************************************************************

    This app is being signed with an ad-hoc identity. The resulting
    app will run on this computer, but will not run on anyone else's
    computer.

    To generate an app that can be distributed to others, you must
    obtain an application distribution certificate from Apple, and
    select the developer identity associated with that certificate
    when running 'briefcase package'.

*************************************************************************

Signing app with ad-hoc identity...
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.0% • 00:07

[helloworld] Building DMG...
Building dist/Hello World-0.0.1.dmg

[helloworld] Packaged dist/Hello World-0.0.1.dmg

A pasta dist conterá um arquivo chamado Hello World-0.0.1.dmg. Se você localizar esse arquivo no Finder e clicar duas vezes em seu ícone, montará o DMG, fornecendo uma cópia do aplicativo Hello World e um link para a pasta Applications para facilitar a instalação. Arraste o arquivo do aplicativo para Applications e você terá instalado o aplicativo. Envie o arquivo DMG para um amigo e ele poderá fazer o mesmo.

Neste exemplo, usamos a opção --adhoc-sign, ou seja, estamos assinando nosso aplicativo com credenciais ad hoc, credenciais temporárias que só funcionarão em seu computador. Fizemos isso para manter a simplicidade do tutorial. A configuração de identidades de assinatura de código é um pouco complicada, e elas só são necessárias se você pretende distribuir o aplicativo para outras pessoas. Se estivéssemos publicando um aplicativo real para ser usado por outras pessoas, precisaríamos especificar credenciais reais.

Quando estiver pronto para publicar um aplicativo real, consulte o guia de instruções da Briefcase sobre Configuração de uma identidade de assinatura de código do macOS

Próximos passos

Agora temos nosso aplicativo empacotado para distribuição em plataformas de desktop. Mas o que acontece quando precisamos atualizar o código em nosso aplicativo? Como podemos colocar essas atualizações em nosso aplicativo empacotado? Consulte o Tutorial 4 para descobrir…