使用RPM包与通过requirements.txt管理依赖关系

4 投票
1 回答
1283 浏览
提问于 2025-04-18 08:06

我现在在做一个项目,想用多个软件包来构建。之前我用Java/Maven和PHP/composer的经历都很不错,但最近我开始接触Python,发现自己对Python的依赖管理方式还不太了解。我在研究用pip配合requirements.txt文件来管理依赖,还有用setup模块来存放依赖。我对用txt文件的方式不是很感冒,不过这又是另一个话题。

有人建议我从Python模块构建rpm包,然后用puppet来管理这些包在我们的环境中。我想知道用这种方式来管理依赖和用pip在主仓库中管理依赖相比,有什么优缺点。

希望这样说能让你明白。提前谢谢你!

1 个回答

1

Puppet确实是一个很棒的工具,用来管理依赖关系。就我个人而言,从Python模块构建RPM包有点麻烦。Puppet的package类型实际上支持pip提供者

下面是一个Puppet类,它会从pip安装几个示例包(前提是已经安装了EPEL仓库,以便通过yum安装python-pip):

class pip_modules {
    package { "python-pip":
        ensure => installed,
    }
    $pip_packages = [
        "requests",
        "simplejson"
    ]
    package { $pip_packages:
        ensure => installed,
        provider => pip,
        require => Package["python-pip"]
    }
}

我还没决定这个方法是否比requirements.txt更好,后者可能是更符合Python风格的指定依赖的方式。确实,运行pip freeze > requirements.txt来更新依赖会简单很多,但你还是得在某个时候执行pip install -r requirements.txt,可能还得通过Puppet的exec来执行。

就我个人而言,我一般选择上面提到的方式,因为我觉得构建和管理RPM包的额外工作量比较大,虽然也有观点认为使用本地包(即RPM)是更好的选择。不过,pip和Puppet是与操作系统无关的,所以如果你需要在多个操作系统上安装,避免使用RPM可以省去你制作.deb或其他文件的麻烦。

撰写回答