Bağımlılıklarına saygı göstererek birden çok deb dosyası yükleyin


13

Birden çok dosyanın çevrimdışı yüklenmesini desteklemek .debiçin şunu kullanıyorum:

sudo dpkg -i dependencies/*.deb

Bazı paketlerin yüklendikleri sıra nedeniyle bu yöntemi kullanarak başarısız olduklarını fark ettim

Örneğin, yüklediğimde mariadb-server-5.5ve bağımlılıklarında olan şey budur:

bunlar dosyalar

bu hata

*.debBağımlılıklarına saygı göstererek dosyaları nasıl yükleyebilirim ?

  • Bakımı zor olduğundan yerel bir repo kurmaktan kaçınmaya çalışıyorum.
  • Geçici bir çözüm olarak, komutu dpkg -i *.debiki kez çalıştırıyorum .

1
GDebi'yi denediniz mi? dpkgBağımlılık yönetimi konusunda biraz daha zekidir . Elde edilen eylemleri --apt-linebayrakla simüle edebilirsiniz .
David Foerster

Bu eski bir soru ama umarım bunu nasıl yaptığına dair topluma geri dönebilirsin? Ben denemek ister misiniz 1) Sadece kurulumu iki kez çalıştırmak (ikinci geçiş tamam olmalı?) Veya 2) apt-get install -f gibi başka bir alternatif -f
pzkpfw

1
@pzkpfw şu anda kurulumu iki kez çalıştırıyor. Bağımlılıkları topolojik sırayla sıralamak için bir python betiği yazmayı planlama. En kısa sürede dağıtacağım güncelleme
Jossef Harush

Eğer
kırılmazsa

Yanıtlar:


3

-R ve yükleme seçenekleriyle deneyebilirsiniz:

sudo dpkg -R --install dependencies/

-R Özyinelemeli belirli dizinlerde ve tüm alt dizinlerinde bulunan kalıp * .deb ile eşleşen tüm normal dosyaları işleme


-1, bu işe yaramıyor. aynı durum
Jossef Harush

3

Topolojik sıralama (komut dosyası aracılığıyla)

Komut sorunlu - sipariş paketlerinin düzgün bir şekilde takılması gerekmiyor (tüm gerekli paketleri sağlasanız bile).dpkg -i packages/*.deb

Tümünü yönetmek için özel komut dosyası

Debian dağıtımınızda python yüklü olduğu varsayımı altında (benimki 14.04 LTS ubuntu ve birlikte geliyor python27)

Çevrimdışı .deb packagesdizinini bir kenara koyun ;

  • Meta veri ve Topolojik tüm aday paketlerini ayıklar
  • dpkg -iSıralanan paketleri kurulmaları gereken sırayla kurmak için kullanır

Örneğin, önceden toplanmış tüm çevrimdışı paketleri yüklemek için bu komutu yürütün

sudo python install.py
  • Dizin yapınız şöyle görünmelidir

    resim açıklamasını buraya girin


install.py

#!/usr/bin/env python

import os
import re
import subprocess
import logging

import sys

rootLogger = logging.getLogger()
rootLogger.setLevel(logging.INFO)
consoleHandler = logging.StreamHandler(sys.stdout)
consoleHandler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
rootLogger.addHandler(consoleHandler)

SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))


class TopologicalSort(object):
    def __init__(self, dependency_map):
        self._dependency_map = dependency_map
        self._already_processed = set()

    def _get_dependencies(self, item, root=None):

        if not root:
            root = item

        elif root == item:
            logging.warn("circular dependency detected in '{}'".format(item))
            raise StopIteration()

        dependencies = self._dependency_map.get(item, [])
        for dependency in dependencies:

            if dependency in self._already_processed:
                continue

            self._already_processed.add(dependency)

            for sub_dependency in self._get_dependencies(dependency, root=root):
                yield sub_dependency

            yield dependency

    def sort(self):
        # Reduction, connect all nodes to a dummy node and re-calculate
        special_package_id = 'topological-sort-special-node'
        self._dependency_map[special_package_id] = self._dependency_map.keys()
        sorted_dependencies = self._get_dependencies(special_package_id)
        sorted_dependencies = list(sorted_dependencies)
        del self._dependency_map[special_package_id]

        # Remove "noise" dependencies (only referenced, not declared)
        sorted_dependencies = filter(lambda x: x in self._dependency_map, sorted_dependencies)
        return sorted_dependencies


class DebianPackage(object):
    def __init__(self, file_path):
        metadata = subprocess.check_output('dpkg -I {}'.format(file_path), shell=True)
        metadata = metadata.replace('\n ', '\n')
        self._metadata = metadata
        self.id = self._get('Package')
        self.dependencies = list(self._get_dependencies())
        self.file_path = file_path

    def _get_dependencies(self):
        dependencies = self._get('Depends') + ',' + self._get('Pre-Depends')
        dependencies = re.split(r',|\|', dependencies)
        dependencies = map(lambda x: re.sub(r'\(.*\)|:any', '', x).strip(), dependencies)
        dependencies = filter(lambda x: x, dependencies)
        dependencies = set(dependencies)
        for dependency in dependencies:
            yield dependency

    def _get(self, key):
        search = re.search(r'\n{key}:(.*)\n[A-Z]'.format(key=key), self._metadata)
        return search.group(1).strip() if search else ''


def sort_debian_packages(directory_path):
    file_names = os.listdir(directory_path)
    debian_packages = {}
    dependency_map = {}
    for file_name in file_names:

        file_path = os.path.join(directory_path, file_name)

        if not os.path.isfile(file_path):
            continue

        debian_package = DebianPackage(file_path)
        debian_packages[debian_package.id] = debian_package
        dependency_map[debian_package.id] = debian_package.dependencies

    sorted_dependencies = TopologicalSort(dependency_map).sort()
    sorted_dependencies = map(lambda package_id: debian_packages[package_id].file_path, sorted_dependencies)
    return sorted_dependencies


def main():
    # ------------------
    # Sort the packages using topological sort

    packages_dir_path = os.path.join(SCRIPT_DIR, 'packages')
    logging.info('sorting packages in "{}" using topological sort ...'.format(packages_dir_path))
    sorted_packages = sort_debian_packages(packages_dir_path)

    # ------------------
    # Install the packages in the sorted order

    for index, package_file_path in enumerate(sorted_packages):
        command = 'dpkg -i {}'.format(package_file_path)
        logging.info('executing "{}" ...'.format(command))
        subprocess.check_call(command, shell=True)


if __name__ == '__main__':

    if os.geteuid() != 0:
        logging.error('must be run as root')
        sys.exit(1)

    try:
        main()
    except:
        logging.error('failed to install packages', exc_info=True)
        sys.exit(1)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.