当前位置: 首页 > 科技观察

Python中的依赖处理

时间:2023-03-11 21:46:35 科技观察

依赖是很多人的噩梦。有些人甚至认为它们是技术债。管理软件的库列表是一种可怕的体验。自动更新依赖?-这听起来像是胡言乱语。请继续关注我,因为我将帮助您更好地掌握一些您在实践中无法摆脱的东西——除非您如此富有和才华,以至于您可以在没有别人的代码的情况下生活。首先,我们需要清楚地了解依赖关系:有两种类型的依赖关系。几年前DonaldStuff写了一篇关于这个主题的文章,比我以前写的都好。简单来说,它们是依赖于外部代码的两类代码包:应用程序和库。库依赖项Python库应该以通用方式指定它们的依赖项。图书馆不应该要求请求2.1.5:它没有意义。如果每个库需要不同版本的请求,我们不能同时使用它们。库需要根据版本号范围声明依赖关系。要求requests>=2是正确的。如果您知道requests2.x不适用于该库,则要求requests>=1,<2也是正确的。您的版本范围定义正在解决的问题是您的代码和依赖项之间的API兼容性问题——没有别的。这是图书馆尽可能使用语义版本控制的一个很好的理由。因此,依赖应该写在setup.py中,像这样:这样,任何应用程序都可以轻松地使用该库并与其他应用程序共存。应用程序依赖项应用程序只是库的一个特例。它们不打算被其他应用程序库重用(导入)——尽管实际上没有什么可以阻止它。最终,这意味着您应该在应用程序的setup.py中指定依赖项,就像您为库指定依赖项一样。主要区别在于应用程序通常部署在生产环境中以提供其服务。部署需要可重用。为此,你不能只依赖setup.py:因为请求的依赖范围太广了。重新部署应用程序时,您希望随时可以随意更改版本。因此,您需要一个不同的版本管理机制来处理部署,而不仅仅是setup.py。pipenv在其文档中有一个部分很好地总结了这一点。它将依赖类型分为抽象依赖和具体依赖:抽象依赖是基于范围的(例如库),而具体依赖是用精确的版本指定的(例如应用程序部署)——正如我们在这里看到的。处理部署requirements.txt文件长期以来一直用于解决应用程序部署的可重用性问题。它的格式通常是这样的:每个库都将自己指定为一个微版本。这确保您的每个部署都将安装相同版本的依赖项。使用requirements.txt是一个简单的解决方案,也是实现可重用部署的第一步。然而,这还不够。事实上,虽然你可以指定你想要的请求版本,但如果请求依赖于urllib3,那么这将使pip安装urllib2.1或urllib2.2。您无法知道将安装哪一个,这不会使您的部署100%可重用。当然,您可以在requirements.txt中复制所有请求依赖项,但这太疯狂了!应用程序依赖关系树有时可能非常深且复杂。可以使用各种技巧来修复此限制,但真正的救星是pipenv和poetry。他们解决这个问题的方式类似于其他编程语言中的许多包管理器。他们生成一个锁定文件,其中包含所有已安装依赖项(以及它们自己的依赖项等)的列表和版本号。这可确保部署100%可重用。查看他们的文档以了解如何设置和使用它们!处理依赖性更新既然您拥有确保您的部署可在短时间内重复使用的锁定文件,您还有另一个问题。您如何确保您的依赖项是最新的?这是一个真正的安全问题,通过保持版本过时,您也可能会错过错误修复和优化。如果你的项目托管在GitHub上,Dependabot是解决这个问题的好方法。当锁定文件中列出的库的新版本可用时,在存储库上启用此应用程序将自动创建合并请求。例如,如果您使用redis3.3.6部署了应用程序,当新版本redis3.3.7发布时,Dependabot将创建一个合并请求以更新到redis3.3.7。此外,Dependabot还支持requirements.txt、pipenv和poetry!Dependabot正在为你更新jinja2自动部署更新基本成功。您有一个机器人,可以让您知道您的项目所需的库的新版本可用。创建合并请求后,您的持续集成系统就会启动,部署您的项目并运行测试。如果一切正常,您的合并请求可以合并。但是你真的需要参与这个过程吗?除非您个人对特定版本号特别反感——“天哪,我讨厌以3结尾的版本。遇到那个总是运气不好。”——或者除非你没有自动化测试,你,人类,是无用的。这种合并可以完全自动化。这就是Mergify发挥作用的地方。Mergify是一个GitHub应用程序,允许您定义关于如何合并合并请求的精确规则。下面是我在每个项目中使用的规则:Mergify在规则完全匹配时报告。一旦您的持续集成系统通过,Mergify就会为您合并该合并请求。然后,您可以自动触发您的部署挂钩来更新您的生产部署并立即安装新的库版本。这将使您的应用程序始终使用较新的库进行更新,并且不会落后于发布版本数年。如果发生任何错误,您仍然可以从Dependabot恢复提交-如果您希望使用Mergify规则,您还可以自动恢复提交。题外话对我来说,这是依赖管理生命周期的当前状态。虽然这非常适用于Python,但它也可以适用于许多其他使用类似模式的语言,例如Node和npm。