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:
-
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.
-
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.
-
Es installiert Anwendungsanforderungen. Ihre Anwendung kann alle Module von Drittanbietern angeben, die zur Laufzeit benötigt werden. Diese werden mittels
pipin das Installationsprogramm Ihrer Anwendung installiert. -
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.
-
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…