防止 pip 缓存包

Prevent pip from caching a package

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

背景

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

问题

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

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

问题

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

据我所知,没有干净的方法。你可以抓住机会玩dirty.

受此 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},
)