想象一下一个项目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
仅指定了约束,但在项目中不包含任何库。)
答案 0 :(得分:1)
管理部门版本的一般建议:
install_requires
根本没有版本,或者没有严格的限制,即<4
) 。那就是你已经拥有的 应用程序可以执行所需的任何操作。实际上,强烈建议将您的依赖项固定到某个确切的版本(还有更好的功能-提供哈希值,以使自己摆脱伪造的库)。这样做的原因-您不能保证第三方库遵循semver。这意味着您的>2, <3
中有requirements.txt
可能会导致构建/部署失败,因为第三方lib发布了2.5
,它似乎与2.4
向后不兼容。因此,您必须尽最大努力避免仅在不同时间进行重新构建而破坏构建。换句话说,您的构建应该在PyPI状态上是幂等的。
通常-您将版本固定到某种状态,测试您的应用程序并提交/保存/构建/以任何方式交付。一段时间后,您要修改版本(例如,更新框架或解决安全补丁程序),在requirements.txt
中更新版本,以新的Deps状态测试您的应用,如果没有冲突/损坏的部分,您可以“冻结”固定版本的状态,以及build / deploy / etc。这种循环使您有空间偶尔更新您的需求以保持最新,同时,您的代码也不会因重新安装依赖项而被破坏。
如果您希望通过版本简化Dep管理,建议您查看pipenv