Esercitazione 3 - Confezionamento per la distribuzione

Finora abbiamo eseguito la nostra applicazione in «modalità sviluppatore». Questo ci consente di eseguire facilmente la nostra applicazione a livello locale, ma ciò che vogliamo veramente è poterla fornire ad altri.

Tuttavia, non vogliamo insegnare ai nostri utenti come installare Python, creare un ambiente virtuale, clonare un repository git ed eseguire Briefcase in modalità sviluppatore. Preferiamo dare loro un programma di installazione e far sì che l’applicazione funzioni e basta.

Briefcase può essere utilizzato per impacchettare l’applicazione per la distribuzione in questo modo.

Creare lo scaffold dell’applicazione

Poiché è la prima volta che impacchettiamo la nostra applicazione, dobbiamo creare alcuni file di configurazione e altre impalcature per supportare il processo di impacchettamento. Dalla cartella helloworld, eseguire:

(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

Probabilmente avete appena visto passare delle pagine di contenuto nel vostro terminale… cosa è successo? Briefcase ha fatto quanto segue:

  1. Ha generato un modello di applicazione. Per costruire un programma di installazione nativo sono necessari molti file e configurazioni, oltre al codice dell’applicazione vera e propria. Questa impalcatura aggiuntiva è quasi la stessa per ogni applicazione sulla stessa piattaforma, tranne che per il nome dell’applicazione vera e propria che si sta costruendo, quindi Briefcase fornisce un modello di applicazione per ogni piattaforma che supporta. Questo passo esegue il modello, sostituendo il nome dell’applicazione, l’ID del bundle e altre proprietà del file di configurazione, come richiesto per supportare la piattaforma su cui si sta costruendo.

    Se non si è soddisfatti del modello fornito da Briefcase, è possibile crearne uno proprio. Tuttavia, probabilmente non è il caso di farlo prima di aver acquisito un po” di esperienza nell’uso del modello predefinito di Briefcase.

  2. Ha scaricato e installato un pacchetto di supporto. L’approccio alla pacchettizzazione adottato da Briefcase è meglio descritto come «la cosa più semplice che possa funzionare»: spedisce un interprete Python completo e isolato come parte di ogni applicazione che costruisce. Questo è leggermente inefficiente dal punto di vista dello spazio: se si hanno 5 applicazioni pacchettizzate con Briefcase, si avranno 5 copie dell’interprete Python. Tuttavia, questo approccio garantisce che ogni applicazione sia completamente indipendente, utilizzando una versione specifica di Python che è nota per funzionare con l’applicazione.

    Anche in questo caso, Briefcase fornisce un pacchetto di supporto predefinito per ogni piattaforma; se lo si desidera, si può fornire il proprio pacchetto di supporto e farlo includere come parte del processo di compilazione. Questo può essere utile se si hanno particolari opzioni nell’interprete Python che devono essere abilitate, o se si vogliono togliere dalla libreria standard i moduli che non servono in fase di esecuzione.

    Briefcase mantiene una cache locale dei pacchetti di supporto, per cui una volta scaricato un pacchetto di supporto specifico, la copia in cache verrà utilizzata nelle build future.

    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. Si tratta di requisiti dell’applicazione installata. L’applicazione può specificare qualsiasi modulo di terze parti richiesto in fase di esecuzione. Questi saranno installati usando pip nel programma di installazione dell’applicazione.

  4. Ha installato il codice dell’applicazione. L’applicazione avrà il suo codice e le sue risorse (ad esempio, le immagini necessarie per l’esecuzione); questi file vengono copiati nel programma di installazione.

  5. Infine, aggiunge qualsiasi risorsa aggiuntiva necessaria al programma di installazione stesso. Questo include cose come le icone che devono essere allegate all’applicazione finale e le immagini della schermata iniziale.

Una volta completata questa operazione, se si guarda nella cartella del progetto, si dovrebbe vedere una cartella corrispondente alla propria piattaforma (macOS, linux o windows) che contiene file aggiuntivi. Questa è la configurazione di pacchettizzazione specifica della piattaforma per l’applicazione.

Creazione dell’applicazione

È ora possibile compilare l’applicazione. Questo passaggio esegue la compilazione binaria necessaria affinché l’applicazione sia eseguibile sulla piattaforma di destinazione.

(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

Su macOS, il comando build non ha bisogno di compilare nulla, ma deve firmare il contenuto del binario in modo che possa essere eseguito. Questa firma è una firma ad hoc: funzionerà solo sulla vostra macchina; se volete distribuire l’applicazione ad altri, dovrete fornire una firma completa.

Esecuzione dell’applicazione

Ora è possibile utilizzare Briefcase per eseguire l’applicazione:

(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
---------------------------------------------------------------------------

In questo modo si avvia l’esecuzione dell’applicazione nativa, utilizzando l’output del comando build.

È possibile notare alcune piccole differenze nell’aspetto dell’applicazione quando è in esecuzione. Ad esempio, le icone e il nome visualizzati dal sistema operativo potrebbero essere leggermente diversi da quelli visualizzati durante l’esecuzione in modalità sviluppatore. Ciò è dovuto anche al fatto che si sta utilizzando l’applicazione pacchettizzata e non solo il codice Python in esecuzione. Dal punto di vista del sistema operativo, ora si sta eseguendo «un’applicazione», non «un programma Python», e questo si riflette sull’aspetto dell’applicazione.

Creazione del programma di installazione

È ora possibile pacchettizzare l’applicazione per la distribuzione, utilizzando il comando package. Il comando package esegue qualsiasi compilazione necessaria per convertire il progetto scaffolded in un prodotto finale distribuibile. A seconda della piattaforma, ciò può comportare la compilazione di un programma di installazione, l’esecuzione della firma del codice o altre operazioni preliminari alla distribuzione.

(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

La cartella dist conterrà un file chiamato Hello World-0.0.1.dmg. Se individuate questo file nel Finder e fate doppio clic sulla sua icona, monterete il DMG, ottenendo una copia dell’applicazione Hello World e un collegamento alla cartella Applicazioni per facilitare l’installazione. Trascinate il file dell’app in Applicazioni e avrete installato la vostra applicazione. Inviate il file DMG a un amico, che dovrebbe essere in grado di fare lo stesso.

In questo esempio, abbiamo usato l’opzione --adhoc-sign, cioè stiamo firmando la nostra applicazione con credenziali ad hoc, credenziali temporanee che funzioneranno solo sul vostro computer. Abbiamo fatto questo per mantenere il tutorial semplice. L’impostazione delle identità di firma del codice è un po” complicata e sono richieste solo se si intende distribuire la propria applicazione ad altri. Se stessimo pubblicando un’applicazione reale da utilizzare, dovremmo specificare delle credenziali reali.

Quando si è pronti a pubblicare un’applicazione reale, consultare la guida Briefcase How-To su Impostazione di un’identità di firma del codice macOS

Prossimi passi

Ora la nostra applicazione è stata confezionata per essere distribuita su piattaforme desktop. Ma cosa succede quando dobbiamo aggiornare il codice della nostra applicazione? Come facciamo a inserire gli aggiornamenti nella nostra applicazione pacchettizzata? Consultate Tutorial 4 per scoprirlo…