首页 > 解决方案 > 尝试使 Python 项目要求无版本

问题描述

想象一个项目MyLibrary,它曾经有自己的requirements.txt文件,指定每个依赖项所需的所有版本......

lib_a==0.1
lib_b==0.11
lib_c==0.1.1
lib_d==0.1.2
lib_e==0.1.8

还有一个项目ChildProject恰好具有相同的设置,具有自己的requirements.txt文件和所有内容。

ChildProject使用MyLibrary它需要它具有的一些通用功能。这两个的问题在于,它ChildProject有一个也在 中指定的库MyLibrary,但版本不同,这会导致冲突并导致构建失败。

我为摆脱这个问题所做的是删除依赖关系MyLibrary并为每个库指定最小和最大版本,在方法setup_requires内的属性中指定那些setup()...

setup(
    setup_requires=['pbr', 'pytest-runner'],
    install_requires=[
        'lib_a>=0,<1',
        'lib_b>=0,<2',
        'lib_c>=0,<3',
        'lib_d>=0,<4',
        'lib_e>=0,<5'
    ],
    pbr=True,
)

这就是我迷路的地方......

我应该删除并将所有版本控制留给子项目使用吗requirements.txtMyLibrary

如果是这样,我怎么知道它ChildProject指定了所有需要的依赖项?如果我错过指定lib_ainChildProject怎么办?

符合setup_requires约束的最新版本是否会自动安装或它是如何工作的?(我问这个是因为 AFAIK,install_requires只是指定了约束,但在项目中不包含任何库)。

标签: pythonpython-3.x

解决方案


管理 deps 版本的一般建议:

  • 固定版本(即install_requires根本没有版本,或者松散的限制,即<4)。这就是你已经拥有的

  • 应用程序可以做任何需要的事情。实际上,强烈建议将您的依赖项固定到某个确切的版本(更好的是 - 提供哈希,以使自己免受伪造的库的影响)。原因——你不能保证 3rd-party 库遵循semver。这意味着>2, <3requirements.txt可能会导致构建/部署中断,因为发布2.5的第 3 方库似乎与2.4. 因此,您必须尽力避免通过在不同时间重新构建来破坏构建。换句话说,您的构建在 PyPI 状态上应该是幂等的。

    一般来说——你将版本固定到某个状态,测试你的应用程序并提交/保存/构建/无论你交付什么。一段时间后,您正在修改版本(即更新框架或解决安全补丁),更新版本requirements.txt,使用新的 deps 状态测试您的应用程序,如果没有冲突/损坏的部分,您使用固定版本“冻结”该状态,并构建/部署/等。这种循环为您提供了偶尔更新需求以保持最新的空间,同时您的代码不会因重新安装依赖项而被破坏。

如果您希望使用版本更轻松地进行 dep 管理,我建议您查看pipenv


推荐阅读