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] Anwendungsvorlage wird erstellt...
Verwendung der App-Vorlage: https://github.com/beeware/briefcase-macOS-app-template.git, Zweig v0.3.18
...

[helloworld] Support-Paket wird installiert...
...

[helloworld] Anwendungscode wird installiert...
Installiere src/helloworld... fertig

[helloworld] Installiere Anforderungen...
...

[helloworld] Installiere Anwendungsressourcen...
...

[helloworld] Entferne nicht benötigte App-Inhalte...
Entferne nicht benötigte App-Bundle-Inhalte... fertig

[helloworld] Erstellte build/helloworld/macos/app
(beeware-venv) $ briefcase create

[helloworld] Anwendungskonfiguration wird abgeschlossen...
Zielplattform: ubuntu:jammy (Vendor-Base-Debian)
Glibc-Version wird ermittelt... fertig
Glibc 2.35 wird verwendet
Python 3.10 wird verwendet

[helloworld] Anwendungsvorlage wird generiert...
Verwendung der App-Vorlage: https://github.com/beeware/briefcase-linux-AppImage-template.git, Zweig v0.3.18
...

[helloworld] Support-Paket wird installiert...
Kein Support-Paket erforderlich.

[helloworld] Anwendungscode wird installiert...
Installation von src/helloworld... fertig

[helloworld] Anforderungen werden installiert...
...

[helloworld] Anwendungsressourcen werden installiert...
...

[helloworld] Nicht benötigte App-Inhalte werden entfernt...
Nicht benötigte App-Bundle-Inhalte werden entfernt... fertig

[helloworld] Erstellt: 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] Anwendungsvorlage wird generiert...
Anwendungsvorlage wird verwendet: https://github.com/beeware/briefcase-windows-app-template.git, Zweig v0.3.18
...

[helloworld] Support-Paket wird installiert...
...

[helloworld] Anwendungscode wird installiert...
Installation von src/helloworld... fertig

[helloworld] Voraussetzungen werden installiert...
...

[helloworld] Anwendungsressourcen werden installiert...
...

[helloworld] Erstellt: 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 Verzeichnis build des Projekts nun ein Verzeichnis sehen, das Ihrer Plattform entspricht (macOS, linux oder windows) und zusätzliche Dateien enthält. Dies ist die plattformspezifische Paketkonfiguration für Ihre Anwendung. Unter macOS enthält Ihr Projektverzeichnis nun beispielsweise:

helloworld/
└── build/
    └── helloworld/
 └── macos/

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] Ad-hoc-Signierung der App...
...
Signierung von build/helloworld/macos/app/Hello World.app
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100,0 % • 00:07

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

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] Anwendungskonfiguration wird abgeschlossen...
Ziel: ubuntu:jammy (Vendor-Basis Debian)
Glibc-Version wird ermittelt... fertig
Ziel: glibc 2.35
Ziel: Python 3.10

[helloworld] Anwendung wird erstellt...
Bootstrap-Binärdatei erstellen...
make: Verzeichnis '/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/bootstrap' betreten
...
make: Verzeichnis '/home/brutus/beeware-tutorial/helloworld/build/linux/ubuntu/jammy/bootstrap' verlassen
Bootstrap-Binärdatei wird erstellt... fertig
Lizenz wird installiert... fertig
Changelog wird installiert... fertig
Man-Seite wird installiert... fertig
Dateiberechtigungen werden aktualisiert... fertig
Binärdatei wird gestrippt... fertig

[helloworld] Erstellt: 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
Details der Stub-App werden festgelegt... fertig

[helloworld] Erstellt: 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] App wird gestartet...
===========================================================================
Isoliertes Python wird konfiguriert...
Python-Laufzeitumgebung wird vorinitialisiert...
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
- /Benutzer/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/app
argc/argv konfigurieren...
Python-Laufzeitumgebung initialisieren...
Python-NSLog-Handler installieren...
App-Modul ausführen: helloworld
---------------------------------------------------------------------------
(beeware-venv) $ briefcase run

