O Snap é uma tecnologia desenvolvida pela Canonical para facilitar a instalação de software na distribuição Ubuntu. É um desenvolvimento relativamente recente. O desenvolvimento do Snap decorreu ao longo de vários anos, mas só com o lançamento do Ubuntu 16.04 é que apareceu num estado em que está pronto a ser utilizado pelas massas.
A principal vantagem do Snap é a capacidade de instalar programas sem dependências. Todas as bibliotecas necessárias já estão no pacote com o programa e não é necessário nada do sistema para o executar. Ao atualizar, o utilizador tem de atualizar um pacote Snap sem fazer alterações no sistema e, em caso de falhas e erros, pode reverter o pacote para a versão anterior. Na Web, é frequente encontrar discussões entre os utilizadores sobre se a tecnologia snap é realmente boa ou se deve ser abandonada a favor dos pacotes deb
. Mas o tempo e os testes dirão. De seguida, neste artigo, vamos ver o processo de criação de pacotes snap
. Criá-los é um pouco mais fácil do que os mesmos pacotes deb
.
Para criar pacotes snap
vamos usar uma ferramenta especial chamada Snapcraft. Esta é a ferramenta oficial para a criação de snap packages, que permite ao programador empacotar programas de forma a construir os ficheiros necessários em todo o sistema. O Snapcraft permite não só copiar ficheiros, mas também descarregar o código fonte e construir o programa.
De seguida, vamos ver como criar snap
packages utilizando a aplicação Samplenote como exemplo.
Primeiro, instale o Snapcraft. Para obter a versão mais recente, adicione um PPA ao nosso sistema:
$ sudo add-apt-repository ppa:snappy-dev/tools
Agora, actualize a lista de pacotes e instale o programa:
$ sudo apt-get update
$ sudo apt-get install snapcraft
Quando a instalação do Snapcraft estiver concluída, podemos passar para a obtenção do código-fonte do programa. Primeiro, descarregue as fontes do GitHub e descompacte-as:
$ wget https://github.com/Automattic/simplenote-electron/releases/download/v1.0.1/Simplenote-linux-x64.1.0.1.tar.gz
$ tar xvzf Simplenote-linux-x64.1.0.1.tar.gz
Como o programa não precisa de ser compilado, a nossa tarefa é um pouco mais fácil. Vá para a pasta com o programa e inicialize o ambiente de compilação do Snapcraft lá:
$ cd Simplenote-linux-x64
$ snapcraft init
Depois de executar o último comando, o arquivo snapcraft.yml
aparecerá na pasta. Ao editar o ficheiro, vamos configurar o processo de criação do nosso pacote snap. Precisaremos de um arquivo com o seguinte conteúdo:
name: simplenote
version: 1.0.1
summary: The simplest way to keep notes.
description: The simplest way to keep notes. Light, clean, and free.
apps:
simplenote:
command: usr/bin/wrapper
plugs:
- unity7
- opengl
- network
parts:
simplenote:
plugin: copy
stage-packages:
- libnss3
- fontconfig-config
- gnome-themes-standard
files:
Simplenote: Simplenote
wrapper: usr/bin/wrapper
icudtl.dat: icudtl.dat
snapshot_blob.bin: snapshot_blob.bin
natives_blob.bin: natives_blob.bin
resources*: resources
libnode.so: usr/lib/x86_64-linux-gnu/libnode.so
libffmpeg.so: usr/lib/x86_64-linux-gnu/libffmpeg.so
As primeiras quatro linhas são informações sobre o pacote em si, o nome do programa, a versão e uma descrição curta e completa.
Comando - este é o comando para iniciar o programa; mais adiante, utilizaremos o script warpper
, porque precisamos de especificar variáveis de ambiente adicionais.
Plugs
- estas são as interfaces que podem ser utilizadas pelo programa. A questão é que os programas snap funcionam num ambiente isolado, de onde não podem ter acesso ao hardware e aos dados pessoais. Para que o nosso programa funcione corretamente, precisa de dar acesso às interfaces opengl
, unity7
e de rede
.
Pode ver as interfaces disponíveis e os programas que as utilizam executando o comando:
$ snap interfaces
Na secção das partes
é necessário especificar os ficheiros do programa. Especificamente, o que o snapcraft
precisa de fazer ao criar um pacote. Como não precisamos de compilar nada, usamos o plugin copy para copiar ficheiros. Os ficheiros que precisam de ser copiados são listados na secção de ficheiros
. Não existem apenas ficheiros executáveis, mas também todas as bibliotecas necessárias, para que o programa obtenha todos os componentes de que necessita.
O formato da entrada é o seguinte:
system_file: snap_package_file_path
Existe uma entrada não standard:
resources*: resources
O caractere curinga *
permite copiar o diretório inteiro. Para evitar copiar todos os ficheiros do sistema, existe uma opção na secção site-packages para dizer ao programa quais os pacotes que devem ser instalados no pacote snap, no nosso caso são libnss3
, fontconfig-config-config
e gnome-themes-standard
.
Para ver que bibliotecas o programa utiliza, pode usar o comando:
ldd Simplenote | grep Simplenote
libnode.so => /home/sergiy/test/Simplenote/Simplenote-linux-x64/./libnode.so (0x00007f05fb477000)
libffmpeg.so => /home/sergiy/test/Simplenote/Simplenote-linux-x64/./libffmpeg.so (0x00007f05f61ec000)
O importante é que estas bibliotecas são fornecidas com o programa, pelo que temos de as especificar no ficheiro de configuração snapcraft.yaml
. Todas as outras bibliotecas estão disponíveis no sistema e serão detectadas pelo snapcraft
automaticamente.
A seguir, vamos criar o ficheiro wrapper
:
!/bin/sh
export FONTCONFIG_PATH=$SNAP/etc/fonts
export FONTCONFIG_FILE=$SNAP/etc/fonts/fonts.conf
export XDG_DATA_HOME=$SNAP/usr/share
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$SNAP/usr/lib/x86_64-linux-gnu/
exec "$SNAP/Simplenote" "$@"
Isto é simples aqui - um script Bash
. Defina os caminhos para as fontes e diga ao programa onde procurar as bibliotecas para que libnote.
so
e libffmpeg.so
sejam encontradas com sucesso. E a última linha inicia o simplenote
.
A próxima coisa a fazer é tornar este ficheiro executável:
$ chmod +x wrapper
Para começar a construir o pacote, execute:
$ snapcraft
A compilação pode demorar algum tempo, e assim que a compilação estiver completa pode instalar o pacote:
$ sudo snap install simplenote_1.0.1_amd64.snap
Pode usar o comando habitual para executar o programa:
$ simplenote
Agora o programa está instalado. Pode utilizar exatamente o mesmo método de criação de pacotes snap
para empacotar as suas aplicações.