收集所有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