Skip to content

Melhora o script de build Linux com venv, executável único e empacotamento GTK enxuto#17

Open
samuelveigarangel wants to merge 2 commits into
mainfrom
fix/build_linux
Open

Melhora o script de build Linux com venv, executável único e empacotamento GTK enxuto#17
samuelveigarangel wants to merge 2 commits into
mainfrom
fix/build_linux

Conversation

@samuelveigarangel

@samuelveigarangel samuelveigarangel commented Jun 30, 2026

Copy link
Copy Markdown

Descrição

Atualiza packaging/build_linux.sh para tornar o build Linux mais confiável, portável e leve:

  • Cria/ativa automaticamente um .venv com --system-site-packages, permitindo usar o python3-gi do sistema e contornar a restrição PEP 668 do pip.
  • Valida a presença do módulo gi antes do build e exibe instruções de instalação das dependências GTK/WebKit via apt.
  • Gera um executável único (--onefile) em dist/spsvalidator, removendo artefatos antigos de build onedir antes de empacotar.
  • Configura o PyInstaller para usar apenas o backend GTK do pywebview, incluindo imports de gi e webview.platforms.gtk.
  • Exclui backends Qt e ferramentas de desenvolvimento (PyQt6, qtpy, black, pytest, isort) para reduzir o tamanho final do binário.
  • Instala somente dependências de produção (pip install -e .) antes de invocar o PyInstaller.

Arquivo para teste

1676-0611-bn-rpass-11-26-1.zip

Issues

CLOSED #1

@gitnnolabs

Copy link
Copy Markdown
Contributor

Revisando....

@pitangainnovare pitangainnovare left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sugiro que o python adotado seja o do sistema (o que é mais certo de ser obtido por meio de /usr/bin/python ou /usr/bin/python3 em lugar de python3, que pode ser um link para python de conda). Talvez caiba fazer um which python e criar alguma lógica para garantir qual é o python do sistema.

Isso é preciso para que as deps python3-gi, etc, fiquem visíveis para o python correto - veja o erro nos comentários.

  • Sugiro mover o arquivo README para a raiz do repositório
  • Faltou acrescentar instruções de build para linux no PR e no README

rm -rf "$VENV_DIR"
fi
if [[ ! -d "$VENV_DIR" ]]; then
python3 -m venv --system-site-packages "$VENV_DIR"

@pitangainnovare pitangainnovare Jun 30, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se a pessoa possuir o miniconda ou o conda ou outro framework que encapula versões de python, esse código usa o python desse framewor, que não enxerga os pacotes instalados no sistema. E por causa disso, ocorre o erro de Missing GTK bindings (gi).

Sugiro adotar o python disponível em /usr/bin/python3 no lugar desse python3 (que pode ser um atalho para outro python qualquer, inclusive do conda).

Veja o erro persistindo memos após a instalação das deps:

Image

Veja como pode ser resolvido usando o SYSTEM_PYTHON (apenas mudar a linha que chama python3 é o suficiente - para /usr/bin/python3):

#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

VENV_DIR="${ROOT_DIR}/.venv"
SYSTEM_PYTHON="/usr/bin/python3"

_ensure_build_venv() {
  if [[ -d "$VENV_DIR" ]] && ! "$VENV_DIR/bin/python" -c "import gi" >/dev/null 2>&1; then
    echo "Existing venv cannot import gi. Recreating with system-site-packages..."
    rm -rf "$VENV_DIR"
  fi

  if [[ ! -d "$VENV_DIR" ]]; then
    "$SYSTEM_PYTHON" -m venv --system-site-packages "$VENV_DIR"
  fi
}

# Always use this build venv, even if another venv/conda is active.
_ensure_build_venv

# shellcheck source=/dev/null
source "$VENV_DIR/bin/activate"

echo "Using Python: $(python -c 'import sys; print(sys.executable)')"

