Installa più file deb nel rispetto delle loro dipendenze


12

Per supportare l'installazione offline di più .debfile, sto usando:

sudo dpkg -i dependencies/*.deb

Ho notato che alcuni pacchetti falliscono usando questo metodo a causa dell'ordine che hanno installato

Ad esempio, questo è ciò che accade quando installo mariadb-server-5.5e le sue dipendenze:

questi sono i file

questo è l'errore

Come posso installare i *.debfile rispettando le loro dipendenze?

  • Sto cercando di evitare la creazione di un repository locale, poiché è più difficile da mantenere.
  • Come soluzione alternativa, eseguo il comando dpkg -i *.debdue volte.

1
Hai provato GDebi ? È un po 'più intelligente che semplice per dpkgquanto riguarda la gestione delle dipendenze. È possibile simulare le azioni risultanti con la --apt-linebandiera.
David Foerster,

Questa è una vecchia domanda, ma spero che tu possa tornare alla community su come hai fatto? Sarei interessato se hai provato 1) Basta eseguire l'installazione due volte (il secondo passaggio dovrebbe essere OK?) O 2) Qualsiasi altra alternativa, come apt-get install -f
pzkpfw

1
@pzkpfw attualmente esegue solo due volte l'installazione. Pianificazione di scrivere uno script Python per ordinare le dipendenze in ordine topologico. Si aggiornerà non appena lo distribuirò
Jossef Harush

Se non è rotto non aggiustarlo immagino :)
pzkpfw

Risposte:


3

Puoi provare con -R e installare le opzioni:

sudo dpkg -R --install dependencies/

-R Ricorsivo gestisce tutti i normali file che corrispondono al modello * .deb trovato in directory specifiche e in tutte le sue sottodirectory


-1, questo non funziona. stessa situazione in questione
Jossef Harush,

2

Ordinamento topologico (tramite script)

Il comando è problematico : non rispetta correttamente i pacchetti di ordini che devono essere installati (anche se si forniscono tutti i pacchetti richiesti).dpkg -i packages/*.deb

Script personalizzato per domarli tutti

Partendo dal presupposto che la tua distribuzione debian ha installato Python (il mio è Ubuntu 14.04 LTS e viene fornito con python27)

A parte la packagesdirectory .deb offline , fornire uno script che;

  • Estrai metadati e ordinamenti topologici tutti i pacchetti candidati
  • Utilizza dpkg -iper installare i pacchetti ordinati nell'ordine corretto in cui devono essere installati

Ad esempio, eseguire questo comando per installare tutti i pacchetti offline pre-raccolti

sudo python install.py
  • La struttura della directory dovrebbe apparire così

    inserisci qui la descrizione dell'immagine


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