téléchargement apt-get avec contrainte de version

18

Je dois utiliser apt-get downloadpour récupérer une version spécifique d'un .debfichier, mais pas nécessairement la version exacte. .debles dépendances sont autorisées à utiliser des expressions telles que >=0.3.0et je voudrais apt-get downloadrécupérer la même version que celle qui serait téléchargée à l'aide d'une telle dépendance.

Pour résumer, ce que je veux travailler est la suivante:

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

Une idée de comment obtenir cette fonctionnalité?

mikosz
la source
Pourquoi ne téléchargez-vous pas manuellement le package depuis packages.ubuntu.com ?
terdon
Parce que je dois être sûr que le package téléchargé est exactement le même package qui serait téléchargé lorsque "apt-get install" est exécuté. J'incorpore cela dans un script d'extension cmake.
mikosz

Réponses:

2

Vous pouvez le faire en découvrant d'abord quelle version est la version la plus récente qui est également supérieure ou égale à la version minimale souhaitée. Ensuite, vous téléchargez exactement cette version en utilisant apt-get download. Voici un script qui fait ça (c'est un peu moche, mais vous avez l'idée):

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

Vous devrez ajouter une vérification des erreurs au cas où le paquet n'existe pas, etc. mais cela contient la solution principale. En outre, j'ai supposé ici que vous vouliez le dernier package disponible qui soit au moins une certaine version. Si vous souhaitez plutôt le plus ancien package disponible qui est au moins une certaine version, vous devez ajuster le script pour arrêter la recherche une fois qu'il a trouvé quelque chose qui est au moins la version souhaitée.

Fabian Fagerholm
la source
0

Puisque vous voulez exactement ce apt-get installque vous obtiendriez, il pourrait être utile de l'exécuter apt-get installen «mode téléchargement uniquement» à l'aide d'un répertoire d'archives personnalisé:

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

Comment changer le répertoire des archives? Il s'agit d'une option de configuration:

FILES
  [...]

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

Ceux-ci peuvent être modifiés temporairement avec le --optionparamètre:

-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.

Résumer:

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

Cette commande va télécharger (et seulement télécharger, d' installer) les pertinents .debfichiers pour <package>à /some/cache/dir. Le répertoire contiendra les .debfichiers du paquet, ses dépendances, un fichier de verrouillage et un répertoire 'partiel' (qui devrait être vide). Filtrer le .debfichier exact dont vous avez besoin devrait être trivial.

lauvdh
la source
Malheureusement, apt-get installnécessite un accès superutilisateur.
mikosz
0

apt-get downloadvous permet également de définir la version cible. Cela n'aiderait-il pas?

apt-get download package/testing

Commentaire à # 1 (ne peut pas utiliser de commentaires) - l'ajout de paramètre --print-urisà apt-get installne nécessite pas de droits root (mais vous devez le télécharger lui-même - mieux avec wget -i FILE_LIST).

pevik
la source
Mikolaj Radwan semble chercher un moyen de récupérer des versions spécifiques en utilisant éventuellement des expressions pour une utilisation ultérieure du script. Cela permettrait simplement le téléchargement du package actuel.
Will.Beninger
0

Sans les privilèges SU, vous pouvez toujours exécuter apt-cache et combiner avec le filtrage pour obtenir ces informations. Utilisez quelque chose comme:

Sur Debian 5:

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

Le 6, vous pouvez utiliser:

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

Apt-cache semble avoir changé le comportement dans l'ordre de la liste entre 5 et 6 de sorte que sur 6, la plus récente arrive en dernier.

Une mise en garde est que si vous utilisez cette sortie comme vous le dites "pour récupérer la même version que celle qui serait téléchargée en utilisant une telle dépendance", la version du package disponible peut changer si vous exécutez apt-get update (avec su privs bien sûr), ou si celui-ci a été configuré pour s'exécuter automatiquement et se produit entre le moment où vous avez rassemblé la version et le moment où vous exécutez le script qui installe des choses en attendant que ce soit la version.

illustration numérique
la source