তাদের নির্ভরতা সম্মান করার সময় একাধিক ডিবে ফাইল ইনস্টল করুন


13

একাধিক ফাইলের অফলাইন ইনস্টলেশন সমর্থন .debকরতে, আমি ব্যবহার করছি:

sudo dpkg -i dependencies/*.deb

আমি দেখেছি যে কিছু প্যাকেজগুলি ইনস্টল করা অর্ডারের কারণে এই পদ্ধতিটি ব্যবহার করে ব্যর্থ হয়েছে

উদাহরণস্বরূপ, যখন আমি ইনস্টল করি mariadb-server-5.5এবং এর নির্ভরতাগুলি ঘটে তখন এটি ঘটে :

এই ফাইলগুলি হয়

এই ত্রুটি

*.debফাইলগুলির নির্ভরতা সম্মানের সময় আমি কীভাবে ইনস্টল করতে পারি ?

  • আমি স্থানীয় রেপো স্থাপন করা এড়াতে চেষ্টা করছি, যেহেতু এটি রক্ষণাবেক্ষণ করা আরও কঠিন।
  • একটি workaround হিসাবে, আমি dpkg -i *.debদুবার কমান্ড চালানো ।

1
আপনি জিডিবি চেষ্টা করেছেন ? এটি dpkgনির্ভরতা পরিচালনার বিষয়ে প্লেয়ার চেয়ে বেশি বুদ্ধিমান । আপনি --apt-lineপতাকা সহ ফলস্বরূপ ক্রিয়াগুলি অনুকরণ করতে পারেন ।
ডেভিড ফোস্টার

এটি একটি পুরানো প্রশ্ন তবে আশা করি আপনি কীভাবে এই সম্প্রদায়টিতে ফিরে আসতে পারেন? আমি আপনি চেষ্টা কিনা 1) শুধু ইনস্টলেশন দুইবার চলমান (দ্বিতীয় পাস ঠিক আছে, অন্য কোন বিকল্প হওয়া উচিত) বা 2) -এর মত apt-get -f ইনস্টল আগ্রহী হতে চাই
pzkpfw

1
@pzkpfw বর্তমানে কেবলমাত্র দু'বার ইনস্টলেশন চালাচ্ছেন। টপোলজিকাল ক্রমে নির্ভরতাগুলি সাজানোর জন্য পাইথন স্ক্রিপ্ট লেখার পরিকল্পনা করছেন। এটি স্থাপন করার সাথে সাথেই আপডেট করা হবে
জোসেফ হারুশ

যদি এটি না ভেঙে যায় তবে এটি ঠিক করবেন না আমার অনুমান :)
pzkpfw

উত্তর:


3

আপনি -আর দিয়ে চেষ্টা করতে পারেন এবং বিকল্পগুলি ইনস্টল করতে পারেন:

sudo dpkg -R --install dependencies/

-আর রিকার্সিভ সমস্ত নিয়মিত ফাইলের সাথে মেলে প্যাটার্ন * .deb নির্দিষ্ট ডিরেক্টরি এবং এর সমস্ত উপ ডিরেক্টরিতে পাওয়া যায়


-1, এটি কাজ করে না। প্রশ্নে একই পরিস্থিতি
জোসেফ হারুশ

2

টপোলজিকাল সাজান (স্ক্রিপ্টের মাধ্যমে)

কমান্ডটি সমস্যাযুক্ত - অর্ডার প্যাকেজগুলি ইনস্টল করা উচিত (যদিও আপনি সমস্ত প্রয়োজনীয় প্যাকেজ সরবরাহ করেও) সঠিকভাবে সম্মান করে না।dpkg -i packages/*.deb

এগুলি সমস্ত নিয়ন্ত্রণ করতে কাস্টম স্ক্রিপ্ট

অনুমানের অধীনে আপনার ডিবিয়ান ডিস্ট্রোতে পাইথন ইনস্টল হয়েছে (আমার উবুন্টু 14.04 এলটিএস এবং এটি নিয়ে আসে python27)

অফলাইন .deb packagesডিরেক্টরি ছাড়াও , একটি স্ক্রিপ্ট সরবরাহ করুন যা;

  • মেটাডেটা এবং টপোলজিকাল সমস্ত পরীক্ষার্থীর প্যাকেজগুলি সরান
  • dpkg -iসাজানো প্যাকেজগুলি যথাযথ ক্রমে ইনস্টল করতে ব্যবহার করে সেগুলি ইনস্টল করা উচিত

উদাহরণস্বরূপ, সমস্ত প্রাক-সংগৃহীত অফলাইন প্যাকেজ ইনস্টল করতে এই কমান্ডটি কার্যকর করুন

sudo python install.py
  • আপনার ডিরেক্টরি কাঠামো এর মতো দেখতে হবে

    এখানে চিত্র বর্ণনা লিখুন


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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.