Zum Inhalt

Tutorial 3 - Verpackung für den Vertrieb

Bisher haben wir unsere Anwendung im Entwicklermodus ausgeführt. Das macht es uns leicht, unsere Anwendung lokal auszuführen – aber was wir wirklich wollen, ist, unsere Anwendung anderen zur Verfügung stellen zu können.

Wir möchten unseren Benutzern jedoch nicht beibringen müssen, wie sie Python installieren, eine virtuelle Umgebung erstellen, ein Git-Repository klonen und Briefcase im Entwicklermodus ausführen. Wir möchten ihnen lieber einfach ein Installationsprogramm zur Verfügung stellen, damit die Anwendung einfach funktioniert.

Briefcase kann verwendet werden, um Ihre Anwendung für die Verteilung auf diese Weise zu verpacken.

Erstellen Ihres Anwendungsgerüsts

Da dies das erste Mal ist, dass wir unsere Anwendung paketieren, müssen wir einige Konfigurationsdateien und andere Gerüste erstellen, um den Paketierungsprozess zu unterstützen. Starten Sie im Verzeichnis helloworld:

(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
(beeware-venv) $ briefcase create

[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10

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

[helloworld] Installing support package...
No support package required.

[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/linux/ubuntu/jammy

Fehler bei Python-Versionen

Wenn Sie eine Fehlermeldung erhalten, die in etwa wie folgt lautet:

Die zur Ausführung von Briefcase verwendete Python-Version (3.12) ist nicht die System-Python-Version (3.10).

Sie müssen Ihre virtuelle Umgebung mit dem System python3 neu erstellen. Die Verwendung des Systems Python ist eine Voraussetzung für die Paketierung Ihrer Anwendung.

(beeware-venv) C:\...>briefcase create

[helloworld] Generating application template...
Using app template: https://github.com/beeware/briefcase-windows-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] Created build\helloworld\windows\app

Wahrscheinlich haben Sie gerade gesehen, wie seitenweise Inhalte an Ihrem Terminal vorbeigezogen sind… was ist also passiert? Briefcase hat das Folgende getan:

  1. Es generiert eine Anwendungsvorlage. Um ein natives Installationsprogramm zu erstellen, sind eine Menge Dateien und Konfigurationen erforderlich, die über den Code der eigentlichen Anwendung hinausgehen. Dieses zusätzliche Gerüst ist für jede Anwendung auf der gleichen Plattform fast gleich, mit Ausnahme des Namens der eigentlichen Anwendung, die erstellt wird - daher bietet Briefcase eine Anwendungsvorlage für jede unterstützte Plattform. In diesem Schritt wird die Vorlage ausgerollt, wobei der Name Ihrer Anwendung, die Bundle-ID und andere Eigenschaften Ihrer Konfigurationsdatei entsprechend der Plattform, auf der Sie bauen, ersetzt werden. Wenn Sie mit der von Briefcase bereitgestellten Vorlage nicht zufrieden sind, können Sie Ihre eigene Vorlage erstellen. Sie sollten dies jedoch erst dann tun, wenn Sie etwas mehr Erfahrung mit der Standardvorlage von Briefcase haben.

  2. Es lud ein Support-Paket herunter und installierte es. Der von Briefcase verfolgte Paketierungsansatz lässt sich am besten als "das Einfachste, was überhaupt möglich ist" beschreiben - es liefert einen vollständigen, isolierten Python-Interpreter als Teil jeder Anwendung aus, die es erstellt (mit Ausnahme der Pakete für das native Linux-System). Dies ist etwas platzraubend - wenn Sie 5 Anwendungen mit Briefcase paketieren, haben Sie 5 Kopien des Python-Interpreters. Dieser Ansatz garantiert jedoch, dass jede Anwendung völlig unabhängig ist und eine bestimmte Python-Version verwendet, von der bekannt ist, dass sie mit der Anwendung funktioniert. Auch hier bietet Briefcase ein Standard-Unterstützungspaket für jede Plattform; wenn Sie möchten, können Sie Ihr eigenes Unterstützungspaket bereitstellen und dieses als Teil des Erstellungsprozesses einbinden lassen. Dies kann sinnvoll sein, wenn Sie bestimmte Optionen im Python-Interpreter aktiviert haben möchten oder wenn Sie Module aus der Standardbibliothek entfernen möchten, die Sie zur Laufzeit nicht benötigen. Briefcase verwaltet einen lokalen Zwischenspeicher für Support-Pakete. Wenn Sie also ein bestimmtes Support-Paket heruntergeladen haben, wird diese zwischengespeicherte Kopie bei zukünftigen Builds verwendet. Wenn Briefcase eine Anwendung als natives Linux-Systempaket packt (das Standard-Paketformat für Linux), wird kein Support-Paket mit der Anwendung mitgeliefert, wie oben erwähnt. Stattdessen verwendet die Anwendung das Python, das von der jeweiligen Linux-Distribution bereitgestellt wird.

  3. Es installiert Anwendungsanforderungen. Ihre Anwendung kann alle Module von Drittanbietern angeben, die zur Laufzeit benötigt werden. Diese werden mittels pip in das Installationsprogramm Ihrer Anwendung installiert.

  4. Es Installiert Ihren Anwendungscode. Ihre Anwendung hat ihren eigenen Code und Ressourcen (z. B. Bilder, die zur Laufzeit benötigt werden); diese Dateien werden in das Installationsprogramm kopiert.

  5. Er installiert die von Ihrer Anwendung benötigten Ressourcen. Schließlich fügt er alle zusätzlichen Ressourcen hinzu, die das Installationsprogramm selbst benötigt. Dazu gehören Dinge wie Symbole, die an die endgültige Anwendung angehängt werden müssen, und Splash-Screen-Bilder.

Sobald dies abgeschlossen ist, sollten Sie im Projektverzeichnis ein Verzeichnis sehen, das Ihrer Plattform entspricht (macOS, linux oder windows) und zusätzliche Dateien enthält. Dies ist die plattformspezifische Paketierungskonfiguration für Ihre Anwendung.

Erstellung Ihrer Anwendung

Sie können nun Ihre Anwendung kompilieren. In diesem Schritt wird die Binärkompilierung durchgeführt, die erforderlich ist, damit Ihre Anwendung auf Ihrer Zielplattform ausgeführt werden kann.

(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

Unter macOS muss der Befehl build nichts kompilieren, aber er muss den Inhalt der Binärdatei signieren, damit sie ausgeführt werden kann. Diese Signatur ist eine ad hoc Signatur - sie funktioniert nur auf Ihrem Rechner; wenn Sie die Anwendung an andere weitergeben wollen, müssen Sie eine vollständige Signatur bereitstellen.

(beeware-venv) $ briefcase build

[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10

[helloworld] Building application...
Build bootstrap binary...
make: Entering directory '/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/bootstrap'
...
make: Leaving directory '/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/bootstrap'
Building bootstrap binary... done
Installing license... done
Installing changelog... done
Installing man page... done
Updating file permissions... done
Stripping binary... done

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

Sobald dieser Schritt abgeschlossen ist, wird der build-Ordner einen helloworld-0.0.1-Ordner enthalten, der einen Spiegel des Linux /usr-Dateisystems enthält. Dieser Spiegel des Dateisystems enthält einen bin-Ordner mit einer helloworld-Binärdatei, sowie die lib- und share-Ordner, die zur Unterstützung der Binärdatei benötigt werden.

(beeware-venv) C:\...>briefcase build
Setting stub app details... done

[helloworld] Built build\helloworld\windows\app\src\Hello World.exe

Unter Windows muss der build-Befehl nichts kompilieren, aber er muss einige Metadaten schreiben, damit die Anwendung ihren Namen, ihre Version und so weiter kennt.

Auslösen von Antivirus

Da diese Metadaten direkt in die vorkompilierte Binärdatei geschrieben werden, die während des create-Befehls aus der Vorlage ausgerollt wird, kann dies Antivirensoftware auf Ihrem Rechner auslösen und verhindern, dass die Metadaten geschrieben werden. In diesem Fall weisen Sie das Antivirusprogramm an, die Ausführung des Tools (mit dem Namen rcedit-x64.exe) zu erlauben und führen Sie den obigen Befehl erneut aus.

Ausführen Ihrer Anwendung

Sie können nun Briefcase verwenden, um Ihre Anwendung auszuführen:

(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
---------------------------------------------------------------------------
(beeware-venv) $ briefcase run

[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10

[helloworld] Starting app...
===========================================================================
Install path: /home/brutus/beeware-tutorial/helloworld/build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr
Pre-initializing Python runtime...
PYTHONPATH:
- /usr/lib/python3.10
- /usr/lib/python3.10/lib-dynload
- /home/brutus/beeware-tutorial/helloworld/build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/lib/helloworld/app
- /home/brutus/beeware-tutorial/helloworld/build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/lib/helloworld/app_packages
Configure argc/argv...
Initializing Python runtime...
Running app module: helloworld
---------------------------------------------------------------------------
(beeware-venv) C:\...>briefcase run

[helloworld] Starting app...

===========================================================================
Log started: 2023-04-23 04:47:45Z
PreInitializing Python runtime...
PythonHome: C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src
PYTHONPATH:
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\python39.zip
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app_packages
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app
Configure argc/argv...
Initializing Python runtime...
Running app module: helloworld
---------------------------------------------------------------------------

Dies startet Ihre native Anwendung unter Verwendung der Ausgabe des build Befehls.

Möglicherweise bemerken Sie einige kleine Unterschiede im Aussehen Ihrer Anwendung, wenn sie ausgeführt wird. Beispielsweise können die vom Betriebssystem angezeigten Symbole und der Name etwas anders aussehen als bei der Ausführung im Entwicklermodus. Das liegt auch daran, dass Sie die gepackte Anwendung verwenden und nicht nur den Python-Code ausführen. Aus der Sicht des Betriebssystems führen Sie nun "eine Anwendung" und nicht "ein Python-Programm" aus, was sich in der Darstellung der Anwendung widerspiegelt.

Bevor Sie fortfahren, schließen Sie die App. Wie in den vorherigen Schritten des Tutorials können Sie dies tun, indem Sie auf die Schaltfläche „Schließen“ im Anwendungsfenster klicken, im Menü der Anwendung „Beenden/Exit“ auswählen oder Strg+C in dem Terminal eingeben, in dem Sie briefcase run ausgeführt haben.

Erstellung Ihres Installationsprogramms

Sie können nun Ihre Anwendung mit dem Befehl package zur Verteilung verpacken. Der Befehl package führt alle Kompilierungen durch, die notwendig sind, um das gerüstete Projekt in ein endgültiges, verteilbares Produkt zu verwandeln. Abhängig von der Plattform kann dies die Kompilierung eines Installationsprogramms, die Durchführung einer Codesignierung oder andere Aufgaben vor der Verteilung beinhalten.

(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

Der Ordner dist enthält eine Datei namens Hello World-0.0.1.dmg. Wenn Sie diese Datei im Finder finden und auf das Symbol doppelklicken, wird die DMG-Datei gemountet und Sie erhalten eine Kopie der Hello World-Anwendung und einen Link zu Ihrem Programme-Ordner für eine einfache Installation. Ziehen Sie die Anwendungsdatei in den Ordner Programme, und schon ist Ihre Anwendung installiert. Schicken Sie die DMG-Datei an einen Freund oder eine Freundin, der/die das Gleiche tun kann.

In diesem Beispiel haben wir die Option --adhoc-sign verwendet, d.h. wir signieren unsere Anwendung mit ad hoc Anmeldeinformationen - temporären Anmeldeinformationen, die nur auf Ihrem Rechner funktionieren. Wir haben dies getan, um das Tutorial einfach zu halten. Das Einrichten von Code-Signatur-Identitäten ist ein wenig fummelig, und sie sind nur erforderlich, wenn Sie Ihre Anwendung an andere weitergeben wollen. Würden wir eine echte Anwendung veröffentlichen, die andere nutzen können, müssten wir echte Anmeldeinformationen angeben.

Wenn Sie bereit sind, eine echte Anwendung zu veröffentlichen, sehen Sie sich die Briefcase-Anleitung zum Thema Einrichten einer macOS Code Signing Identity an

Die Ausgabe des Paketschritts wird je nach Linux-Distribution leicht unterschiedlich sein. Wenn Sie mit einer von Debian abgeleiteten Distribution arbeiten, werden Sie sehen:

(beeware-venv) $ briefcase package

[helloworld] Finalizing application configuration...
Targeting ubuntu:jammy (Vendor base debian)
Determining glibc version... done
Targeting glibc 2.35
Targeting Python3.10

[helloworld] Building .deb package...
Write Debian package control file... done

dpkg-deb: building package 'helloworld' in 'helloworld-0.0.1.deb'.
Building Debian package... done

[helloworld] Packaged dist/helloworld_0.0.1-1~ubuntu-jammy_amd64.deb

Der dist-Ordner enthält die .deb-Datei, die erzeugt wurde.

Wenn Sie mit einer RHEL-basierten Distribution arbeiten, werden Sie es sehen:

(beeware-venv) $ briefcase package

[helloworld] Finalizing application configuration...
Targeting fedora:40 (Vendor base rhel)
Determining glibc version... done
Targeting glibc 2.39
Targeting Python3.12

[helloworld] Building .rpm package...
Generating rpmbuild layout... done

Write RPM spec file... done

Building source archive... done

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.Kav9H7
+ umask 022
...
+ exit 0
Building RPM package... done

[helloworld] Packaged dist/helloworld-0.0.1-1.fc40.x86_64.rpm

Der Ordner dist enthält die erzeugte .rpm-Datei.

Wenn Sie mit einer Arch-basierten Distribution arbeiten, werden Sie es sehen:

(beeware-venv) $ briefcase package

[helloworld] Finalizing application configuration...
Targeting arch:20240101 (Vendor base arch)
Determining glibc version... done
Targeting glibc 2.38
Targeting Python3.12

[helloworld] Building .pkg.tar.zst package...
...
Building Arch package... done

[helloworld] Packaged dist/helloworld-0.0.1-1-x86_64.pkg.tar.zst

Der Ordner dist enthält die Datei .pkg.tar.zst, die erzeugt wurde.

Andere Linux-Distributionen werden derzeit nicht für die Paketierung unterstützt.

Wenn Sie ein Paket für eine andere Linux-Distribution als die, die Sie verwenden, erstellen möchten, kann Briefcase ebenfalls helfen - allerdings müssen Sie Docker installieren.

Offizielle Installationsprogramme für die Docker Engine sind für eine Reihe von Unix-Distributionen verfügbar. Folgen Sie den Anweisungen für Ihre Plattform; stellen Sie jedoch sicher, dass Sie Docker nicht im "Rootless"-Modus installieren.

Sobald Sie Docker installiert haben, sollten Sie in der Lage sein, einen Linux-Container zu starten - zum Beispiel:

$ docker run --rm -it ubuntu:22.04

zeigt Ihnen eine Unix-Eingabeaufforderung (etwa root@84444e31cff9:/#) innerhalb eines Ubuntu 22.04 Docker-Containers. Geben Sie Strg-D ein, um Docker zu beenden und zu Ihrer lokalen Shell zurückzukehren.

Sobald Sie Docker installiert haben, können Sie Briefcase verwenden, um ein Paket für jede Linux-Distribution zu erstellen, die Briefcase unterstützt, indem Sie ein Docker-Image als Argument übergeben. Um beispielsweise ein DEB-Paket für Ubuntu 22.04 (Jammy) zu erstellen, können Sie, unabhängig vom Betriebssystem, das Sie verwenden, Folgendes ausführen:

$ briefcase package --target ubuntu:jammy

Dadurch wird das Docker-Image für das von Ihnen ausgewählte Betriebssystem heruntergeladen, ein Container erstellt, der Briefcase-Builds ausführen kann, und das Anwendungspaket innerhalb des Images erstellt. Sobald dies abgeschlossen ist, enthält der Ordner dist das Paket für die Linux-Zieldistribution.

(beeware-venv) C:\...>briefcase package

*************************************************************************
** WARNING: No signing identity provided                               **
*************************************************************************

    Briefcase will not sign the app. To provide a signing identity,
    use the `--identity` option; or, to explicitly disable signing,
    use `--adhoc-sign`.

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

[helloworld] Building MSI...
Compiling application manifest...
Compiling... done

Compiling application installer...
helloworld.wxs
helloworld-manifest.wxs
Compiling... done

Linking application installer...
Linking... done

[helloworld] Packaged dist\Hello_World-0.0.1.msi

In diesem Beispiel haben wir die Option --adhoc-sign verwendet, d.h. wir signieren unsere Anwendung mit ad hoc Anmeldeinformationen - temporären Anmeldeinformationen, die nur auf Ihrem Rechner funktionieren. Wir haben dies getan, um das Tutorial einfach zu halten. Das Einrichten von Code-Signatur-Identitäten ist ein wenig fummelig, und sie sind nur erforderlich, wenn Sie Ihre Anwendung an andere weitergeben wollen. Würden wir eine echte Anwendung veröffentlichen, die andere nutzen können, müssten wir echte Anmeldeinformationen angeben.

Wenn Sie bereit sind, eine echte Anwendung zu veröffentlichen, sehen Sie sich die Briefcase-Anleitung zum Thema Einrichten einer macOS Code Signing Identity an

Sobald dieser Schritt abgeschlossen ist, enthält der Ordner dist eine Datei mit dem Namen Hello_World-0.0.1.msi. Wenn Sie auf dieses Installationsprogramm doppelklicken, um es zu starten, sollten Sie den bekannten Windows-Installationsprozess durchlaufen. Sobald die Installation abgeschlossen ist, finden Sie einen "Hello World"-Eintrag in Ihrem Startmenü.

Nächste Schritte

Wir haben unsere Anwendung jetzt für die Verteilung auf Desktop-Plattformen verpackt. Aber was passiert, wenn wir den Code in unserer Anwendung aktualisieren müssen? Wie bekommen wir diese Aktualisierungen in unsere gepackte Anwendung? Lesen Sie Tutorial 4, um das herauszufinden…