收集所有rpm依赖来部署一个项目
Collect all rpm dependencies to deploy a project
我需要将软件项目(打包为 rpm)从开发人员机器部署到服务器中。我正在使用 Fedora 23 和 dnf 包管理器。在部署到服务器之前,我必须收集我的 rpm 的所有依赖项。由于内部规定,服务器无法连接到互联网(但我可以通过 ssh 连接到它)。 运行 存储库镜像等不是一个选项。恐怕我只需要收集开发人员机器上的所有依赖项,将它们 scp(或 ansible)到服务器并将它们安装在服务器上。
我希望 dnf 中的 --installroot
选项能帮上大忙,因为我可以检索所有将安装到 dnf 认为是空系统中的 rpm。然而,这不起作用。
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 镜像等)
这是一个(临时的,经过简单测试的)脚本(假设您已经安装了 rpm 系统),用于生成安装给定包所需的所有 rpm 包名称的列表(脚本假定目标="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
我需要将软件项目(打包为 rpm)从开发人员机器部署到服务器中。我正在使用 Fedora 23 和 dnf 包管理器。在部署到服务器之前,我必须收集我的 rpm 的所有依赖项。由于内部规定,服务器无法连接到互联网(但我可以通过 ssh 连接到它)。 运行 存储库镜像等不是一个选项。恐怕我只需要收集开发人员机器上的所有依赖项,将它们 scp(或 ansible)到服务器并将它们安装在服务器上。
我希望 dnf 中的 --installroot
选项能帮上大忙,因为我可以检索所有将安装到 dnf 认为是空系统中的 rpm。然而,这不起作用。
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 镜像等)
这是一个(临时的,经过简单测试的)脚本(假设您已经安装了 rpm 系统),用于生成安装给定包所需的所有 rpm 包名称的列表(脚本假定目标="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