pip3 setup.py install_requires PEP 508 git URL для частного репо - PullRequest
7 голосов
/ 27 марта 2019

Я пытаюсь запустить:

pip3 install -e .

в моем проекте Python, где у меня есть следующее setup.py:

from setuptools import setup

setup(
    name='mypackage',
    install_requires=[
        "anotherpackage@git+git@bitbucket.org:myorg/anotherpackage.git"
    ]
)

но это не с:

error in mypackage setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Invalid URL given

Полагаю, формат моего URL верен, поскольку PEP 508 не позволяет указывать имя пользователя git для URL-адресов клонов ssh.

Каков правильный синтаксис для URL-адресов PEP 508 с протоколом git + ssh для зависимости install_requires для частных репозиториев git (в данном случае размещенных на BitBucket)? Каков синтаксис для указания конкретной ветви, тега или ша?

Больше контекста, чтобы избежать проблемы XY

У меня есть внутренний проект Python, который зависит от нескольких внутренних пакетов Python. Я хотел бы избежать необходимости размещать свой собственный PIP-репозиторий в организации, и поэтому я пытаюсь использовать URL-адреса git напрямую. Мне нужно использовать протокол ssh для URL-адресов git, поскольку у всех пользователей настроены ключи ssh, и было бы неудобно просить всех пользователей настраивать пароли своих приложений в BitBuckets (у меня требуется 2FA, а пароль обычного пользователя не работает) .

Я уже пытался использовать:

dependency_links

setup(
    name='mypackage',
    install_requires=[
        "anotherpackage==0.0.1"
    ],
    dependency_links=[
        "git+git@bitbucket.org:myorg/anotherpackage.git@0.0.1#egg=anotherpackage-0.0.1"
    ]
)

Но они устарели и игнорируются pip3 install -e .. Согласно документации, которую я нашел, вместо этого следует использовать URL-адреса PEP 508.

requirements.txt файл с дублирующимися записями из install_requires записей

У меня есть requirements.txt файл с:

-e git+git@bitbucket.org:myorg/anotherpackage.git@0.0.1#egg=anotherpackage

и я использую pip3 install -r requirements.txt вместо pip3 install -e .. Это работает, но неоптимально, так как мне нужно синхронизировать setyp.py и requirements.txt.

Если есть другое рекомендуемое решение для моей проблемы, я хотел бы узнать об этом:)

1 Ответ

4 голосов
/ 28 марта 2019

После проверки pip исходного кода я нашел правильный синтаксис для частных репозиториев BitBucket.

Общая форма для пакетов с URL-адресами: <package name>@<URI>, а URI должен начинаться с <scheme>://.

Так что я исправил это:

anotherpackage@git+ssh://git@bitbucket.org:myorg/anotherpackage.git

и затем я получил другую ошибку - на этот раз команда git (вызванная pip) жаловалась на URL хранилища ssh://git@bitbucket.org:myorg/anotherpackage.git.

Я проверил документацию git для формата URL ssh:// и обнаружил, что части имени хоста и организации должны быть разделены / вместо ::

ssh://git@bitbucket.org/myorg/anotherpackage.git

Этот URL работает нормально. Из исходного кода pip я также узнал, что реальную ревизию / ветвь / тег можно указать, добавив @<rev-spec>, чтобы я мог указать, например, тег 0.0.1 со следующим в install_requires:

anotherpackage@git+ssh://git@bitbucket.org:myorg/anotherpackage.git@0.0.1

Единственная проблема, которая у меня остается, заключается в том, что когда я изменяю ревизию и снова запускаю pip3 install -e ., она не обнаруживает изменения (даже при запуске с --upgrade). Мне нужно вручную удалить пакет (pip3 uninstall anotherpackage) и снова запустить pip3 install -e ..

...