WedX - журнал о программировании и компьютерных науках

Как я могу заставить dpkg автоматически выбирать мой собственный виртуальный пакет вместо уже установленного?

У меня есть несколько пакетов, обеспечивающих одинаковую функциональность - и в устройстве "может быть только один" одновременно.

Я читал о «Предоставляет, конфликтует, заменяет» в политике Debian, но я не нашел способа (используя dpkg с командами/переключателями) автоматически заменить уже установленный виртуальный пакет без его предварительного удаления вручную.

Управляющий файл моего пакета указывает следующее для всех рассматриваемых пакетов:

Provides: myown-virtual-package
Conflicts: myown-virtual-package
Replaces: myown-virtual-package

Вот что я делаю. Вроде работает, но мне было интересно, есть ли стандартный способ, использующий только dpkg

# remove any conflicting virtual packages
for i in /tmp/upgrade_software/*.deb
do
    # find out what package name and what it provides
    provides_line=$(dpkg --info $i | grep "^ Provides: ")
    package_line=$(dpkg --info $i | grep "^ Package: ")
    virt_package=${provides_line##*: }
    this_package=${package_line##*: }

    # skip if it is not a virtual package 
    [ -z "${virt_package}" ] && continue


    # remove any package that provides the same
    otherpackage_line=$(dpkg-query -W -f='${Provides}: ${Package}\n' \
        | grep "${virt_package}:" | grep -v ${this_package})
    if [ -n "${otherpackage_line}" ] ; then
        otherpackage=${otherpackage_line##*: }
        echo "    ------ removing ${otherpackage} because of conflict -------"
        dpkg --purge ${otherpackage}
        echo "    -------------"
    fi
    echo \'$virt_package\' checked for conflicts
done

Заранее спасибо, джей

17.04.2014

Ответы:


1

dpkg не будет предпринимать подобные автоматические меры по разрешению конфликтов. Для этих задач есть apt-get и aptitude. Он может просто работать с

dpkg -i package.deb ; apt-get -f install

Последняя команда предназначена для разрешения конфликтов. Если он решит удалить ваш собственный пакет для разрешения, вы можете даже попробовать

dpkg -i package.deb ; apt-get -f install <package>

То есть скажите apt установить ваш пакет (без расширения .deb), так как теперь он должен быть виден apt.

17.04.2014
  • Благодарю вас. Думаю, я должен больше читать об apt. У меня сложилось впечатление, что apt не хотел работать без всего механизма репозитория, тогда как dpkg был единственным инструментом для работы с загруженными необработанными файлами deb. 17.04.2014
  • Что в целом верно. Но как только вы говорите dpkg установить локальный пакет, он появляется в локальной базе данных пакетов, и apt также должен учитывать это. 17.04.2014

  • 2

    Это можно сделать только с помощью dpkg, предоставив ему достаточно информации, чтобы он мог выполнить операцию. Подготовить dpkg к этому можно с помощью выборок.

    В этом случае вы бы сказали, что удалить старый провайдер можно, а затем, когда вы установите новый, dpkg сможет удалить другой пакет во время обновления.

    Попробуйте что-то вроде:

    echo old-provider deinstall | dpkg --set-selections
    dpkg -iB new-provider.deb
    

    В принципе, это должно сделать это, и нет необходимости в исправлении apt-get (-f) или в предварительной очистке (возможно, с параметрами --force, если есть пакеты, зависящие от виртуальных машин).

    28.08.2016
  • Спасибо - попробую - и соответственно обновлю комментарий! Я использовал другое решение с предсказуемыми результатами в проекте, и оно меня никогда не подводило. Все равно спасибо. Извините, что долго не заходил. 25.11.2016
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]