Distribuindo aplicações em pacotes .deb

DebianÉ muito comum ver pessoas — em fóruns e listas de discussão — perguntando como fazer para gerar instaladores para suas aplicações. Mesmo no mundo Java, o que não falta são opções.

Se você acompanha este blog, é bem provável que você o esteja lendo agora com o Firefox rodando em um sistema GNU/Linux. E, se você está lendo este texto com o IE no Windows, só está fazendo isso porque é obrigado. Afinal, quem — em sã consciência — usa Windows/IE? :P

Enfim… o que muita gente ainda não percebeu é que esse procedimento de gerar instaladores é, de certa forma, uma “reinvenção da roda”, pelo menos quando se deseja instalar algo em um sistema GNU/Linux. Vamos supor que eu deseje distribuir uma aplicação minha em sistemas Debian. Por que eu iria querer gerar um instalador se eu posso fazer uso do sistema nativo de gerenciamento de pacotes, que, por sinal, é extremamente poderoso?

Um exemplo básico que ilustra o que estou falando:

# dpkg -i aplicacao.deb

Esse comandinho porcaria aí instala a aplicação contida no arquivo .deb. Simples assim. Ah, e se essa aplicação depender de outras que não estejam instaladas? Tais aplicações são automaticamente baixadas e instaladas! Tente, no Windows, instalar uma aplicação que precise do .Net (que você não tem instalado)… é bem provável que, no máximo, você tome uma mensagem de erro na cabeça.

Como eu uso o Ubuntu (que é um tipo de Debian), mostrarei neste post como fazer para distribuir uma aplicação em um pacote .deb.

A aplicação

Vamos tomar como exemplo uma aplicação Java qualquer. Uma aplicação Java SE típica teria uma estrutura de diretórios parecida com o seguinte:

  • /minha-app
    • aplicacao.jar
    • executar.sh
    • icone.png
    • /lib
      • lib1.jar
      • lib2.jar
      • lib3.jar

Onde os arquivos da aplicação devem ser colocados?

Assim como acontece em outros sistemas, o GNU/Linux também tem diretórios específicos para cada tipo de arquivo. Precisamos então organizar os arquivos da nossa aplicação nos diretórios corretos dentro do sistema.

Uma forma simples de descobrir isso é olhar um pacote .deb de uma aplicação qualquer! Abra o diretório /var/cache/apt/archives e escolha um arquivo .deb como exemplo.

Caso você tenha o Pidgin instalado, tente abrir os arquivos .deb correspondentes e olhar a lista de arquivos. Isso nos dá uma idéia do lugar onde devemos colocar nossos arquivos:

  • Executáveis: /usr/bin;
  • Imagens: /usr/share/pixmaps e /usr/share/icons;
  • Atalhos: /usr/share/applications;
  • Configurações globais: /etc;
  • Bibliotecas: /usr/lib.

Podemos facilmente adaptar a estrutura de arquivos mostradas no tópico anterior para que ela seja parecida com a que vimos no Pidgin:

  • /usr
    • /bin
      • minha-app
    • /share
      • /icons
        • minha-app.png
      • /applications
        • minha-app.desktop
    • /lib/minha-app
      • aplicacao.jar
      • /lib
        • lib1.jar
        • lib2.jar
        • lib3.jar

Pode até parecer meio complexo num primeiro momento, mas na verdade tudo o que fizemos foi renomear alguns arquivos e definir o lugar certo para cada um deles.

O arquivo de controle

Todo pacote .deb precisa conter um arquivo que informa os dados do pacote, que chamamos de arquivo de controle. Abaixo segue um trecho do arquivo de controle do Pidgin:

Package: pidgin
Version: 1:2.2.0-0debuntu2
Section: net
Priority: optional
Architecture: i386
Depends: pidgin-data ...
Recommends: gstreamer0.10-plugins-base, ...
Suggests: gnome-panel ...
Replaces: gaim ...
Installed-Size: 2664
Maintainer: Ubuntu Core Developers ...
Description: multi-protocol instant messaging client
 Pidgin is a graphical, modular Instant Messaging client capable of using
 AIM/ICQ, Yahoo!, MSN, IRC, Jabber, Napster, Zephyr, Gadu-Gadu, Bonjour,
 Groupwise, Sametime, and SIMPLE all at once.
 .
 Some extra packages are recommended to use the core functionality present...
Original-Maintainer: Robert McQueen ...

Grande parte do conteúdo deste arquivo é auto-explicativo. Não entrarei em detalhes aqui, mas este guia possui as informações necessárias para que você possa entender melhor os campos deste arquivo.

Criando um atalho

Ok, já sabemos como a aplicação deve ser estruturada. A menos que a aplicação rode em linha de comando, podemos facilitar um pouco mais as coisas ao adicionar um atalho no menu do GNOME. Mas, como fazer para criar um atalho no menu do GNOME?

Novamente, o jeito aqui é usar a imaginação. Se você quiser que sua aplicação fique no menu Applications - Accessories, então faça o seguinte:

  1. Abra um editor de texto (como o gedit);
  2. Arraste um atalho desse menu e o solte dentro do editor.

Veja abaixo um trecho do arquivo de atalho para a calculadora do GNOME, que fica no menu Applications - Accessories. O nome do arquivo é gcalctool.desktop:

[Desktop Entry]
Encoding=UTF-8
Name=Calculator
Comment=Perform calculations
Exec=gcalctool
Icon=gnome-calculator
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;Utility;

Para criar um atalho, basta criar um arquivo minha-app.desktop com os valores adequados nos campos que vimos na listagem anterior. Como já sabemos, este arquivo deverá ficar no diretório /usr/share/applications.

Gerando o arquivo .deb

Antes de gerar o arquivo .deb precisamos criar uma estrutura de diretórios que “imite” a estrutura que organizamos nos primeiros tópicos. Um exemplo disso seria:

  • /home/usuario/minha-app
    • /DEBIAN
      • control
    • /usr
      • /bin
        • minha-app
      • /share
        • /icons
          • minha-app.png
      • /applications
        • minha-app.desktop
      • /lib/minha-app
        • aplicacao.jar
        • /lib
          • lib1.jar
          • lib2.jar
          • lib3.jar

Veja que a única coisa diferente aqui foi que adicionamos o arquivo de controle em DEBIAN/control. Uma vez organizados os arquivos, basta gerar o pacote .deb com o comando dpkg:

$ cd /home/usuario
$ ls -a
.     ..     minha-app
$ dpkg -b minha-app minha-app.deb

Agora tente instalar o pacote para verificar se ele foi gerado corretamente:

# dpkg -i minha-app.deb

Podemos facilmente automatizar esse processo com ajuda de alguma ferramenta de build, como o Gant. Um exemplo de script Gant para isso pode ser visto no pacote Source .zip deste projeto.

Tags: , , , , , , , , , , ,