Answers:
您可以这样使用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
--recursive
选项添加到repoquery命令以使其递归工作。
yum-utils
项目中。之所以下载比预期多的软件包,是因为该函数rpmUtils.arch.getArchList()
返回给定软件包的所有兼容体系结构。例如,它包括软件包noarch
可能需要的体系结构x86_64
。您可以检查源:yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
对于每个人的信息,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
sudo yum install yum-plugin-downloadonly.noarch
说No package yum-plugin-downloadonly.noarch available.
怎么办?
yum search yumdownloader
回归yum-utils.noarch
Cannot find a valid baseurl for repo: base/$releasever/x86_64
添加--installroot
标志时出现此错误。
我知道线程很旧,但是如果有人偶然发现了该线程,则可以使用yum完成所需的行为。
首先安装downloadonly插件(RHEL的说明):(RHEL5)
$ yum install yum-downloadonly
(RHEL6)
$ yum install yum-plugin-downloadonly
接下来运行命令,如下所示:
$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]
如果您忽略了--downloaddir
yum,则会自动下载到/var/cache/yum
因此,除非您需要专门使用yumdownloader,否则我认为这是实现目标的最简单方法。
如果您来自未来(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
我发现在实践中构建这样的仓库很难维护。我们建立此仓库的原因是:
我们可以遇到的问题是:
最后,更好地解决我们的问题是代理官方存储库并缓存我们使用的软件包。效果很好,因为:
我们使用了Nginx和内置的代理支持。
以卢克的回答和评论为基础...
写这篇文章的repotrack
时候将匹配以下所有架构的x86_64
规定是:x86_64
,athlon
,i686
,i586
,i486
,i386
,和noarch
。
就我的目的而言,我只对x86_64
和noarch
软件包感兴趣,而且我知道我的发行版中没有任何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
如果在启用的存储库中找不到满足依赖关系的程序包,则不会发出警告。它默默地跳过它。
也试试
repoquery -R --resolve --recursive <name> | xargs -r yumdownloader
例如:
repoquery -R --resolve --recursive firefox | xargs -r yumdownloader
来源:https : //www.thegeekdiary.com/downloading-rpm-packages-with-dependencies-yumdownloader-vs-yum-downloadonly-vs-repoquery/
--requires
--resolve
选项不适用于deps。