apt-get download z ograniczeniem wersji

18

Muszę użyć, apt-get downloadaby pobrać określoną wersję .debpliku, ale niekoniecznie dokładną wersję. .debzależności mogą używać wyrażeń takich jak >=0.3.0i chciałbym apt-get downloadpobrać tę samą wersję, która byłaby pobrana przy użyciu takiej zależności.

Podsumowując, chcę pracować:

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

Masz pomysł, jak mogę uzyskać tę funkcjonalność?

mikosz
źródło
Dlaczego po prostu nie pobierzesz pakietu ręcznie z packages.ubuntu.com ?
terdon
Ponieważ muszę mieć pewność, że pobrany pakiet jest dokładnie tym samym pakietem, który zostałby pobrany podczas wykonywania instalacji „apt-get install”. Zamieszczam to w skrypcie rozszerzenia cmake.
mikosz

Odpowiedzi:

2

Możesz to zrobić, najpierw sprawdzając, która wersja jest najnowszą wersją, która jest większa lub równa pożądanej wersji minimalnej. Następnie pobierasz dokładnie tę wersję za pomocą apt-get download. Oto skrypt, który to robi (jest trochę brzydki, ale masz pomysł):

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

Musisz dodać sprawdzanie błędów na wypadek, gdyby pakiet nie istniał itp., Ale zawiera podstawowe rozwiązanie. Przyjąłem również, że chcesz mieć najnowszą dostępną paczkę, która jest przynajmniej pewną wersją. Jeśli zamiast tego chciałbyś, aby najstarszy dostępny pakiet, który jest co najmniej pewną wersją, musisz dostosować skrypt, aby przestał wyszukiwać, gdy tylko znajdzie coś, co najmniej żądaną wersję.

Fabian Fagerholm
źródło
0

Ponieważ chcesz dokładnie tego, co apt-get installby Ci dało, warto uruchomić apt-get installw trybie „tylko do pobrania”, korzystając z niestandardowego katalogu archiwów:

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

Jak zmienić katalog archiwów? To jest opcja konfiguracji:

FILES
  [...]

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

Można je tymczasowo zmienić za pomocą --optionparametru:

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

Podsumowując:

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

To polecenie pobierze (i tylko pobierze, a nie zainstaluje) odpowiednie .debpliki <package>do /some/cache/dir. Katalog będzie zawierał .debpliki pakietu, jego zależności, plik blokady i katalog „częściowy” (który powinien być pusty). Filtrowanie dokładnie tego .deb, czego potrzebujesz, powinno być trywialne.

lauvdh
źródło
Niestety apt-get installwymaga dostępu administratora.
mikosz
0

apt-get downloadumożliwia także ustawienie docelowego wydania. Czy to nie pomogłoby?

apt-get download package/testing

Komentarz do nr 1 (nie można używać komentarzy) - dodanie parametru --print-urisdo apt-get installnie wymaga uprawnień roota (ale musisz go pobrać sam - najlepiej z wget -i FILE_LIST).

pevik
źródło
Wygląda na to, że Mikołaj Radwan szuka sposobu na pobranie określonych wersji, prawdopodobnie przy użyciu wyrażeń do późniejszego użycia skryptu. Pozwoliłoby to po prostu pobrać bieżący pakiet.
Will.Beninger
0

Bez uprawnień SU nadal możesz uruchomić apt-cache i połączyć z filtrowaniem, aby uzyskać te informacje. Użyj czegoś takiego:

W systemie Debian 5:

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

Na 6 możesz użyć:

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

Wygląda na to, że apt-cache zmienił zachowanie w kolejności listy między 5 a 6, więc na 6 najnowsza jest ostatnia.

Jednym słowem jest to, że jeśli używasz tego wyjścia, jak mówisz „aby pobrać tę samą wersję, co ta, która zostałaby pobrana przy takiej zależności”, dostępna wersja pakietu może ulec zmianie, jeśli uruchomisz aktualizację apt-get (z su privs oczywiście), lub jeśli zostało to ustawione na automatyczne uruchamianie i dzieje się to między momentem zebrania wersji a uruchomieniem skryptu, który instaluje rzeczy oczekujące, że będzie to wersja.

ilustracja numeryczna
źródło