Можно ли использовать 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
Кто-нибудь знает, возможно ли это, чего я пытаюсь достичь? Если да, то пожалуйста, скажите мне, как?
Ответы
Ответ 1
Вы можете использовать схему URI git+ssh
, но вы ДОЛЖНЫ установить имя пользователя:
pip install git+ssh://[email protected]/echweb/echweb-utils.git
См. [email protected]
часть в URI?
PS: Также прочтите развернуть ключи.
PPS: В моей установке схема URI "git + ssh" работает только с "редактируемыми" требованиями:
pip install -e URI#egg=EggName
Запомнить. Измените символ :
, который git remote -v
печатает на символ /
перед использованием удаленного адреса в команде pip
:
$ git remote -v
origin [email protected]: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
Ответ 2
Как дополнительный метод, если у вас есть локальный локальный репозиторий, вы можете сделать:
pip install git+file://c:/repo/directory
EDIT: более современно вы можете просто сделать это (и -e
будет означать, что вам не нужно фиксировать изменения до их отражения):
pip install -e C:\repo\directory
Ответ 3
Вы можете сделать это прямо с URL-адресом HTTPS следующим образом:
pip install git+https://github.com/username/repo.git
Это также просто добавляет эту строку в файл requirements.txt в проект django, например.
Ответ 4
Также работает с Bitbucket:
pip install git+ssh://[email protected]/username/projectname.git
В этом случае Pip будет использовать ваши SSH-ключи.
Ответ 5
Синтаксис для файла требований приведен здесь:
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
если вы просто хотите, чтобы он был установлен.
Ответ 6
Я нашел способ автоматически 'pip установить' частный репозиторий 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 "Deploy Keys".
Протестируйте новый ключ развертывания
Следующая команда указывает SSH использовать ваш новый ключ развертывания для установки соединения. В случае успеха вы должны получить сообщение: "Добро пожаловать в GitLab, UserName!"
ssh -t -i ~/.ssh/GitLab_Robot_Deploy_Key [email protected]
Создайте файл конфигурации SSH
Затем используйте редактор для создания файла ~/.ssh/config
. Добавьте следующее содержимое. Значение 'Host' может быть любым, чем вы хотите (просто запомните это, потому что вы будете использовать его позже). HostName - это URL-адрес вашего экземпляра GitLab. IdentifyFile - это путь к файлу ключа SSH, который вы создали на первом шаге.
Host GitLab
HostName gitlab.mycorp.com
IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key
Укажите SSH на файл конфигурации
@oxyum дал нам рецепт использования pip с SSH:
pip install git+ssh://[email protected]/my_name/my_repo.git
Нам просто нужно немного его изменить, чтобы SSH использовал наш новый ключ развертывания. Мы делаем это, указывая SSH на запись Host в файле конфигурации SSH. Просто замените "gitlab.mycorp.com" в команде на имя хоста, которое мы использовали в конфигурационном файле SSH:
pip install git+ssh://[email protected]/my_name/my_repo.git
Теперь пакет должен быть установлен без запроса пароля.
Ссылка A
Ссылка B
Ответ 7
Мне было гораздо легче использовать токены, чем ключи SSH. Я не мог найти много хорошей документации по этому вопросу, поэтому натолкнулся на это решение в основном путем проб и ошибок. Кроме того, установка из pip и setuptools имеет некоторые тонкие отличия; но этот способ должен работать для обоих.
GitHub не делает (в настоящее время, по состоянию на август 2016 года) предлагает простой способ получить zip/tarball частных репозиториев. Поэтому вам нужно указать setuptools, чтобы сообщить setuptools, что вы указываете на git repo:
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
Ответ 8
Когда я устанавливал из github, я смог использовать:
pip install git+ssh://[email protected]/<username>/<projectname>.git#egg=<eggname>
НО, так как мне пришлось запустить pip как sudo
, SSH-ключи больше не работали с github, "git clone" не выполнялся при "Permission denied (publickey)". Использование git+https
позволило мне запустить команду как sudo, и github спросит меня мой пользователь/пароль.
sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
Ответ 9
Вы также можете установить частную зависимость репо через URL git + https://github.com/..., указав учетные данные для входа (логин и пароль или токен развертывания) для curl с файлом .netrc
:
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"
Ответ 10
решение oxyum's одобрено для этого ответа, я просто хочу указать, что вам нужно быть осторожным, если вы устанавливаете с помощью sudo
, поскольку ключи должны быть также хранится для корня (например, /root/.ssh
).
Затем вы можете ввести
sudo pip install git+ssh://[email protected]/echweb/echweb-utils.git
Ответ 11
ты можешь попробовать
pip install [email protected]/my_name/my_repo.git
без SSH:... Это работает для меня.
Ответ 12
Если у вас есть собственная библиотека/пакет в github/gitlab и т.д., Вам нужно добавить тег для фиксации с конкретной версией библиотеки, например, v2.0, тогда вы можете установить свой пакет
pip install git+ssh://link/name/[email protected]
Это работает для меня. Другие решения не спомогли мне.
Ответ 13
Если вы не хотите использовать ssh, вы можете добавить имя пользователя и пароль в URL-адресе https.
Код ниже предполагает, что у вас есть файл с именем "pass" в рабочем каталоге, который содержит ваш пароль.
export PASS=$(cat pass)
pip install git+https://<username>:[email protected]/echweb/echweb-utils.git
Ответ 14
Если вы хотите установить зависимости из файла требований на сервере CI или аналогично, вы можете сделать это:
git config --global credential.helper 'cache'
echo "protocol=https
host=example.com
username=${GIT_USER}
password=${GIT_PASS}
" | git credential approve
pip install -r requirements.txt
В моем случае я использовал GIT_USER=gitlab-ci-token
и GIT_PASS=${CI_JOB_TOKEN}
.
Этот метод имеет явное преимущество: у вас есть один файл требований, который содержит все ваши зависимости.