Qual é a melhor maneira de construir um pacote que tenha como alvo apenas uma única versão do Ubuntu?

1

No momento, eu construo e empacoto nosso software para o Ubuntu 14.04, também conhecido como 'trusty' via dpkg-buildpackage . Eu recebo um pacote .deb que pode ser instalado no Ubuntu 14.04, mas também em outras versões do Ubuntu, por exemplo 12.04 também conhecido como 'preciso'. Isso é perigoso, pois o software pode ser instalado sem uma mensagem de erro, mas o programa não pode ser executado / funcionar corretamente.

Dependências do meu pacote são dadas no arquivo control . No entanto, este arquivo não me permite entrar em uma distribuição / codinome do Ubuntu. A distribuição pode ser inserida como parte do *.changes , mas isso não é refletido em nenhum lugar do arquivo .deb. Verificar a situação de dependência complexa durante o script de pós-instalação também é complexo. Assim, eu quero uma maneira fácil de impedir a instalação de um pacote do Ubuntu no lançamento errado do Ubuntu.

Qual é a melhor maneira de criar um pacote que tenha como alvo apenas uma única versão do Ubuntu? No melhor dos casos (1), a instalação deve funcionar apenas na versão alvo do Ubuntu e (2) o pacote .deb contém o nome da distribuição *, por ex. como package_1.0.0-3_trusty_amd64.deb .

(*) Caso contrário, o repositório apt gerenciado via reprepro não pode ter dois pacotes com o mesmo número de versão, cada um tendo como alvo uma versão diferente do Ubuntur.

Obrigado antecipadamente.

Atualização:

O arquivo debian/control do meu pacote:

Source: mypackage
Priority: extra
Build-Depends: debhelper (>= 9), python (>=2.7), pyside-tools
X-Python-Version: >= 2.7
Standards-Version: 3.9.2

Package: mypackage
Architecture: amd64
Depends: ros-indigo-desktop-full|ros-hydro-desktop-full, ros-indigo-rqt|ros-hydro-rqt, ros-indigo-gps-umd|ros-hydro-gps-umd, ros-indigo-map-server|ros-hydro-map-server, imagemagick, octave (>= 3.6), libdc1394-22, sox, tree, python (>=2.7), python-psutil, python-usb, python-serial, python-gi, gir1.2-gexiv2-0.10|gir1.2-gexiv2-0.4, exfat-fuse|fuse-exfat, exfat-utils, gphotofs, python-pyproj, libusb-1.0-0 (>=2:1.0.17), libpyside1.2|libpyside1.1 (>=1.1.2), ${shlibs:Depends}, ${misc:Depends}
Description: ...

Como se pode ver, esse arquivo de controle foi adaptado para que possamos executar a compilação em várias versões do Ubuntu, nas quais as dependências possuem diferentes números de versão: libpyside1.2|libpyside1.1 (>=1.1.2) . Existe uma maneira melhor de lidar com isso?

    
por Stefan 11.07.2014 / 15:46

2 respostas

2
  • Porque o seu pacote está instalado em release / environment e não será capaz de funcionar. Isso significa que seus pacotes control dependencies estão faltando alguma coisa.

    O que eu espero que você não tenha colocado condições de versão de dependências, que poderiam ser usadas para permitir que o pacote fosse instalado em uma única versão se a versão de dependência estivesse disponível somente naquela versão, por exemplo gedit: gedit-common (>= 3.10), gedit-common (<< 3.11)

    Depends: libatk1.0-0 (>= 1.12.4), libc6 (>= 2.14), libcairo2 (>= 1.2.4), libenchant1c2a (>= 1.6.0), libgdk-pixbuf2.0-0 (>= 2.22.0), libgirepository-1.0-1 (>= 0.9.3), libglib2.0-0 (>= 2.38), libgtk-3-0 (>= 3.10), libgtksourceview-3.0-1 (>= 3.10.0), libpango-1.0-0 (>= 1.14.0), libpeas-1.0-0 (>= 1.1.0), libx11-6, libxml2 (>= 2.7.4), libzeitgeist-2.0-0 (>= 0.9.9), gedit-common (>= 3.10), gedit-common (<< 3.11), gsettings-desktop-schemas, python3-gi (>= 3.0), python-gi-cairo (>= 3.0), gir1.2-peas-1.0, iso-codes
    Recommends: gir1.2-gtksource-3.0, zenity, yelp
    Suggests: gedit-plugins
    Breaks: gedit-plugins (<< 2.91)
    

    Referência: Manual de Políticas Debian: Capítulo 7 - Declarando as relações entre os pacotes

  • Outra forma de usar o script preinst e o comando lsb_release :

    #!/bin/sh
    set -e 
    
    release=$(lsb_release -cs)
    if [ ! "$release" = "trusty" ]
    then
        echo "This packages wasn't build for your release."
        echo "Package wasn't installed, See ..."
        exit 1
    fi
    
    exit 0
    

    Se você quiser que trusty seja definido durante a compilação, poderá criar um modelo como preinst.in e escrever um makefile para fazer a substituição de variável ao criar a origem.

por user.dz 11.07.2014 / 19:36
2

Dentro de um pacote Debian, não há como dizer "Permitir instalações apenas no 14.04". Isso tem que acontecer no nível do repositório do apt (que eu vou chegar em breve). A semi-exceção a isso é que como o Trusty é mais recente que o Precise, o Trusty terá alguns pacotes de bibliotecas renomeados (o que, desde que o usuário não use um PPA que forneça esses pacotes, os tornará desinstaláveis) e terá versões mais recentes do bibliotecas, para as quais dh-shlibdeps pode adicionar um requisito de versão. Portanto, em ambos os casos, o pacote será desinstalado no Precise. Observe que um pacote criado para o Precise pode poder ser instalado no Trusty.

Quanto ao repositório apt, os pacotes possuem um número de versão debian separado para cada release. O formato que você descreve poderia funcionar, embora usar ~ seja mais comum, em parte porque ~ é menor que todos os outros caracteres e, portanto, se o usuário atualizar para uma versão mais recente (por exemplo, de Precise para Trusty) e o pacote for presente nos repositórios oficiais (com um número de versão de 1.0.0-3 , o usuário fará o upgrade de 1.0.0-3~precise1 para 1.0.0-3 , mesmo que você tenha um 1.0.0-3~trusty1 . Isso não se aplicará se você usar qualquer outro caractere. Eu pessoalmente uso algo como 1.0.0-0ubuntu1~ppa1~precise1 ; a parte ~ppa1 é para torná-lo menor que qualquer pacote oficial do Ubuntu que possa vir no futuro, e a parte ~precise1 é para especificar o lançamento. Outros mantenedores do PPA podem usar 1.0.0-3~12.04.1 ou 1.0.0-3~14.04.1 , especificando o número da versão em vez do codinome, que é garantidamente crescente (desde que os números da versão do Ubuntu não sejam redefinidos).

Note que os pacotes binários têm o mesmo pacote fonte, então você precisa ter certeza que seu arquivo .changes não inclui o pacote fonte.

    
por saiarcot895 11.07.2014 / 16:19