【问题标题】:Prevent pip from caching a package防止 pip 缓存包
【发布时间】:2019-10-08 15:01:30
【问题描述】:

有没有办法告诉 pip 永远不要为我的包创建轮缓存?

背景

我编写了一个供内部使用的包,当使用cmdclass 在setup.py 中安装时,它会设置一些符号链接。如果我安装了 sdist,这些安装后和开发后触发器运行良好,但如果我将包编译成轮子,它们就不会运行。为了解决这个问题,我确保只将 sdist 上传到我们的内部 PyPI。

问题

According to the documentation,当 pip 从 sdist 安装时,它会将其编译为轮子并缓存以供下次使用。这意味着软件包第一次安装正确,但后续安装失败。

我知道我可以使用--no-cache-dir 运行 pip,但我想确保我团队中的每个人都可以正确获取包,而无需添加这样的标志。没有人会想要这个包的轮子。

问题

我可以在我的包中设置一个设置或配置变量来告诉 pip 永远不要将其缓存为轮子吗?

【问题讨论】:

    标签: python python-3.x pip setuptools


    【解决方案1】:

    据我所知,没有干净的方法可以做到这一点。你可以抓住机会玩脏。

    受comment 的启发,您可以尝试使用如下所示的setup.py 脚本(仅经过部分测试):

    #!/usr/bin/env python3
    
    import setuptools
    
    setuptools.setup(
        name='LookMaNoWheels',
        version='1.2.3',
        cmdclass={'bdist_wheel': None},
    )
    

    这个想法是在尝试构建轮子时强制失败。发生这种情况时,pip 等工具往往会通过直接从任何可用的发行版(在您的情况下为 sdist)安装来从中恢复。


    更新

    这样的事情将有助于提供更多信息的错误消息:

    #!/usr/bin/env python3
    
    import distutils.errors
    import setuptools
    
    bdist_wheel = None
    
    try:
        import wheel.bdist_wheel
        class bdist_wheel(wheel.bdist_wheel.bdist_wheel):
            def run(self, *args, **kwargs):
                raise distutils.errors.DistutilsClassError("No!")
    except ModuleNotFoundError:
        pass
    
    setuptools.setup(
        name='LookMaNoWheels',
        version='1.2.3',
        cmdclass={'bdist_wheel': bdist_wheel},
    )
    

    【讨论】:

    • 我喜欢你肮脏的策略和包命名方案!我得到了一个很大的TypeError: issubclass() arg 1 must be a class,但是安装了 sdist 并且轮子没有被缓存
    • 可能有一种很好的方式来传递更多信息,以避免吓到您的包裹的用户。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2010-12-25
    • 2017-09-27
    • 2012-10-19
    • 2020-05-27
    相关资源
    最近更新 更多