Подтвердить что ты не робот

Как "установить пакет" пакет с зависимостями Git?

У меня есть частная библиотека под названием some-library (фактические имена были изменены) с установочным файлом, выглядящим примерно так:

setup(
    name='some-library',

    // Omitted some less important stuff here...

    install_requires=[
        'some-git-dependency',
        'another-git-dependency',
    ],
    dependency_links=[
        'git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some-git-dependency',
        'git+ssh://[email protected]/my-organization/another-git-dependency.git#egg=another-git-dependency',
    ],
)

Все эти зависимости Git могут быть частными, поэтому установка через HTTP не является вариантом. Я могу без проблем использовать python setup.py install и python setup.py develop в some-library корневом каталоге.

Однако установка более Git не работает:

pip install -vvv -e 'git+ssh://[email protected]/my-organization/[email protected]#egg=some-library'

Команда не работает, когда она ищет some-git-dependency, ошибочно полагает, что ей нужно получить зависимость от PyPI, а затем сбой после ее завершения не на PyPI. Мое первое предположение заключалось в попытке повторного запуска команды с помощью --process-dependency-links, но потом это произошло:

   Cannot look at git URL git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some-git-dependency
   Could not find a version that satisfies the requirement some-git-dependency (from some-library) (from versions: )

Почему это порождает эту туманную ошибку? Каков правильный способ pip install пакета с зависимостями Git, которые могут быть частными?

4b9b3361

Ответ 1

Каким образом можно установить пакет с зависимостями Git, которые могут быть частными?

Две опции

  • Используйте dependency_links, как и вы. Подробнее см. Ниже.

  • Вдоль стороны dependency_links в файле setup.py используйте специальный dependency-links.txt, который собирает все необходимые пакеты. Затем добавьте этот пакет в файл требований .txt. Это моя рекомендация, как описано ниже.

    # dependency-links.txt
    git+ssh://[email protected]#egg=package-name1
    git+ssh://[email protected]#egg=package-name2
    # requirements.txt (per deployed application)
    -r dependency-links.txt
    

В то время как опция 2 добавляет дополнительную нагрузку на управление пакетами, а именно, поддерживая зависимость dependency-links.txt до настоящего времени, упрощает установку пакетов, поскольку вы можете "забыть добавить опцию --process-dependency-link на pip install.

Возможно, что более важно, используя dependency-links.txt вы можете указать точную версию, которая будет установлена ​​при развертывании, которую вы хотите в среде CI/CD, - ничего более рискованно, чем устанавливать некоторую версию. Однако с точки зрения компоновщика пакетов, и считается хорошей практикой, чтобы указать минимальную версию, например

    # setup.py in a package
    ...
       install_requires = [ 'foo>1.0', ... ]

Это здорово, потому что это делает ваши пакеты хорошо работать с другими пакетами, которые имеют похожие зависимости, но, возможно, в разных версиях. Однако в развернутом приложении это все равно может вызвать хаос, если между пакетами существуют противоречивые требования. Например. пакет A в порядке с foo>1.0, пакет B хочет foo<=1.5, а самая последняя версия - foo==2.0. Используя dependency-links.txt, вы можете быть конкретными, применяя одну версию для всех пакетов:

    # dependency-links.txt
    foo==1.5

Команда выходит из строя, когда она ищет некоторую git -зависимость,

Чтобы заставить его работать, вам нужно добавить --process-dependency-links, чтобы описать зависимость от github, например,

pip install --process-dependency-links -r private-requirements.txt

Заметьте, что pip 8.1.0 вы можете добавить эту опцию в файл требований .txt. С другой стороны, он применяется ко всем установленным пакетам и может иметь непреднамеренные последствия. Тем не менее, я считаю, что использование dependency-links.txt является более безопасным и более управляемым решением.

Все эти зависимости Git могут быть частными

Существует три варианта:

  • Добавьте коллабораторов в каждый из репозиториев требуемых пакетов. Этим сотрудникам необходимо настроить свои ssh-ключи с помощью github для этого. Затем используйте git+ssh://...

  • Добавить ключ развертывания в каждый из репозиториев. Недостатком здесь является то, что вам необходимо распространить соответствующий закрытый ключ на все машины, которые необходимо развернуть. Снова используйте git+ssh://...

  • Добавьте токен доступа к учетной записи github, в которой хранятся частные репозитории. Затем вы можете использовать git+https://[email protected]/... Недостатком является то, что токен доступа будет иметь доступ для чтения + записи ко всем репозиториям, как открытым, так и частным, в соответствующей учетной записи github. На стороне плюса больше нет необходимости распространять и управлять личными ключами для каждого репозитория, а циклический ключ намного проще. В среде, где каждый разработчик имеет доступ ко всем хранилищам, я нашел, что это самый эффективный, беспроблемный способ для всех. YMMV

Ответ 3

Если я ссылаюсь на ссылку pip install dependency links", вы не будете ссылаться на сам репозиторий GitHub, а на изображение tarball, связанное с этим репо-репитом GitHub:

dependency_links=[
        'git+ssh://[email protected]/my-organization/some-git-dependency/tarball/master/#egg=some-git-dependency',
        'git+ssh://[email protected]/my-organization/another-git-dependency/tarball/master/#egg=another-git-dependency',
    ],

с "some-git-dependency", являющимся именем * и версией зависимости.

Ответ 4

Вы должны использовать git + git, когда url С#egg, например:

-e [email protected]:foo/my-repo.git#egg=my-repo

Используйте git + ssh в процессе производства без #egg, но вы можете указать @version или branch @master

git+ssh://[email protected]/foo/[email protected]

для работы с версиями приложений используйте git tagging Git Основы - тегирование

Ответ 5

"Невозможно посмотреть git URL git + ssh://git @github.com/my-organization/some- git -dependency.git # egg = some- git -зависимость" означает, что pip не может извлечь html-страницу из этого URL-адреса, чтобы искать ссылки прямой загрузки на странице, т.е. pip не распознает URL-адрес в качестве проверки vcs, потому что может быть некоторое несоответствие между спецификатором требований и фрагментом часть в URL-адресе vcs.

В случае проверки VCS вы также должны добавить #egg=project-version, чтобы определить, какой пакет должен быть использован.

Обязательно избегайте тире в имени или версии, заменив их символами подчеркивания.

Проверить Зависимости, которые не поддерживаются в PyPI

замените - на _ в строке пакета и версии.

git+ssh://[email protected]/my-organization/some-git-dependency.git#egg=some_git_dependency  

и --allow-all-external могут быть полезны.