我需要将一个软件项目(打包为rpm)从开发人员机器部署到服务器中。我正在使用Fedora 23和dnf包管理器。在部署到服务器之前,我必须收集rpm的所有依赖项。由于内部监管,服务器无法连接到互联网(但我可以将其连接到网上)。运行存储库镜像等不是一种选择。我担心我只需要收集开发人员机器上的所有依赖项,scp(或ansible)它们到服务器并将它们安装在服务器上。
我希望dnf中的--installroot
选项可以提供很多帮助,因为我可以检索所有将被安装到dnf认为是空系统的rpms。然而,这不起作用。
mkdir foo && sudo dnf install --installroot=$PWD/foo golang
给出错误:
Failed to synchronize cache for repo 'fedora'
为什么这会失败?我有什么选择?
我希望看到一个优雅而强大的解决方案。我不想在服务器上安装任何东西(我最乐意做一个scp,后面跟ssh上的一个或两个命令)。 rpm + yum / dnf魔法的组合会很棒,但其他解决方案,包括apt + deb也很有意思。我不想使用docker,我强烈反对运行任何其他基础设施(docker注册表,rpm镜像等)
答案 0 :(得分:2)
这是一个(临时的,经过轻微测试的)脚本(假设你已经安装了rpm系统)来生成安装给定包所需的所有rpm包名称的列表(该脚本假设goal =" bash",编辑品尝)。
将输出名称输入到dnf / yum以进行安装。
#!/bin/sh
goal=bash
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 "--- packages needed"
echo "$goals" | tr ' ' '\n'
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