Предотвращение pip от кэширования пакета - PullRequest
1 голос
/ 08 октября 2019

Есть ли способ сообщить pip, что он никогда не должен создавать кеш колеса для моего пакета?

Справочная информация

Я написал пакет для внутреннего использования, который при установке устанавливает некоторые символические ссылкииспользуя cmdclass в setup.py. Эти триггеры после установки и после разработки работают нормально, если я устанавливаю sdist, но если я собираю пакет в колесо, они не запускаются. Чтобы противостоять этому, я загружаю sdist только в наш внутренний PyPI.

Проблема

Согласно документации , когда pip устанавливается из sdist, он компилирует егок колесу и кеширует его в следующий раз. Это означает, что пакет устанавливается правильно с первого раза, но последующие установки не работают.

Я знаю, что могу запустить pip с --no-cache-dir, но я хочу быть уверен, что все в моей команде могут получить пакет правильно, безнеобходимо добавить флаги, как это. Не бывает ситуации, когда кому-то понадобится колесо этого пакета.

Вопрос

Есть ли переменная настройки или конфигурации, которую я могу установить в своем пакете, чтобы pip никогда не кэшировал его как колесо

1 Ответ

1 голос
/ 08 октября 2019

Не существует чистого способа сделать это, о котором я знаю. Вы можете рискнуть и сыграть пакостный .

Вдохновленный этим комментарием , вы можете попробовать сценарий 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},
)
...