# Empaqueta tu app

> Del proyecto a la descarga: crea un proyecto de Pyzed con uv, genera un ejecutable independiente con pyzed build en Windows, macOS y Linux, añade un icono y archivos de datos, y compila cada plataforma en CI.

Source: https://albakore.github.io/pyzed/es/tutorials/advanced/packaging/

Tu app funciona en tu máquina. Ahora quieres mandarla a alguien que no tiene Python, no sabe qué es `pip` y debería
poder **abrirla con doble clic**. Este tutorial lleva una app desde una carpeta de proyecto hasta un archivo que
puedes compartir, y luego a una compilación automática para los tres sistemas.

| Objetivo | Tiempo | Nivel | Necesitas |
| --- | --- | --- | --- |
| Una app que se abre con doble clic en Windows, macOS y Linux | 30 minutos (más el tiempo de compilación) | Avanzado · línea de comandos | [uv](https://docs.astral.sh/uv/getting-started/installation/) instalado, una cuenta de GitHub para la última parte |

## Qué vas a aprender

- Crear (o convertir en) un **proyecto de Pyzed**: la estructura que espera `pyzed build`.
- Generar un **ejecutable independiente** para el sistema en el que estás.
- Añadir un **icono**, **archivos de datos** y un **nombre**, y leer los archivos incluidos desde tu código.
- Compilar **todas las plataformas** a la vez con GitHub Actions, y por qué importa firmar.

## Pasos

1. **Parte de un proyecto.** `pyzed build` empaqueta un proyecto de [uv](https://docs.astral.sh/uv/) cuyo
   formulario o script principal está definido en `pyproject.toml`. Crea uno (o usa **Nuevo proyecto** en la
   ventana de bienvenida de Pyzed Design):

**uv:**

```bash title="Windows, macOS y Linux"
uvx --from pyzed-ui pyzed new my-app
cd my-app
uv run pyzed run          # pruébala
```

**pip:**

```bash title="macOS y Linux"
python -m pip install pyzed-ui
pyzed new my-app          # usa uv por debajo: instálalo primero
cd my-app
uv run pyzed run
```

```powershell title="Windows (PowerShell)"
python -m pip install pyzed-ui
pyzed new my-app
cd my-app
uv run pyzed run
```

**python:**

```bash title="Con Pyzed ya instalado"
python -m pyzed new my-app
```

   ¿Ya tienes un proyecto de uv? Ejecuta `pyzed init` dentro. La interfaz vive en `ui/` (formularios y sus
   manejadores) y el backend en `src/my_app/`.

2. **Compila para este ordenador.** Desde la carpeta del proyecto:

**uv:**

```bash title="Windows, macOS y Linux"
uv run pyzed build
```

**pip:**

```bash title="macOS y Linux"
source .venv/bin/activate
pyzed build
```

```powershell title="Windows (PowerShell)"
.venv\Scripts\Activate.ps1
pyzed build
```

**python:**

```bash title="Dentro del entorno del proyecto"
python -m pyzed build
```

   La primera compilación tarda un minuto o dos. El resultado va a `dist/`:

   | Compilado en | Obtienes | Compártelo como |
   | --- | --- | --- |
   | Windows | `dist\my-app\my-app.exe` | Un zip de la carpeta, o un instalador (Inno Setup, WiX) |
   | macOS | `dist/my-app.app` | Un zip o un `.dmg`, firmado y notarizado |
   | Linux | `dist/my-app/my-app` | Un tarball, AppImage, `.deb` o Flatpak |

3. **Pruébala como lo haría un usuario.** Copia la carpeta a otro sitio (o a otra máquina sin Python) y abre el
   ejecutable. Si se cierra enseguida, compila con `--console` para ver el error.

4. **Nombre, icono y archivos de datos.** Añade una tabla `[tool.pyzed.build]` a `pyproject.toml`:

```toml title="pyproject.toml"
[tool.pyzed.build]
name = "Notes"                       # el nombre del ejecutable
icon = "assets/icon.ico"             # .ico en Windows, .icns en macOS
include = ["assets", "data/help.md"] # archivos que tu app lee al ejecutarse
```

   Dentro del paquete, busca esos archivos desde la raíz del paquete:

```python
import sys
from pathlib import Path

ROOT = Path(getattr(sys, "_MEIPASS", Path(__file__).resolve().parents[1]))
help_text = (ROOT / "data" / "help.md").read_text()
```

5. **¿Un archivo o una carpeta?** `pyzed build --onefile` crea un único archivo, práctico para enviar, pero más
   lento al arrancar (se descomprime cada vez) y marcado más a menudo por los antivirus. Una carpeta más un
   instalador es la opción más segura para una versión real.

6. **Todas las plataformas desde CI.** Una compilación solo funciona en el sistema en el que se hizo, así que
   necesitas máquinas Windows, macOS y Linux. GitHub las tiene:

```bash
uv run pyzed build --workflow     # escribe .github/workflows/build.yml
git add .github && git commit -m "Build on every platform" && git push
git tag v1.0.0 && git push --tags # una etiqueta v* lanza la compilación
```

   Cada ejecución guarda las tres carpetas `dist/` como artefactos para descargar.

**Firma:**

Las apps sin firmar funcionan, pero SmartScreen de Windows y Gatekeeper de macOS avisan a los usuarios (macOS puede
negarse a abrirla). Para una versión pública firma el `.exe` de Windows con un certificado de firma de código, y
firma y notariza la `.app` de macOS con un Apple Developer ID. Los comandos están en
[Compilar y distribuir](https://albakore.github.io/pyzed/es/packaging/build/).

**Escritorio hoy, más plataformas después:**

Pyzed compila hoy apps de escritorio para Windows, macOS y Linux. Móvil y web están en la hoja de ruta; la sección
[Distribuir](https://albakore.github.io/pyzed/es/packaging/) dirá cuándo estén listos.

## Siguiente

- [Compilar y distribuir](https://albakore.github.io/pyzed/es/packaging/build/): qué se incluye, cada opción y solución de problemas.
- [Construye una app con el agente de IA](https://albakore.github.io/pyzed/es/tutorials/advanced/ai-agent/).