if ! python -c "import gi" >/dev/null 2>&1; then
  echo "Missing GTK bindings (gi). Install system packages and rebuild:" >&2
  echo "  sudo apt install python3-gi python3-gi-cairo gir1.2-webkit-6.0" >&2
  echo "Also check: /usr/bin/python3 -c 'import gi'" >&2
  exit 1
fi

python -m pip install -U pip
python -m pip install -e .
python -m pip install pyinstaller

rm -rf build/spsvalidator dist/spsvalidator spsvalidator.spec

pyinstaller --noconfirm --clean --onefile --windowed \
  --name spsvalidator \
  --icon src/spsvalidator/web/static/img/icon.png \
  --paths src \
  --collect-data packtools \
  --collect-data spsvalidator \
  --hidden-import pkg_resources \
  --hidden-import requests \
  --hidden-import tenacity \
  --hidden-import langdetect \
  --hidden-import gi \
  --hidden-import gi.repository \
  --hidden-import gi.repository.Gtk \
  --hidden-import gi.repository.WebKit2 \
  --hidden-import webview.platforms.gtk \
  --exclude-module webview.platforms.qt \
  --exclude-module webview.platforms.android \
  --exclude-module webview.platforms.cocoa \
  --exclude-module webview.platforms.winforms \
  --exclude-module webview.platforms.edgechromium \
  --exclude-module qtpy \
  --exclude-module PyQt6 \
  --exclude-module PySide6 \
  --exclude-module black \
  --exclude-module pytest \
  --exclude-module isort \
  --copy-metadata setuptools \
  src/spsvalidator/main.py

echo "Linux executable generated at dist/spsvalidator."
echo "Use linuxdeploy/appimagetool to convert it into AppImage."

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E ao rodar o spspackage gerado, obtive erro por falta de biblioteca.

image

Pode ser importante saber qual é o meu sistema para que você rastrei melhor o que faltou:
image

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esse último foi resolvido instalando gir1.2-webkit2-4.1 via apt install gir1.2-webkit2-4.1. Ainda assim o sistema seguiu acusando ausência de libs. Diria que é preciso tornar o build mais robusto (à prova de KDE e GTK). Ao tentar subir um pacote, o app crashou:

image

Duas opções:

  1. Gerar build linux para gtk e gerar outra build linux para kde.
  2. Aumentar as deps instaladas para garantir bom funcionamento em maior número de IDEs

@samuelveigarangel samuelveigarangel Jun 30, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eu posso inserir uma dependência python no arquivo pyproject.toml para ele utilizar essa dependencia. O que tu acha?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ou eu posso gerar esse arquivo atraves de um docker temporario.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

É uma ótima alternativa.

Garantir que o executável rode corretamente em gtk e qt é importante.

- Altera script para funcionar com interfaces GTK e QT
@samuelveigarangel samuelveigarangel added the enhancement New feature or request label Jul 1, 2026

@pitangainnovare pitangainnovare left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dois PRs (este e o #19). O comentário feito em #19 (review) pode ser mais adequado a este PR

@robertatakenaka

Copy link
Copy Markdown
Member

PR #19 atende a #17

@Rossi-Luciano

Copy link
Copy Markdown
Contributor

Testei este PR localmente (Ubuntu 24.04, python3-pyqt5 já instalado via apt) e bash packaging/build_linux.sh falha antes de gerar o binário: conflito entre o PyQt5 do sistema (visível pela venv --system-site-packages) e o PyQt6 que pywebview[qt] instala. Deixei a revisão completa e os detalhes de reprodução no #19, que já inclui este diff: #19 (comment)

@Rossi-Luciano Rossi-Luciano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testei localmente e bash packaging/build_linux.sh falha antes de gerar o binário (conflito PyQt5/PyQt6). Detalhes completos no comentário acima e na revisão publicada no #19.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SPSValidator — build e execução (Linux e Windows)

5 participants