使用yumdownloader下载所有依赖项,即使已安装?


34

有没有办法用yumdownloader下载所有依赖项,即使它们已经安装了呢?

我正在尝试创建本地存储库,只希望包含我们需要的软件包。

Answers:


29

您可以这样使用repotrack

repotrack -a x86_64 -p /repos/Packages [packages]

不幸的是,-a标志(拱)存在错误。它将下载i686和x86_64。

解决方法如下:

if opts.arch:
    #archlist = []
    #archlist.extend(rpmUtils.arch.getArchList(opts.arch))
    archlist = opts.arch.split(',') # Change to this
else:
    archlist = rpmUtils.arch.getArchList()

您可以repoquery用来获取组软件包的列表:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups]

您可以将其添加到repotrack中:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages

更新为改为使用repotrack。repoquery的--requires --resolve选项不适用于deps。
路加福音2012年

--recursive选项添加到repoquery命令以使其递归工作。
ZaSter

以上述建议的方式修复repotrack对我而言不起作用:没有为x86_64 arch下载任何软件包。无论如何+1是一个很好的技巧:使用repotrack可以下载i386和x86_64并过滤掉不必要的部分。
亚历山大·瓦西里耶夫

@Luke如何使用修订部件...意味着在提到条件的情况下在哪里执行...以及如果我只需要在repoquery命令中检查某些程序包该怎么办。
AVJ 2015年

2
我不建议更改源代码。如果确实如此,那是一个错误,应该将其提交到上游yum-utils项目中。之所以下载比预期多的软件包,是因为该函数rpmUtils.arch.getArchList()返回给定软件包的所有兼容体系结构。例如,它包括软件包noarch可能需要的体系结构x86_64。您可以检查源:yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan

18

对于每个人的信息,yumdownloader都不会做。对于具有`yum软件包管理经验的人来说,很自然地期望以下命令行将递归下载软件包RPM及其所有依赖项:

yumdownloader --resolve <package>

但事实并非如此。可能是它打印了一级依赖项或尚未安装的依赖项。我不确定。

这是在CentOS 6.5上可以使用的一种方法。按照步骤安装Redhatyum提供的downloadonly插件。基本上,在CentOS 6.x上,执行以下操作:

$ sudo yum install yum-plugin-downloadonly.noarch

然后结合使用插件和的--installroot开关yum。这样可以防止yum解决然后跳过系统上已经安装的依赖项。

sudo yum install \
  --installroot=</path/to/tmp_dir> \
  --downloadonly --downloaddir <rpm_dir> <package>

您将下载该软件包的RPM <package>及其所有依赖项到目录中<rpm_dir>。例如,使用Git:

$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
  --downloadonly --downloaddir rpms/ git

您如何反转此过程并使用本地依赖项安装叶包?
偏移

centos65 sudo yum install yum-plugin-downloadonly.noarchNo package yum-plugin-downloadonly.noarch available.怎么办?
霍华德·李

@HowardLee Running yum search yumdownloader回归yum-utils.noarch
阿里

5
Cannot find a valid baseurl for repo: base/$releasever/x86_64添加--installroot标志时出现此错误。
Mike S

Cannot find a valid baseurl...使用此链接上的解决方案摆脱了Centos 7 上的问题:--releasever=/
Chirlo

2

我知道线程很旧,但是如果有人偶然发现了该线程,则可以使用yum完成所需的行为。

首先安装downloadonly插件(RHEL的说明):(RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

接下来运行命令,如下所示:

$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]

如果您忽略了--downloaddiryum,则会自动下载到/var/cache/yum

因此,除非您需要专门使用yumdownloader,否则我认为这是实现目标的最简单方法。


4
如果已经安装了软件包,这仍然是一个问题
Zack S

2

如果您来自未来(Fedora 23+),而yum将被dnf取代,那么您可能会发现此bash脚本很有用。

rpmDownloader:

#!/bin/sh
set -xev
rm -fr packages
#dnf download $1 --destdir packages
export PATH=.:$PATH
echo $PWD
DEPS=$(rpmResolver $1)
dnf download $DEPS --destdir packages
rm -fr ${1}-dependencies
mv packages ${1}-dependencies

rpmResolver:

#!/bin/sh
goal=$1
deps=$(rpm -q --qf '[%{REQUIRENAME}\n]'  $goal | egrep -v '^(rpmlib|rtld|config|/)')
goals=
while true; do
  subs=$(rpm -q --qf '%{NAME}\n' --whatprovides $deps | sort -u | tr '\n' ' ')
  if [ ."$subs" = ."$goals" ]; then
    echo -n "$goals "
    exit 0
  fi
  goals=$(echo $goals $subs | tr ' ' '\n' | sort -u | tr '\n' ' ')
  for sub in $subs; do
    subdeps=$(rpm -q --qf '[%{REQUIRENAME}\n]' $sub | egrep -v '^(rpmlib|rtld|config|/)')
    deps=$(echo $deps $subdeps | sort -u)
  done
done

9
是未来吗?
kirkpatt

1

我发现在实践中构建这样的仓库很难维护。我们建立此仓库的原因是:

  • 我们想从本地来源为多个服务器提取软件包。
  • 只允许安装受信任的程序包。

我们可以遇到的问题是:

  • 保持软件包最新。依赖关系发生变化。一些被添加,其他被删除。
  • 添加我们要安装的新软件包。
  • 上述挑战延长了推送关键更新的过程。

最后,更好地解决我们的问题是代理官方存储库并缓存我们使用的软件包。效果很好,因为:

  • 仅我们实际使用的软件包存储在本地。
  • 旧软件包自动过期。
  • 首次使用软件包时,它会从官方存储库中提取信息,但后续请求来自缓存。
  • 信任官方仓库就足够了。我们的代理镜像仅从受信任的来源提取软件包。

我们使用了Nginx和内置的代理支持。


nginx代理听起来不错。更好的长期支持并获得更多包裹。如果您添加了更多详细信息(可能是如何链接等),将会有所帮助
关东煮(Oden)

0

卢克的回答和评论为基础...

写这篇文章的repotrack时候将匹配以下所有架构的x86_64规定是:x86_64athloni686i586i486i386,和noarch

就我的目的而言,我只对x86_64noarch软件包感兴趣,而且我知道我的发行版中没有任何athlon软件包。

以下命令获取软件包URL的列表,过滤出i?86体系结构,并在下载软件包时打印出软件包名称:

repotrack --arch=x86_64 --urls gs1000-server \
    | sed '/\.i[3-6]86\.rpm$/d' \
    | xargs -I {} sh -c 'curl -s -O {}; echo {} | rev | cut -d '/' -f 1 | rev'

请注意,repotrack如果在启用的存储库中找不到满足依赖关系的程序包,则不会发出警告。它默默地跳过它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.