我知道在很多情况下,明确声明我们正在使用的依赖版本是非常重要的,因此这也适用于嵌套的依赖关系。
然而,当我们决定删除一个依赖项并需要使用像 pideptree 这样的工具查找它是否有任何自己的依赖项时,情况就变得非常混乱。而且还需要确保这些嵌套的依赖项不被我们其他的一级依赖项所使用。
假设我们不需要冻结我们的依赖版本,那么包含嵌套依赖项的优点是什么呢?与让 pip 为我们处理有什么区别呢?
我知道在很多情况下,明确声明我们正在使用的依赖版本是非常重要的,因此这也适用于嵌套的依赖关系。
然而,当我们决定删除一个依赖项并需要使用像 pideptree 这样的工具查找它是否有任何自己的依赖项时,情况就变得非常混乱。而且还需要确保这些嵌套的依赖项不被我们其他的一级依赖项所使用。
假设我们不需要冻结我们的依赖版本,那么包含嵌套依赖项的优点是什么呢?与让 pip 为我们处理有什么区别呢?
实际上,人们不会这样做。 requirements.txt
应该列出您的依赖项而不包含嵌套依赖项。 固定依赖关系通常放在另一个文件中:
pip freeze > requirements-freeze.txt
requirements.txt
中设置依赖关系,那不算是一个错误,但肯定不是最佳实践。实际上,你是正确的。如果你尝试过pipenv
,你会发现它就是你想要的东西。
人们之所以在requirements.txt
中写出所有嵌套依赖关系,只是因为pip freeze > requirements.txt
将列出所有已安装的软件包。
pipenv
使用一种更好的方式来管理依赖关系,类似于npm
或yarn
,因此您可以轻松地删除顶级模块的所有嵌套依赖项。
但是列出所有嵌套依赖项仍然是合理的。我之前遇到的一个情况是,第三方A依赖于另一个第三方B。在A中,B的依赖关系是B>=4.10.0
。但是在B==4.12.0
中,一些软件包从一个模块迁移到了另一个模块。由于导入断裂,整个库A也崩溃了。