python - 尝试使 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.txt
?MyLibrary
如果是这样,我怎么知道它ChildProject
指定了所有需要的依赖项?如果我错过指定lib_a
inChildProject
怎么办?
符合setup_requires
约束的最新版本是否会自动安装或它是如何工作的?(我问这个是因为 AFAIK,install_requires
只是指定了约束,但在项目中不包含任何库)。
解决方案
管理 deps 版本的一般建议:
库不固定版本(即
install_requires
根本没有版本,或者松散的限制,即<4
)。这就是你已经拥有的应用程序可以做任何需要的事情。实际上,强烈建议将您的依赖项固定到某个确切的版本(更好的是 - 提供哈希,以使自己免受伪造的库的影响)。原因——你不能保证 3rd-party 库遵循semver。这意味着
>2, <3
您requirements.txt
可能会导致构建/部署中断,因为发布2.5
的第 3 方库似乎与2.4
. 因此,您必须尽力避免通过在不同时间重新构建来破坏构建。换句话说,您的构建在 PyPI 状态上应该是幂等的。一般来说——你将版本固定到某个状态,测试你的应用程序并提交/保存/构建/无论你交付什么。一段时间后,您正在修改版本(即更新框架或解决安全补丁),更新版本
requirements.txt
,使用新的 deps 状态测试您的应用程序,如果没有冲突/损坏的部分,您使用固定版本“冻结”该状态,并构建/部署/等。这种循环为您提供了偶尔更新需求以保持最新的空间,同时您的代码不会因重新安装依赖项而被破坏。
如果您希望使用版本更轻松地进行 dep 管理,我建议您查看pipenv
推荐阅读
- reactjs - 在 reactjs 中添加更多点击时以相反的顺序呈现 JSX 模板
- postgresql - 我想根据 Postgresql 上的数据时间在我的表中添加一列,显示数据中的周数
- python-3.x - 使用 tkinter 从条目小部件将输入打印到文本框
- c++ - 提升精神 x3 错误处理与预期
- excel - 如何修复此 Excel VBA 代码以导入空单元格
- ada - (Ada 2012)编译时错误“预期私有类型...找到复合类型”
- sql - 替换 0 个或多个 html 标记内的文本
- c# - 如何在域/iis 站点中有两个不同的 asp.net 项目
- exc-bad-instruction - *.XLS 文件的 VBA 复制单元格值合并
- docker - docker容器中意外的未映射端口80