Как я могу заставить pip надежно установить пакет вскоре после его обновления?

#python #pip #pypi #python-packaging

Вопрос:

Краткие сведения

Похоже, потребуется два раза pip , чтобы найти недавно обновленную версию пакета для установки. Я хотел бы иметь возможность надежно установить его с первой попытки.

Подробные сведения

Я пытался автоматизировать процесс выпуска пакета Python, который я поддерживаю, с помощью пакетного сценария. Мой рабочий процесс состоял в том, чтобы опубликовать его в TestPyPI, затем установить его оттуда в чистую виртуальную среду и запустить копию набора тестов (тесты не входят в комплект dist; я копирую их локально из каталога проекта разработки).

Однако на этапе установки произошел сбой сценария, так pip как не удалось найти указанную версию:

 ERROR: Could not find a version that satisfies the requirement my-package==<version>
 

Я предположил, что это может быть связано с тем, что я пытался установить слишком быстро после простого обновления, и, возможно, потребовалось еще несколько секунд, чтобы обновление дошло до соответствующего места. Поэтому я добавил 10-секундный тайм-аут, а затем 30-секундный тайм-аут, но столкнулся с той же проблемой. Хотя, опять же, попытка вручную после выхода из сценария сработала немедленно.

Поскольку казалось, что он всегда работал со вторым попаданием, я добавил вторую копию команды установки в сценарий (сразу после, без тайм-аута) и остановил его выход, если он ошибся в первом. Теперь это работает надежно, так как всегда терпит неудачу в первый раз, но преуспевает во второй.

Я могу смутно предположить, что, возможно, второе попадание заставляет его очистить какой-то кэш или что-то в этом роде, но я действительно понятия не имею, как работает эта магия!

Вопрос

Я хотел бы иметь способ заставить установку работать надежно, без необходимости в этой фиктивной первой команде. Возможно ли это?

Другие подробности

Уменьшенная версия пакетного сценария представляет собой:

 poetry build
poetry run twine check dist/my-package-%VERSION%*
poetry publish -r test-pypi -u my-user

mkdir %TESTDIR%
cd %TESTDIR%
python -m venv venv
call venvScriptsactivate
python -m pip install --upgrade pip

call python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ my-package==%VERSION%
call python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ my-package==%VERSION%
 
  • This is using pip v21.1.1
  • В настоящее время эта версия является бета-версией, отчасти поэтому я ее использовал my-package==%VERSION% (поскольку pip по умолчанию не используются версии для разработки). Я попытался добавить --pre флаг; со спецификатором версии это не имеет значения (он все еще не находит последнюю версию с первой попытки), без спецификатора версии он просто устанавливает предыдущую последнюю предварительную версию.
  • В настоящее время я вручную ввожу свой пароль в терминале при появлении запроса на этом poetry publish шаге.