[helloworld] Anwendungskonfiguration wird abgeschlossen...
Ziel: ubuntu:jammy (Vendor-Basis Debian)
Glibc-Version wird ermittelt... fertig
Ziel: glibc 2.35
Ziel: Python 3.10

[helloworld] App wird gestartet...
===========================================================================
Installationspfad: /home/brutus/beeware-tutorial/helloworld/build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr
Vorinitialisierung der Python-Laufzeitumgebung...
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
Konfiguriere argc/argv...
Python-Laufzeitumgebung wird initialisiert...
App-Modul wird ausgeführt: helloworld
---------------------------------------------------------------------------
(beeware-venv) C:\...>briefcase run

[helloworld] App wird gestartet...

===========================================================================
Protokoll gestartet: 2023-04-23 04:47:45Z
Python-Laufzeitumgebung wird vorinitialisiert...
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:\Benutzer\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app_packages
- C:\Benutzer\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app
argc/argv konfigurieren...
Python-Laufzeitumgebung wird initialisiert...
App-Modul wird ausgeführt: 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] App wird signiert...

*************************************************************************
** WARNUNG: Signieren mit einer Ad-hoc-Identität **
*************************************************************************

 Diese App wird mit einer Ad-hoc-Identität signiert. Die resultierende
    App läuft auf diesem Computer, jedoch nicht auf dem Computer anderer
    Benutzer.

 Um eine App zu erstellen, die an andere verteilt werden kann, müssen Sie
    ein Anwendungsverteilungszertifikat von Apple beziehen und
    die mit diesem Zertifikat verknüpfte Entwickleridentität auswählen,
    wenn Sie „briefcase package“ ausführen.

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

App mit Ad-hoc-Identität signieren...
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100,0 % • 00:07

[helloworld] DMG erstellen...
Erstellen von dist/Hello World-0.0.1.dmg

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

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] Anwendungskonfiguration wird abgeschlossen...
Ziel: ubuntu:jammy (Vendor-Base-Debian)
Glibc-Version wird ermittelt... fertig
Ziel: glibc 2.35
Ziel: Python 3.10

[helloworld] .deb-Paket wird erstellt...
Debian-Paketkontrolldatei schreiben... fertig

dpkg-deb: Paket „helloworld“ in „helloworld-0.0.1.deb“ erstellen.
Debian-Paket erstellen... fertig

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

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] Anwendungskonfiguration wird abgeschlossen...
Ziel: fedora:40 (Vendor base rhel)
Glibc-Version ermitteln... fertig
Ziel: glibc 2.39
Ziel: Python3.12

[helloworld] .rpm-Paket erstellen...
Rpmbuild-Layout generieren... fertig

RPM-Spezifikationsdatei schreiben... fertig

Quellarchiv erstellen... fertig

Ausführen von (%prep): /bin/sh -e /var/tmp/rpm-tmp.Kav9H7
+ umask 022
...
+ exit 0
Erstellen des RPM-Pakets... fertig

[helloworld] Paketiert: 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] Anwendungskonfiguration wird abgeschlossen...
Zielarchitektur: arch:20240101 (Vendor-Basisarchitektur)
Glibc-Version wird ermittelt... fertig
Ziel-Glibc: 2.38
Ziel: Python 3.12

[helloworld] .pkg.tar.zst-Paket wird erstellt...
...
Arch-Paket wird erstellt... fertig

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

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

*************************************************************************
** WARNUNG: Keine Signaturidentität angegeben **
*************************************************************************

    Briefcase signiert die App nicht. Um eine Signaturidentität anzugeben,
    verwenden Sie die Option `--identity`; oder, um die Signatur explizit zu deaktivieren,
    verwenden Sie `--adhoc-sign`.

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

[helloworld] MSI wird erstellt...
Anwendungsmanifest wird kompiliert...
Kompilieren... fertig

Anwendungsinstallationsprogramm wird kompiliert...
helloworld.wxs
helloworld-manifest.wxs
Kompilieren... fertig

Anwendungsinstallationsprogramm wird verknüpft...
Verknüpfen... fertig

[helloworld] Paketiert 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…