dependencies.sh¶
Gerenciamento automático de dependências externas e helpers para operações com gerenciadores de pacotes.
Funções¶
command_exists()¶
Verifica se um comando existe no sistema.
Parâmetros:
$1- Nome do comando
Retorno:
0- Comando existe1- Comando não encontrado
Uso:
if command_exists "docker"; then
echo "Docker está instalado"
else
echo "Docker não encontrado"
fi
# Verificar antes de usar
if command_exists "jq"; then
version=$(cat file.json | jq -r '.version')
fi
check_dependencies()¶
Verifica se múltiplas dependências estão instaladas.
Parâmetros:
$@- Lista de comandos a verificar
Retorno:
0- Todas as dependências estão instaladas1- Uma ou mais dependências estão faltando (exibe log de erro)
Uso:
# Verificar múltiplas dependências
if check_dependencies "git" "curl" "jq"; then
echo "Todas as dependências estão instaladas"
# Prosseguir com a operação
else
echo "Instale as dependências faltando"
exit 1
fi
# Exemplo prático
check_dependencies "docker" "docker-compose" || exit 1
docker-compose up -d
Mensagem de erro:
Quando dependências estão faltando, a função exibe:
wait_for_apt_lock()¶
Aguarda até que o lock do apt seja liberado antes de executar comandos apt-get.
Parâmetros: Nenhum
Retorno:
0- Lock liberado, pode prosseguir1- Timeout (60 segundos)
Comportamento:
- Verifica se há locks ativos em
/var/lib/apt/lists/lock,/var/lib/dpkg/locke/var/lib/dpkg/lock-frontend - Aguarda até 60 segundos para os processos finalizarem
- Mostra mensagem informativa ao usuário
- Verifica a cada 2 segundos
Uso:
# Antes de usar apt-get, aguarde o lock ser liberado
wait_for_apt_lock || exit 1
sudo apt-get update
sudo apt-get install -y podman
Cenário comum:
# Evita erro "Could not get lock /var/lib/apt/lists/lock"
if command -v apt-get &>/dev/null; then
wait_for_apt_lock || return 1
sudo apt-get update -qq
sudo apt-get install -y meu-pacote
fi
ensure_curl_installed()¶
Garante que curl está instalado, tentando instalar automaticamente se necessário.
Retorno:
0- curl disponível1- Falha na instalação
Suporte:
- Debian/Ubuntu:
apt-get install curl - Fedora/RHEL:
dnf/yum install curl - macOS:
brew install curl
Uso:
ensure_jq_installed()¶
Garante que jq está instalado, tentando instalar automaticamente se necessário.
Retorno:
0- jq disponível1- Falha na instalação
Suporte:
- Debian/Ubuntu:
apt-get install jq - Fedora/RHEL:
dnf/yum install jq - macOS:
brew install jq
Uso:
ensure_jq_installed || exit 1
version=$(curl -s https://api.github.com/repos/owner/repo/releases/latest | jq -r '.tag_name')
ensure_fzf_installed()¶
Garante que fzf está instalado, baixando da última release do GitHub se necessário.
Retorno:
0- fzf disponível1- Falha na instalação
Comportamento:
- Verifica se
fzfjá está disponível - Se não, descobre a versão mais recente do GitHub
- Detecta plataforma e arquitetura
- Baixa e extrai tarball correto
- Instala em
/usr/local/bin/fzf(requer sudo)
Dependências: Requer curl e jq (instala automaticamente)
Uso:
ensure_pip3_installed()¶
Garante que pip3 está instalado, tentando instalar automaticamente se necessário.
Retorno:
0- pip3 disponível1- Falha na instalação
Suporte:
- Debian/Ubuntu:
apt-get install python3-pip - Fedora/RHEL:
dnf/yum install python3-pip
Comportamento:
- Verifica se
pip3já está disponível - Se não, detecta o gerenciador de pacotes (apt/dnf/yum)
- Para apt-get, chama
wait_for_apt_lock()antes de instalar - Instala
python3-pipusando o gerenciador apropriado - Verifica se a instalação foi bem-sucedida
Uso:
Uso com pacotes Python:
# Instalar pip3 e depois um pacote
if ensure_pip3_installed; then
log_info "Instalando podman-compose..."
pip3 install --user podman-compose
else
log_error "pip3 é necessário mas não pôde ser instalado"
exit 1
fi
Exemplo Completo¶
#!/bin/bash
source "$LIB_DIR/dependencies.sh"
source "$LIB_DIR/logger.sh"
log_info "Verificando dependências..."
# Garante todas as dependências
ensure_curl_installed || exit 1
ensure_jq_installed || exit 1
ensure_fzf_installed || exit 1
log_success "Todas as dependências instaladas!"
# Usa as dependências
config_name=$(jq -r '.name' cli.json)
selected_env=$(echo -e "dev\nstaging\nprod" | fzf --prompt="Ambiente: ")
log_info "CLI: $config_name"
log_info "Ambiente selecionado: $selected_env"
Exemplo com Gerenciador de Pacotes¶
#!/bin/bash
source "$LIB_DIR/dependencies.sh"
source "$LIB_DIR/logger.sh"
install_package() {
local package_name="$1"
if command -v apt-get &>/dev/null; then
log_info "Instalando $package_name via apt-get..."
# Aguarda lock ser liberado
wait_for_apt_lock || return 1
sudo apt-get update -qq
sudo apt-get install -y "$package_name"
elif command -v dnf &>/dev/null; then
log_info "Instalando $package_name via dnf..."
sudo dnf install -y "$package_name"
elif command -v yum &>/dev/null; then
log_info "Instalando $package_name via yum..."
sudo yum install -y "$package_name"
else
log_error "Gerenciador de pacotes não suportado"
return 1
fi
}
# Instala pacotes
install_package "curl"
install_package "git"
Boas Práticas¶
- Sempre verifique dependências no início do script
- Use
|| exit 1para falhar rápido se dependência não instalar - Informe o usuário sobre instalações automáticas
- Sempre use
wait_for_apt_lock()antes de comandos apt-get para evitar conflitos - Detecte o gerenciador de pacotes correto (apt/dnf/yum) para melhor compatibilidade