尝试使Python项目要求无版本

时间:2019-01-16 14:08:42

标签: python python-3.x

想象一下一个项目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.txt中的MyLibrary并将所有版本控制留给子项目使用?

如果是这样,我怎么知道ChildProject在指定所有所需的依赖项?如果我错过在lib_a中指定ChildProject怎么办?

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

1 个答案:

答案 0 :(得分:1)

管理部门版本的一般建议:

  • 不会固定版本(即install_requires根本没有版本,或者没有严格的限制,即<4) 。那就是你已经拥有的
  • 应用程序可以执行所需的任何操作。实际上,强烈建议将您的依赖项固定到某个确切的版本(还有更好的功能-提供哈希值,以使自己摆脱伪造的库)。这样做的原因-您不能保证第三方库遵循semver。这意味着您的>2, <3中有requirements.txt可能会导致构建/部署失败,因为第三方lib发布了2.5,它似乎与2.4向后不兼容。因此,您必须尽最大努力避免仅在不同时间进行重新构建而破坏构建。换句话说,您的构建应该在PyPI状态上是幂等的。

    通常-您将版本固定到某种状态,测试您的应用程序并提交/保存/构建/以任何方式交付。一段时间后,您要修改版本(例如,更新框架或解决安全补丁程序),在requirements.txt中更新版本,以新的Deps状态测试您的应用,如果没有冲突/损坏的部分,您可以“冻结”固定版本的状态,以及build / deploy / etc。这种循环使您有空间偶尔更新您的需求以保持最新,同时,您的代码也不会因重新安装依赖项而被破坏。

如果您希望通过版本简化Dep管理,建议您查看pipenv