Tutorial 4 - Actualización de la aplicación

En el último tutorial, empaquetamos nuestra aplicación como una aplicación nativa. Si estás tratando con una aplicación del mundo real, eso no va a ser el final de la historia - es probable que hagas algunas pruebas, descubras problemas, y necesites hacer algunos cambios. Incluso si tu aplicación es perfecta, con el tiempo querrás publicar la versión 2 de tu aplicación con mejoras.

¿Cómo se actualiza la aplicación instalada cuando se realizan cambios en el código?

Actualización del código de la aplicación

Actualmente, nuestra aplicación imprime en la consola cuando se pulsa el botón. Sin embargo, las aplicaciones GUI no deberían usar la consola para la salida. Necesitan usar diálogos para comunicarse con los usuarios.

Vamos a añadir un cuadro de diálogo para decir hola, en lugar de escribir en la consola. Modifica el callback say_hello para que se vea así:

def say_hello(self, widget):
    self.main_window.info_dialog(
        f"Hello, {self.name_input.value}",
        "Hi there!",
    )

Esto indica a Toga que abra un cuadro de diálogo modal cuando se pulse el botón.

Si ejecutas briefcase dev, introduces un nombre y pulsas el botón, verás el nuevo cuadro de diálogo:

Hello World Tutorial 4 diálogo, en macOS

Sin embargo, si ejecutas briefcase run, el cuadro de diálogo no aparecerá.

¿Por qué? Bueno, briefcase dev opera ejecutando tu código en su lugar - intenta producir un entorno de ejecución lo más realista posible para tu código, pero no proporciona ni utiliza ninguna de las infraestructuras de la plataforma para empaquetar tu código como una aplicación. Parte del proceso de empaquetar tu aplicación implica copiar tu código dentro del paquete de la aplicación - y por el momento, tu aplicación todavía tiene el código antiguo en ella.

Así que - necesitamos decirle a briefcase que actualice tu aplicación, copiando la nueva versión del código. Podríamos hacerlo borrando el antiguo directorio de la plataforma y empezando desde cero. Sin embargo, Briefcase proporciona una manera más fácil - usted puede actualizar el código de su aplicación empaquetada existente:

(beeware-venv) $ briefcase update

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

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

[helloworld] Application updated.

Si Briefcase no puede encontrar la plantilla de andamiaje, invocará automáticamente create para generar un andamiaje nuevo.

Ahora que hemos actualizado el código del instalador, podemos ejecutar briefcase build para volver a compilar la aplicación, briefcase run para ejecutar la aplicación actualizada, y briefcase package para volver a empaquetar la aplicación para su distribución.

(usuarios de macOS, recordad que como se indica en Tutorial 3, para el tutorial recomendamos ejecutar briefcase package con la bandera --adhoc-sign para evitar la complejidad de configurar una identidad de firma de código y mantener el tutorial lo más simple posible)

Actualizar y ejecutar en un solo paso

Si estás iterando rápidamente cambios en el código, es probable que quieras hacer un cambio en el código, actualizar la aplicación, y volver a ejecutar inmediatamente tu aplicación. Para la mayoría de los propósitos, el modo desarrollador (briefcase dev) será la forma más fácil de hacer este tipo de iteración rápida; sin embargo, si estás probando algo sobre cómo se ejecuta tu aplicación como un binario nativo, o buscando un error que sólo se manifiesta cuando tu aplicación está empaquetada, puede que necesites usar repetidas llamadas a briefcase run. Para simplificar el proceso de actualización y ejecución de la aplicación empaquetada, Briefcase tiene un atajo para soportar este patrón de uso - la opción -u (o --update) en el comando run.

Intentemos hacer otro cambio. Usted puede haber notado que si no escribe un nombre en el cuadro de entrada de texto, el cuadro de diálogo dirá «Hola, «. Vamos a modificar la función say_hello de nuevo para manejar este caso extremo.

En la parte superior del fichero, entre las importaciones y la definición de la clase HelloWorld, añade un método de utilidad para generar un saludo apropiado dependiendo del valor del nombre que se haya proporcionado:

def greeting(name):
    if name:
        return f"Hello, {name}"
    else:
        return "Hello, stranger"

A continuación, modifica la llamada de retorno say_hello para utilizar este nuevo método de utilidad:

def say_hello(self, widget):
    self.main_window.info_dialog(
        greeting(self.name_input.value),
        "Hi there!",
    )

Ejecuta tu aplicación en modo desarrollo (con briefcase dev) para confirmar que la nueva lógica funciona; después actualiza, compila y ejecuta la aplicación con un solo comando:

(beeware-venv) $ briefcase run -u

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

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

[helloworld] Application updated.

[helloworld] Building application...
...

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

[helloworld] Starting app...

El comando package también acepta el argumento -u, de modo que si realizas un cambio en el código de tu aplicación y quieres volver a empaquetarlo inmediatamente, puedes ejecutar briefcase package -u.

Siguientes pasos

Ahora tenemos nuestra aplicación empaquetada para su distribución en plataformas de escritorio, y hemos podido actualizar el código de nuestra aplicación.

Pero, ¿qué pasa con los móviles? En Tutorial 5, convertiremos nuestra aplicación en una aplicación móvil, y la desplegaremos en un simulador de dispositivos, y en un teléfono.