我正在运行一个相当复杂的Django应用程序,大约一年了。它在requirements.txt中有大约50个包
每当我需要一个新软件包时,我用pip安装它,然后手动将它添加到requirements.txt文件中并使用固定版本:
SomeNewModule==1.2.3
这意味着我的大部分套餐在一年后现已过时。当我特别需要一个新功能时,我已手动更新了其中几个。
我开始认为可能存在我错过的安全补丁,但由于后向不兼容,我不愿盲目地更新它们。
这是否有标准的最佳做法?
答案 0 :(得分:4)
不要更新生产中的包,你可以制动东西,如果你有一个包含数据库表的包,你更新它就可以制动你的数据库。我用过例如python social auth,我想把它升级到最后一个版本,所以为此,我需要它升级版本x,运行迁移,然后到达最后版本并迁移。 升级开发环境中的软件包,进行测试。如果您有预生产,请在开发测试之后执行此操作。
答案 1 :(得分:3)
版本化python模块(以及许多其他软件)的常见模式是major.minor.patch 在初始发布之后,补丁版本不会更改api,次版本可能以向后兼容的方式更改api,主要版本通常不向后兼容
所以,如果你有module==x.y.z a
相对安全的要求规范,那就是:
module>=x.y.z,<x.y+1.0
请注意,虽然这通常没问题,但它基于常规做法,并且不能保证有效,并且更有可能通过更“有组织”的模块保持稳定
答案 2 :(得分:1)
业界最强大的做法之一是确保您的代码经过良好的单元测试,经过良好的性能测试,并经过良好的回归测试。一旦您获得了良好的覆盖率并且测试为绿色,就开始升级您的依赖项。如果你有野心勃勃的话,你可能想要一次做这个,或者你可以全力以赴,试试运气。如果升级后您的测试仍然是绿色的,并且您可以手动完成所有工作流程,那么您很可能已经清楚了!那些花费时间的测试可以用于任何较小的增量升级。
答案 3 :(得分:1)
首先,我的一点背景。我是一名安全测试工程师并且在Python上工作很多,据说我的大部分工作都是测试代码,而我通常使用的产品并不附带运行在盒子上的Python,所以我无法直接回答有关特定问题的问题。 Python包。我可以给你一些关于大多数公司在一般意义上面对这些问题时所做的一些经验法则。
弄清楚你是否需要更新:
1)运行安全扫描程序(如Nessus)。如果你的应用程序堆栈或主机有任何明显的版本问题,Nessus会给你一些应该立即解决的问题
2)检查所有软件包的发行说明,看看是否有任何实际需要更新的内容。特别注意打开套接字的任何包。如果没有安全修复程序,则可能不值得花时间更新。在某些情况下,即使包中存在安全问题,也可能是您未使用的内容,因此请注意问题描述。如果您现在正在生产应用程序,通常目标是尽可能少地更改以限制需要完成的代码更新和测试的数量。
如果您发现需要更新才能开始解析依赖项:
1)可能最简单的方法是设置测试环境并开始安装所需的更新版本。再一次,尝试在测试环境中安装代码时进行一些更改。在Python中,C库对大多数安全性内容都有依赖性。在您的测试环境中,确保同样具有相同的低级系统库...
2)创建需要进行的更改列表,并开始为需要替换的代码部分设计测试计划。
设置开发环境后,测试测试。您可能希望重新运行安全扫描程序并确保使用所有新代码。
希望有所帮助
答案 4 :(得分:1)
这取决于。大多数情况下,更新软件包以进行次要版本更改(例如:2.45.1 - > 2.56.1)不太可能破坏您的系统。但是,仍然建议进行广泛的回归测试。但是,绝对应该避免主要版本更改(例如2.45.1到3.13.0),因为它们中的大多数几乎没有向后兼容性。这方面的一个例子是selenium web驱动程序,与版本2.56相比,3.0版本无法在没有geckodriver的情况下运行。无论如何,应该对新旧代码进行广泛的单元和回归测试,以确保没有意外的变化,特别是在极端情况下。
考虑到你已经提到你提到你只使用一个python点,我可以说这将是未来程序的一个问题,因为你可能需要为不同的项目使用相同包的不同版本。 / p>
避免此类问题的可接受做法是为每个项目使用虚拟环境。只需在项目根目录中创建一个makefile并使用: virtualenv --python = $ {PYTHON} env env / bin / pip install --upgrade pip env / bin / pip --upgrade setuptools wheel pip-tools
然后让env / bin / pip安装requirements.txt文件中的需求。
答案 5 :(得分:0)
你是对的。会出现向后不兼容问题。不要盲目更新软件包。最有可能的是,你将有package / module / class / variable / key undefined / notFound问题。特别是你有一个复杂的系统。即使您使用pip install --upgrade somepackage
这是我真实经验的教训。