apt-get download con restricción de versión

18

Necesito usar apt-get downloadpara buscar una versión específica de un .debarchivo, pero no necesariamente la versión exacta. .deblas dependencias pueden usar expresiones como >=0.3.0y me gustaría apt-get downloadobtener la misma versión que la que se descargaría usando dicha dependencia.

En resumen, lo que quiero trabajar es esto:

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

¿Alguna idea de cómo podría obtener esa funcionalidad?

mikosz
fuente
¿Por qué no simplemente descarga el paquete manualmente desde packages.ubuntu.com ?
terdon
Porque necesito asegurarme de que el paquete descargado sea exactamente el mismo paquete que se descargaría cuando se ejecute "apt-get install". Estoy incorporando esto en un script de extensión cmake.
mikosz

Respuestas:

2

Puede hacer esto descubriendo primero qué versión es la versión más nueva que también es mayor o igual que la versión mínima deseada. Luego, descarga exactamente esa versión usando apt-get download. Aquí hay un script que hace esto (es un poco feo, pero se entiende la idea):

#!/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"

Tendría que agregar la comprobación de errores en caso de que el paquete no exista, etc., pero esto contiene la solución principal. Además, he asumido aquí que desea el paquete más nuevo disponible que sea al menos una versión determinada. Si, en cambio, desea el paquete más antiguo disponible que tenga al menos una versión determinada, debe ajustar el script para dejar de buscar una vez que encuentre algo que sea al menos su versión deseada.

Fabian Fagerholm
fuente
0

Dado que desea exactamente lo que apt-get installle daría, podría valer la pena ejecutar apt-get installen 'modo de solo descarga' usando un directorio de archivos personalizado:

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

¿Cómo cambiar el directorio de archivos? Esta es una opción de configuración:

FILES
  [...]

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

Esos se pueden cambiar temporalmente con el --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 descarga (y única descarga, lo instale) los correspondientes .debarchivos de <package>a /some/cache/dir. El directorio contendrá los .debarchivos para el paquete, sus dependencias, un archivo de bloqueo y un directorio 'parcial' (que debe estar vacío). Filtrar el .debarchivo exacto que necesita debe ser trivial.

lauvdh
fuente
Desafortunadamente, apt-get installrequiere acceso de superusuario.
mikosz
0

apt-get downloadTambién le permite establecer la liberación de destino. ¿No ayudaría?

apt-get download package/testing

Comentario al # 1 (no se puede utilizar comentarios) - añadiendo el parámetro --print-urisa apt-get installno requiere derechos de root (pero hay que descargarlo en sí - mejor con wget -i lista_de_archivos).

pevik
fuente
Mikolaj Radwan parece estar buscando una forma de obtener versiones específicas, posiblemente utilizando expresiones para el uso posterior del script. Esto solo permitiría la descarga del paquete actual.
Will.Beninger
0

Sin SU privs, aún puede ejecutar apt-cache y combinarlo con el filtrado para obtener esa información. Use algo como:

En Debian 5:

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

En 6 puedes usar:

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

Apt-cache parece haber cambiado el comportamiento en el orden de la lista entre 5 y 6, de modo que en 6 el último llega último.

Una advertencia es que si está utilizando esta salida como dice "para obtener la misma versión que la que se descargaría usando dicha dependencia", la versión del paquete disponible puede cambiar si ejecuta apt-get update (con su privs, por supuesto), o si se ha configurado para ejecutarse automáticamente y sucede entre el momento en que reunió la versión, y cuando ejecuta el script que instala las cosas esperando que esa sea la versión.

ilustración numérica
fuente