download apt-get con vincolo di versione


18

Devo usare apt-get downloadper recuperare una versione specifica di un .debfile, ma non necessariamente la versione esatta. .deble dipendenze possono usare espressioni come >=0.3.0e vorrei apt-get downloadprendere la stessa versione di quella che verrebbe scaricata usando tale dipendenza.

Riassumendo, quello che voglio lavorare è questo:

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

Hai idea di come potrei ottenere quella funzionalità?


Perché non scarichi manualmente il pacchetto da packages.ubuntu.com ?
terdon,

Perché devo essere sicuro che il pacchetto scaricato sia esattamente lo stesso pacchetto che verrebbe scaricato quando viene eseguito "apt-get install". Lo sto incorporando in uno script di estensione cmake.
Mikosz,

Risposte:


2

Puoi farlo scoprendo prima quale versione è la versione più recente che è anche maggiore o uguale alla versione minima desiderata. Quindi, si scarica esattamente quella versione utilizzando apt-get download. Ecco uno script che fa questo (è un po 'brutto, ma hai l'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"

Dovresti aggiungere il controllo degli errori nel caso in cui il pacchetto non esista, ecc. Ma questo contiene la soluzione di base. Inoltre, ho assunto qui che si desidera il pacchetto disponibile più recente che sia almeno una determinata versione. Se invece desideri il pacchetto più vecchio disponibile che sia almeno una determinata versione, devi modificare lo script per interrompere la ricerca una volta trovato qualcosa che è almeno la versione desiderata.


0

Dato che vuoi esattamente cosa apt-get installti darebbe, potrebbe essere utile eseguire apt-get installin "modalità di solo download" utilizzando una directory di archivi personalizzati:

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

Come modificare la directory degli archivi? Questa è un'opzione di configurazione:

FILES
  [...]

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

Questi possono essere modificati temporaneamente con il --optionparametro:

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

Riassumere:

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

Questo comando scaricherà (e solo scaricare, Non installare) i relativi .debfile per <package>a /some/cache/dir. La directory conterrà i .debfile per il pacchetto, le sue dipendenze, un file di blocco e una directory 'parziale' (che dovrebbe essere vuota). Filtrare il .debfile esatto di cui hai bisogno dovrebbe essere banale.


Sfortunatamente, apt-get installrichiede l'accesso da superutente.
Mikosz,

0

apt-get downloadconsente inoltre di impostare il rilascio target. Non sarebbe d'aiuto?

apt-get download package/testing

Commento alla # 1 (non può utilizzare i commenti) - aggiungendo il parametro --print-urisa apt-get installnon richiede i privilegi di root (ma è necessario scaricare il programma in sé - meglio con wget -i FILE_LIST).


Mikolaj Radwan sembra essere alla ricerca di un modo per recuperare versioni specifiche che potrebbero utilizzare espressioni per un uso successivo degli script. Ciò consentirebbe solo il download del pacchetto corrente.
Will.Beninger,

0

Senza i privati ​​SU puoi comunque eseguire apt-cache e combinare con i filtri per ottenere quelle informazioni. Usa qualcosa come:

Su Debian 5:

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

Su 6 puoi usare:

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

Apt-cache sembra aver cambiato il comportamento nell'ordinamento dell'elenco tra 5 e 6 in modo che su 6 l'ultimo arrivi per ultimo.

Un avvertimento è che se si utilizza questo output mentre si dice "per recuperare la stessa versione di quella che verrebbe scaricata utilizzando tale dipendenza", la versione del pacchetto disponibile potrebbe cambiare se si esegue apt-get update (con su privs ovviamente) o se è stato impostato per l'esecuzione automatica e si verifica tra una volta e l'altra quando hai raccolto la versione e quando esegui lo script che installa le cose aspettandoti che sia la versione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.