apt-get загрузка с ограничением версии

18

Мне нужно использовать, apt-get downloadчтобы получить конкретную версию .debфайла, но не обязательно точную версию. .debЗависимости могут использовать выражения, такие как >=0.3.0и я хотел бы apt-get downloadполучить ту же версию, что и та, которая будет загружена с использованием такой зависимости.

Подводя итог, я хочу работать так:

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

Любая идея, как я мог получить эту функциональность?

Микоша
источник
Почему бы вам просто не загрузить пакет вручную с packages.ubuntu.com ?
тердон
Потому что я должен быть уверен, что загруженный пакет - это тот же пакет, который будет загружен при выполнении «apt-get install». Я включаю это в скрипт расширения cmake.
mikosz

Ответы:

2

Вы могли бы сделать это, сначала узнав, какая версия является самой новой версией, которая также больше или равна желаемой минимальной версии. Затем вы загружаете именно эту версию, используя apt-get download. Вот скрипт, который делает это (это немного уродливо, но вы поняли):

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

Вы должны добавить проверку ошибок в случае, если пакет не существует и т. Д., Но он содержит основное решение. Кроме того, я предположил, что вам нужен новейший доступный пакет, по крайней мере, определенной версии. Если вместо этого вы хотите использовать самый старый из доступных пакетов, который имеет хотя бы определенную версию, вам нужно настроить скрипт так, чтобы он прекратил поиск, как только он найдет что-то, по крайней мере, желаемой версии.

Фабиан Фагерхольм
источник
0

Поскольку вы хотите именно то, apt-get installчто вам дается, возможно, стоит запустить apt-get installв режиме «только для загрузки», используя пользовательский каталог архивов:

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

Как изменить каталог архивов? Это вариант конфигурации:

FILES
  [...]

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

Они могут быть временно изменены с помощью --optionпараметра:

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

Подвести итоги:

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

Эта команда загрузит (и только скачать, не устанавливать) соответствующие .debфайлы <package>в /some/cache/dir. Каталог будет содержать .debфайлы для пакета, его зависимости, файл блокировки и «частичный» каталог (который должен быть пустым). Фильтрация нужного .debвам файла должна быть тривиальной.

lauvdh
источник
К сожалению, apt-get installтребуется доступ суперпользователя.
Mikosz
0

apt-get downloadтакже позволяет установить целевой выпуск. Разве это не поможет?

apt-get download package/testing

Комментарий # 1 (не может использовать комментарии) - добавление параметра --print-urisк apt-get installне требует прав суперпользователя (но вы должны загрузить его на себя - лучше всего с Wget -i file_list).

pevik
источник
Миколай Радван, похоже, ищет способ получить конкретные версии, возможно, используя выражения для последующего использования скрипта. Это позволит просто загрузить текущий пакет.
Will.Beninger
0

Без привилегий SU вы все равно можете запустить apt-cache и объединить с фильтрацией, чтобы получить эту информацию. Используйте что-то вроде:

На Debian 5:

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

На 6 вы можете использовать:

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

Apt-cache, похоже, изменил поведение при упорядочении списка между 5 и 6, так что на 6 последним будет последний.

Одним словом предостережения является то, что если вы используете этот вывод, как вы говорите «для получения той же версии, что и та, которая будет загружена с использованием такой зависимости», версия доступного пакета может измениться, если вы запустите apt-get update (с конечно, или если это было установлено для автоматического запуска и происходит между тем, когда вы собрали версию, и когда вы запускаете скрипт, который устанавливает вещи, ожидающие, что это будет версия.

числовая иллюстрация
источник