pip неожиданно не установил последнюю версию пакета git с закреплением ветки / коммита
У меня есть файл require.txt со следующей строкой (среди прочих):
git+https://github.com/lead-ratings/sexmachine.git@master#egg=SexMachine
Когда я делаю
pip install -r requirements.txt
я вижу
Requirement already satisfied (use --upgrade to upgrade): SexMachine from git+https://github.com/lead-ratings/sexmachine.git@master#egg=SexMachine in /home/myuser/virtual_env/lib/python2.7/site-packages (from -r requirements.txt (line 38))
И пакет не обновляется до мастер-версии. На самом деле, он сохраняет некоторую прежнюю версию из PyPI, которую я перечислил в requirements.txt
до.
Это не сработает, если я укажу коммит в закреплении или использую --no-cache-dir
флаг. Я использую пип 6.1.1.
Если я использую --upgrade
флаг то работает. Но тогда какой смысл пиннинга? Почему написано "Требование уже выполнено", если оно действительно не выполнено?
3 ответа
Pip решает, удовлетворяется ли требование исключительно на основе номера версии (в setup.py). В вашем случае версия pypi, которую вы установили ранее, имела тот же номер версии, что и основная ветка sexmachine, поэтому pip ничего не сделал.
Кажется, что способ справиться с этим состоит в том, чтобы всегда передавать -U
/ --upgrade
флаг:
pip install -r requirements.txt -U
Положение сопровождающего дано в # 2835:
Поведение pip здесь правильное, мы не определяем номер версии проекта / файла, который идет изнутри пакета. Если они хотят поддержать произвольную идентификацию произвольных тегов, они должны настроить свои файлы setup.py исходя из этого.
В моем случае даже
-U
или же
--upgrade
не работал. Pip также требует, чтобы версия в setup.py отличалась, чтобы установить новую версию. Обновив версию пакета в setup.py, все заработало.
У меня была похожая проблема, когда я создал среду conda с установкой пакета на GitHub, привязанного к определенному коммиту. Затем я хотел обновить этот пакет с помощью
pip
прикрепление его к другому коммиту.
-U
флаг не помог. Тем не менее
--force-reinstall
тег сделал.