apt-get download com restrição de versão

18

Preciso usar apt-get downloadpara buscar uma versão específica de um .debarquivo, mas não necessariamente a versão exata. .debé permitido que dependências usem expressões como >=0.3.0e eu gostaria apt-get downloadde buscar a mesma versão da que seria baixada usando essa dependência.

Resumindo, o que eu quero trabalhar é o seguinte:

$ apt-get download package='>=0.3.0'

Alguma idéia de como eu poderia obter essa funcionalidade?

mikosz
fonte
Por que você não faz o download manual do pacote do packages.ubuntu.com ?
terdon
Porque eu preciso ter certeza de que o pacote baixado é exatamente o mesmo que seria baixado quando o "apt-get install" for executado. Estou incorporando isso em um script de extensão cmake.
Mikosz #

Respostas:

2

Você pode fazer isso descobrindo primeiro qual versão é a versão mais recente que também é maior ou igual à versão mínima desejada. Então, você baixa exatamente essa versão usando apt-get download. Aqui está um script que faz isso (é um pouco feio, mas você entendeu a idéia):

#!/bin/bash

if [ $# -lt 2 ]; then
    echo "Usage: $0 <packagename> <minimum version>"
    exit 1
fi

pkgname="$1"
minversion="$2"

V="0"

for version in `apt-cache madison $pkgname | awk -F'|' '{print $2}'`; do
    echo "Considering $version"
    if dpkg --compare-versions $version ge $minversion; then
        echo "- Version is at least $minversion"
        if dpkg --compare-versions $version gt $V; then
            echo "- This is the newest version so far"
            V=$version
        else
            echo "- We already have a newer version"
        fi
    else
        echo "- This is older than $minversion"
    fi
done

if [ "$V" = "0" ]; then
    echo "There is no version greater than or equal to $minversion"
    exit 1
fi

echo "Selected version: $V"

echo "Downloading"
apt-get download $pkgname=$V
echo "Done"

Você precisaria adicionar a verificação de erros, caso o pacote não exista, etc., mas isso contém a solução principal. Além disso, assumi aqui que você deseja o pacote mais recente disponível, que seja pelo menos uma determinada versão. Se você preferir o pacote mais antigo disponível que seja pelo menos uma determinada versão, será necessário ajustar o script para interromper a pesquisa quando encontrar algo que seja pelo menos a versão desejada.

Fabian Fagerholm
fonte
0

Como você deseja exatamente o que apt-get installlhe daria, pode valer a pena executar apt-get installno 'modo somente download' usando um diretório de arquivos personalizados:

-d, --download-only
  Download only; package files are only retrieved, not unpacked or installed.
  Configuration Item: APT::Get::Download-Only.

Como alterar o diretório de arquivos? Esta é uma opção de configuração:

FILES
  [...]

  /var/cache/apt/archives/
  Storage area for retrieved package files. Configuration Item: Dir::Cache::Archives.

Esses podem ser alterados temporariamente com o --optionparâmetro:

-o, --option
  Set a Configuration Option; This will set an arbitrary configuration option. 
  The syntax is -o Foo::Bar=bar.  -o and --option can be used multiple times 
  to set different options.

Para resumir:

apt-get install -d -o dir::cache::archives="/some/cache/dir" <package>

Este comando irá baixar (e só baixar, não instalar) as relevantes .debarquivos para <package>a /some/cache/dir. O diretório conterá os .debarquivos do pacote, suas dependências, um arquivo de bloqueio e o diretório 'parcial' (que deve estar vazio). Filtrar o .debarquivo exato que você precisa deve ser trivial.

lauvdh
fonte
Infelizmente, apt-get installrequer acesso de superusuário.
Mikosz
0

apt-get downloadtambém permite definir a liberação do destino. Não ajudaria?

apt-get download package/testing

Comente para # 1 (não é possível usar comentários) - adicionar parâmetro --print-urisa apt-get installnão requer direitos de root (mas você deve fazer o download dele próprio - melhor com wget -i FILE_LIST).

pevik
fonte
Mikolaj Radwan parece estar procurando uma maneira de buscar versões específicas, possivelmente usando expressões para uso posterior de scripts. Isso apenas permitiria o download do pacote atual.
Will.Beninger
0

Sem privs SU, você ainda pode executar o apt-cache e combinar com a filtragem para obter essas informações. Use algo como:

No Debian 5:

apt-cache show <pkg> | head | grep -i version 

No dia 6 você pode usar:

apt-cache show <pkg> | tail | grep -i version

O apt-cache parece ter mudado o comportamento na ordem da lista entre 5 e 6, de modo que em 6 o último seja o último.

Uma palavra de cautela é que, se você estiver usando esta saída como diz "para buscar a mesma versão que seria baixada usando essa dependência", a versão do pacote disponível poderá mudar se você executar o apt-get update (com su privs, é claro), ou se isso foi definido para ser executado automaticamente e acontece entre o momento em que você coletou a versão e quando você executa o script que instala coisas esperando que essa seja a versão.

ilustração numérica
fonte