【问题标题】:Can I declare incompatible python dependencies?我可以声明不兼容的 python 依赖项吗?
【发布时间】:2019-09-14 19:20:32
【问题描述】:

我想知道如果存在特定版本的模块但不使该模块本身成为依赖项,我是否可以声明一个包将不起作用。

例如,作为包发布者,我发现 python 中 foo==1.2.3 的存在破坏了某些关键,即使我个人自己不使用它。

有没有办法声明不兼容,所以如果检测到这个模块,我的包将无法安装?

我知道我可以在运行时通过尝试导入它来动态测试它,但如果可以在包元数据中声明它,我更感兴趣,比如反依赖(或负依赖)

【问题讨论】:

  • 不行,没有办法。
  • 没有 declarative 方法可以做到这一点,但是如果您可以编写测试,您可以在 setup.py 中运行它并在以下情况下以非零状态退出它呈现
  • @Marat 根据您打包项目的方式,setup.py 可能不会在安装期间运行。如果在有问题的软件包之后安装了破坏软件包,它也将不起作用。还有@sorin,不,没有非运行时方法可以做到这一点。
  • 虽然包的用户自己构建它们并不罕见,在这种情况下,他们可以选择使用轮格式而不是源代码。
  • 目前我所知道的 安装时 没有干净的方法。可能值得阅读此文档 packaging.python.org/specifications/core-metadata/… 和此讨论 github.com/pypa/packaging-problems/issues/154 并最终权衡。诸如 Conflicts-Dist: foo==1.2.3 之类的元数据字段可能很有用。

标签: python setuptools python-packaging


【解决方案1】:

显然没有声明的方式来做到这一点,不推荐在 setup.py 中这样做,因为不能保证在安装时运行。

另外,即使可能,它也不会阻止用户以后安装不兼容的包。

这意味着唯一可靠的方法是添加运行时检查。对于 cli 工具,它应该很容易,对于库,或者它可能很棘手,因为它可能会对导入产生很小的性能影响。

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2020-10-24
    • 2016-01-11
    相关资源
    最近更新 更多