Можно ли использовать pip для установки пакета из частного репозитория github?
как следует из названия, я пытаюсь установить пакет python из частного репозитория github. Для публичного репозитория я могу выдать следующую команду, которая отлично работает:
pip install git+git://github.com/django/django.git
однако, если я попробую это для частного репозитория:
pip install git+git://github.com/echweb/echweb-utils.git
я получаю следующий вывод:
Downloading/unpacking git+git://github.com/echweb/echweb-utils.git
Cloning Git repository git://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build
Complete output from command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build:
fatal: The remote end hung up unexpectedly
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build...
----------------------------------------
Command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build failed with error code 128
Я думаю, это потому, что я пытаюсь получить доступ к частному репозиторию без предоставления какой-либо аутентификации. Поэтому я попытался использовать git + ssh, надеясь, что pip будет использовать мой открытый ключ ssh для аутентификации:
pip install git+ssh://github.com/echweb/echweb-utils.git
это дает следующий результат:
Downloading/unpacking git+ssh://github.com/echweb/echweb-utils.git
Cloning Git repository ssh://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build
Complete output from command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build:
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build...
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
----------------------------------------
Command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build failed with error code 128
кто-нибудь знает, возможно ли то, чего я пытаюсь достичь? Если да, то скажите мне, пожалуйста, как?
13 ответов
можно использовать git+ssh
схема URI, но вы должны установить имя пользователя:
pip install git+ssh://git@github.com/echweb/echweb-utils.git
посмотреть git@
часть в URI?
PS: Также читайте о развернуть ключи.
PPS: в моей установке схема URI "git+ssh" работает только с" редактируемыми " требованиями:
pip install -e URI#egg=EggName
помните: изменить :
символ, который git remote -v
печатает на /
символ перед использованием адреса пульта в :
$ git remote -v
origin git@github.com:echweb/echweb-utils.git (fetch)
^ change this to a '/' character
если вы забудете, вы получите эту ошибку:
ssh: Could not resolve hostname github.com:echweb:
nodename nor servname provided, or not known
в качестве дополнительного метода, если у вас есть частный репозиторий, клонированный локально, вы можете сделать:
pip install git+file://c:/repo/directory
EDIT: более современно, вы можете просто сделать это (и -e
будет означать, что вам не нужно фиксировать изменения, прежде чем они будут отражены):
pip install -e C:\repo\directory
вы можете сделать это непосредственно с URL HTTPS, как это:
pip install git+https://github.com/username/repo.git
Это также работает, просто добавляя эту строку в требования.например, txt в проекте django.
также работает с Bitbucket:
pip install git+ssh://git@bitbucket.org/username/projectname.git
Pip будет использовать ваши SSH-ключи в этом случае.
синтаксис файла требований приведен здесь:
https://pip.pypa.io/en/latest/reference/pip_install.html#requirements-file-format
например:
-e git+http://github.com/rwillmer/django-behave#egg=django-behave
Если вы хотите, чтобы источник придерживался после установки
или просто
git+http://github.com/rwillmer/django-behave#egg=django-behave
Если вы просто хотите, чтобы он установлен.
я нашел, что гораздо проще использовать токены, чем ключи SSH. Я не мог найти много хорошей документации по этому вопросу, поэтому наткнулся на это решение в основном через проб и ошибок. Кроме того, установка из pip & setuptools имеет некоторые тонкие различия; но этот способ должен работать для обоих.
GitHub не (в настоящее время, по состоянию на август 2016 года) предлагает простой способ получить zip / tarball частных РЕПО. Поэтому вам нужно указать setuptools, чтобы сообщить setuptools, что вы указываете на git РЕПО:
from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']
setup(
# ...
install_requires='package',
dependency_links = [
'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
.format(github_token=github_token, package=package, version=master)
]
пара заметок здесь:
- для частных репозиториев вам нужно аутентифицироваться с помощью GitHub; самый простой способ, который я нашел, - создать токен oauth, удалить его в свою среду, а затем включить его с URL
- вы должны включить некоторые номер версии (здесь
0
) в конце ссылки, даже если на PyPI нет пакета. Это должно быть настоящее число, а не слово. - вам нужно предисловие с
git+
чтобы сказать setuptools, это клонировать РЕПО, а не указывать на zip / tarball -
version
может быть ветвью, тегом или хэшем фиксации - вам нужно поставить
--process-dependency-links
при установке из pip
когда я устанавливал из github, я смог использовать:
pip install git+ssh://git@github.com/<username>/<projectname>.git#egg=<eggname>
но, так как я должен был запустить pip как sudo
, SSH-ключи больше не работали с github, "git clone" не удалось выполнить "отказано в разрешении (publickey)". Используя git+https
позволил мне запустить команду как sudo, и github спросит меня о моем пользователе / пароле.
sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
я понял, как автоматически "pip install" частный репозиторий GitLab, который не требует запроса пароля. Этот подход использует GitLab "Deploy Keys" и конфигурационный файл SSH, чтобы вы могли развертывать ключи, отличные от ваших личных SSH-ключей (в моем случае, для использования ботом). Возможно, кто-то добрая душа может проверить с помощью GitHub.
создайте новый ключ SSH:
ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"
файл должен отображаться как ~/.ssh/GitLab_Robot_Deploy_Key
и ~/.ssh/GitLab_Robot_Deploy_Key.pub
скопировать и вставьте содержимое ~/.ssh/GitLab_Robot_Deploy_Key.pub
файл в диалоговом окне GitLab "развернуть ключи".
Проверьте новый ключ развертывания
следующая команда сообщает SSH использовать новый ключ развертывания для настройки соединения. На успех, вы должны получить сообщение: "Добро пожаловать в GitLab, имя пользователя!"
ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key git@gitlab.mycorp.com
создайте конфигурационный файл SSH
затем используйте редактор для создания . Добавьте следующее содержимое. Значение 'Host' может быть любым вы хотите (просто помните об этом, потому что вы будете использовать его позже). Имя хоста-это URL-адрес вашего экземпляра GitLab. IdentifyFile-это путь к ключевому файлу SSH, который вы создали на первом шаге.
Host GitLab
HostName gitlab.mycorp.com
IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key
укажите SSH в конфигурационный файл
@oxyum дал нам рецепт использования pip с SSH:
pip install git+ssh://git@gitlab.mycorp.com/my_name/my_repo.git
нам просто нужно немного изменить его, чтобы SSH использовал наш новый ключ развертывания. Мы делаем это, указывая SSH на Хост в файл SSH конфиг. Просто замените ...gitlab.mycorp.com ' в команде имени хоста, которое мы использовали в конфигурационном файле SSH:
pip install git+ssh://git@GitLab/my_name/my_repo.git
пакет должен теперь установить без запроса пароля.
вы также можете установить зависимость частного РЕПО через git+https://github.com/... URL, предоставив учетные данные для входа (логин и пароль, или развернуть маркер) для curl С :
echo "machine github.com login ei-grad password mypasswordshouldbehere" > ~/.netrc
pip install "git+https://github.com/ei-grad/my_private_repo.git#egg=my_private_repo"
oxyum это!--5--> решение хорошо для этого ответа, я просто хочу отметить, что вы должны быть осторожны при использовании sudo
поскольку ключи также должны храниться для root (например,/root/.ssh
).
затем вы можете ввести
sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git
вы можете попробовать
pip install git+git@gitlab.mycorp.com/my_name/my_repo.git
без ssh:... Это моя работа.
Если у вас есть собственная библиотека/пакет на github/gitlab и т. д., Вам нужно добавить тег для фиксации с конкретной версией библиотеки, например v2.0 затем вы можете установить свой пакет
pip install git+ssh://link/name/repo.git@v2.0
это работает для меня. Другие решения не сработали для меня.
Если вы не хотите использовать ssh, вы можете добавить имя пользователя и пароль в url https.
В приведенном ниже коде предполагается, что у вас есть файл с именем "pass" в рабочем каталоге, который содержит ваш пароль.
export PASS=$(cat pass)
pip install git+https://<username>:$PASS@github.com/echweb/echweb-utils.git