Guia para quem quer adicionar suporte a novas distros, criar perfis, ou melhorar módulos existentes.
QXDC/
├── qxdc.sh # Entrypoint CLI
├── lib/
│ ├── common.sh # Logging, flags, is_installed, run()
│ ├── distro.sh # Detecção de distro, pkg_install/remove/update
│ └── config.sh # Parser YAML-like
├── modules/
│ ├── packages/ # install.sh, purge.sh
│ ├── desktop/ # theme.sh, settings.sh, wallpaper.sh
│ ├── apps/ # browser.sh, editor.sh, fastfetch.sh, ...
│ ├── dotfiles/ # deploy.sh + files/
│ └── system/ # hardware.sh, nvidia.sh
├── config/
│ ├── defaults.yml # Configuração base
│ ├── profiles/ # minimal, full, lab, alpine-live, arch-live
│ └── packages-map/ # Mapeamento Debian → Alpine/Arch (referência)
└── tests/
└── shellcheck.sh
Adicione o ID da distro no detect_distro():
case "$DISTRO_ID" in
debian|ubuntu|linuxmint|pop|elementary|zorin)
DISTRO_FAMILY="debian"
;;
alpine)
DISTRO_FAMILY="alpine"
;;
arch|manjaro|endeavouros|garuda)
DISTRO_FAMILY="arch"
;;
sua-distro)
DISTRO_FAMILY="sua-familia"
;;
esacAdicione cases nas funções pkg_install_cmd, pkg_remove_cmd e pkg_update:
sua-familia)
_arr=(seu-pkg-manager install -y)
;;Adicione um case para verificar se um pacote está instalado:
sua-familia)
seu-pkg-manager query "$1" &>/dev/null
;;Crie config/profiles/sua-distro-live.yml com os nomes corretos dos pacotes na sua distro. O perfil deve ser autocontido (não depender de resolução de nomes em runtime).
Crie config/packages-map/sua-distro.yml documentando a correspondência entre nomes Debian e sua distro. Isso serve como referência para outros contribuidores.
Se um módulo tem lógica específica por família (ex: instalar de .deb, usar AUR), adicione um case:
case "$DISTRO_FAMILY" in
debian) ... ;;
alpine) ... ;;
arch) ... ;;
sua-familia) ... ;;
*) log_error "Não suportado em $DISTRO_FAMILY." ;;
esacPerfis ficam em config/profiles/. Copie um existente e ajuste:
# Perfil: meu-perfil
packages:
install:
- pacote1
- pacote2
purge:
- lixo1
desktop:
gtk_theme: Arc-Lighter
icons: Papirus-Dark
# ...
apps:
browser: firefox
editor: mousepadUse com ./qxdc.sh all install --profile meu-perfil --yes.
- Crie
modules/categoria/acao.sh - Siga o template:
#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../../lib/common.sh"
source "$SCRIPT_DIR/../../lib/distro.sh"
source "$SCRIPT_DIR/../../lib/config.sh"
PROFILE="minimal"
parse_common_flags "$@"
set -- "${QXDC_REMAINING_ARGS[@]}"
while [[ $# -gt 0 ]]; do
case "$1" in
--profile) PROFILE="$2"; shift ;;
*) log_error "Flag desconhecida: $1"; exit 1 ;;
esac
shift
done
main() {
log_step "Meu módulo"
load_profile "$PROFILE"
# Sua lógica aqui
# Use pkg_install, run, run_sudo, log_ok, log_error
}
main- O módulo será automaticamente acessível via
./qxdc.sh categoria acao
- Use
pkg_install/pkg_removeem vez de chamar apt/pacman/apk diretamente - Use
runerun_sudopara execução controlada (respeita --dry-run) - Use
log_info,log_ok,log_warn,log_errorpara output - Teste com
--dry-runantes de rodar de verdade - Rode
shellchecknos scripts antes de commitar:bash tests/shellcheck.sh
- Fork o repositório
- Crie um branch descritivo:
feature/suporte-void,fix/tema-arc-xfwm - Faça suas mudanças seguindo as convenções acima
- Teste com
--dry-rune, se possível, numa VM com a distro alvo - Abra um Pull Request descrevendo o que foi feito e testado
| Família | Distros | Gerenciador | Profile |
|---|---|---|---|
| debian | Debian 12+, Ubuntu 22.04+, Mint, Pop | apt | full, minimal, lab |
| alpine | Alpine 3.24+ | apk | alpine-live |
| arch | Arch, Manjaro, EndeavourOS | pacman/yay/paru | arch-live |