#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
шаге.