【问题标题】:pip - specify download version based on available library versionpip - 根据可用的库版本指定下载版本
【发布时间】:2019-10-21 23:45:30
【问题描述】:

我正在开发一个 Python 包 my_package,它依赖于其他一些包 foo_package

社区中使用了几个版本的foo_package,不幸的是它们彼此不向后兼容。 (因为我的代码编译所针对的 C 接口发生了变化)。

所以我想分发my_package的多个副本,对应foo_package的不同版本。

我可以使用发布后标签来区分my_package 的这些不同副本。例如我可以给my_package 版本1.1.4-foo_package1.2,对应于版本1.1.4my_package 针对版本1.21.2 编译。

到目前为止一切顺利。现在需要注意的是,当使用pip 安装它时,最终用户必须指定这个完整版本字符串才能获得my_package 的正确版本。也就是说,他们必须知道my_package 的最新版本是1.1.4,而他们正在使用的foo_package 的版本是1.2,因此使用命令pip install my_package==1.1.4-foo_package1.2

显然,出于各种原因,这并不理想。 (终端用户友好,避免依赖地狱......)毕竟,所有这些都可以通过编程来确定!

是否有任何明智的方法来处理此问题,以便最终用户只需运行 pip install my_package 并自动下载正确的副本?

对于类似的问题here,有一个不满意的答案。

FWIW 到目前为止我想出的最佳解决方案是创建另一个包 my_package_installer 作为其 setup.py 的一部分检查安装的 foo_package 的版本,然后指定 my_package 的相关版本作为setuptools.setupinstall_requires 参数。但这完全是愚蠢的,而且看起来很脆弱。我不可能是唯一一个遇到这个问题的人。

【问题讨论】:

    标签: python pip python-packaging


    【解决方案1】:

    从设计的角度来看,在我看来,您应该指定一个版本的 foo 作为依赖项,因为这对您的包最有效。如果其他人有不同版本的 foo,那是他们的责任。

    如果它不是那么简单,并且您对与多个版本的 foo 的兼容性有限制,那么我认为大多数开发人员所做的就是尝试在初始化时检测 foo 并从那里适应它。

    【讨论】:

    • my_package 实际上只是foo_package 的插件。我不想限制人们只使用我碰巧编译的版本。 (事实上​​,这是一个编译时问题,这意味着在初始化期间无法进行调整 - 除非最终用户有可用的编译器,否则为时已​​晚。)
    【解决方案2】:

    如何从同一个代码库创建多个 Python 项目?

    假设您有一个源代码存储库MyProject.git,并且您想为libfoo1.2libfoo1.4 分发它。那么也许一个看起来像这样的setup.py 可以解决问题:

    #!/usr/bin/env python3
    
    import distutils.core
    import setuptools
    
    def get_foo_version():
        return '1.2' if True else '1.4'
    
    foo_version = get_foo_version()
    
    foo_module = distutils.core.Extension(
        'foo',
        define_macros=[('FOO_VERSION', foo_version)],
        libraries=['foo{}'.format(foo_version)],
        sources=['foo.c'],
        # ...
    )
    
    setuptools.setup(
       name='MyProjectForFoo{}'.format(foo_version),
       ext_modules = [foo_module],
       # ...
    )
    

    在这种情况下,您最终会得到两个 Python 项目 MyProjectForFoo1.2MyProjectForFoo1.4。您项目的用户仍然需要选择正确的项目,但与按版本号排序相比,它更不容易混淆。

    您或许可以使用tox 和/或良好的 CI/CD 系统来帮助您自动创建和发布两个(或更多)项目的发行版(wheels)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 2021-12-28
      • 2020-09-23
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2015-04-30
      相关资源
      最近更新 更多