How to list/download the recursive dependencies of a debian package?

后端 未结 3 895
梦如初夏
梦如初夏 2021-01-30 04:20

I need to list/download all the recursive dependencies of a debian package.

Suppose i need to install package a.deb and it depends on package b.deb and again package b.d

相关标签:
3条回答
  • 2021-01-30 04:54

    As midihenry pointed out - install the apt-rdepends package and then run this

    $ apt-rdepends gcc | awk '$1 ~ /^Depends:/{print $2}' | xargs apt-get download
    

    this line will get all dependencies recursively and, looking at the second pipe, will download all the packages by name from the stdio, which is what the line -

    awk $1 ~ /^Depends:/{print $2} does. prints out the names of packages. If you run these commands additively, you'll see what i mean.

    0 讨论(0)
  • 2021-01-30 04:56

    You can use apt-rdepends for getting all the dependencies for a package recursively. And by piping the result to grep you can have only the package names and omit unneeded information.

    Example:

     $ apt-rdepends cowsay | grep -E '^[a-zA-Z0-9]'
    

    Output:

    cowsay
    perl
    libbz2-1.0
    libc6
    libgcc1
    gcc-4.9-base
    multiarch-support
    libdb5.3
    libgdbm3
    dpkg
    liblzma5
    libselinux1
    libpcre3
    tar
    libacl1
    libattr1
    zlib1g
    install-info
    perl-base
    perl-modules
    

    You can then download those packages using apt-get download $package and install them offline on your machine.

    By default, apt installs Recommends, so you might want to run apt-rdepends like so:

    apt-rdepends -f Depends,PreDepends,Recommends -s Depends,PreDepends,Recommends cowsay
    

    Since apt-rdepends by default follows and shows only Depends, PreDepends.

    0 讨论(0)
  • 2021-01-30 05:01

    For some reason apt-rdepends did not work for me (when searching the 'docker-engine' package, it missed the dependency onto libltdl7 which was introduced with docker-engine 1.11.1-0). UPD Supposedly owing to the fact that apt-rdepends doesn't follow and doesn't list Recommends by default. And doesn't follow virtual packages.

    So I came up with following command suite.

    Recursively list dependencies

    $ apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances <your-package-here> | grep "^\w" | sort -u
    

    (you obviously have to change <your-package-here> at the end of the line with the package you want to analyze)

    The key here is the --recurse option. Unfortunately, you cannot specify the content you want (or I did not find the way) so you need to turn off all unwanted dependencies to keep only "dependencies". It is a bit verbose and hard to remember!

    From the apt-cache man page:

    Per default the depends and rdepends print all dependencies

    Download those dependencies

    So in order to download those dependencies, run following command which will download them into the current working directory:

    $ apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances <your-package-here> | grep "^\w" | sort -u)
    

    Optionally, to install those dependencies

    This extends slightly the asked question, but it seems to match the intent of the question.

    You need to build the index of the just downloaded packages. This is done from the same folder where all .deb where downloaded:

    $ dpkg-scanpackages . | gzip -9c > Packages.gz
    

    Then just copy that folder (all .deb + the Packages.gz file) to the target system which does not have Internet access and add the folder to the APT source list.

    $ echo "deb file:<your folder here> ./" | sudo tee -a /etc/apt/sources.list
    $ sudo apt-get update
    

    Et voilà

    On a system w/o Internet access, I can install a package (Docker in my example) and its dependencies:

    $ sudo apt-get install docker-engine
    
    0 讨论(0)
提交回复
热议问题