Как изложить в require.txt прямой источник github
Я установил библиотеку с помощью команды
pip install git+git://github.com/mozilla/elasticutils.git
который устанавливает его прямо из репозитория Github. Это прекрасно работает, и я хочу иметь эту зависимость в моем requirements.txt
, Я смотрел на другие билеты, как это, но это не решило мою проблему. Если я поставлю что-то вроде
-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev
в requirements.txt
файл, pip install -r requirements.txt
приводит к следующему выводу:
Downloading/unpacking elasticutils==0.7.dev (from -r requirements.txt (line 20))
Could not find a version that satisfies the requirement elasticutils==0.7.dev (from -r requirements.txt (line 20)) (from versions: )
No distributions matching the version for elasticutils==0.7.dev (from -r requirements.txt (line 20))
В документации к файлу требований не упоминаются ссылки, использующие git+git
спецификатор протокола, так что, возможно, это просто не поддерживается.
У кого-нибудь есть решение моей проблемы?
10 ответов
Синтаксис "редактируемых" пакетов можно использовать в requirements.txt
чтобы импортировать пакеты из различных VCS (git, hg, bzr, svn):
-e git://github.com/mozilla/elasticutils.git#egg=elasticutils
Также можно указать конкретный коммит:
-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils
Обычно ваш requirements.txt
файл будет выглядеть примерно так:
package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...
Чтобы указать Github репо, вам не нужно package-name==
условность.
Обновление примеров ниже package-two
используя репозиторий GitHub. Текст между @
а также #
обозначает специфику упаковки.
Укажите хеш коммита (41b95ec
в контексте обновленного requirements.txt
):
package-one==1.9.4
git+git://github.com/path/to/package-two@41b95ec#egg=package-two
package-three==1.0.1
Укажите название филиала (master
):
git+git://github.com/path/to/package-two@master#egg=package-two
Укажите тег (0.1
):
git+git://github.com/path/to/package-two@0.1#egg=package-two
Укажите выпуск (3.7.1
):
git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two
Обратите внимание, что #egg=package-two
здесь не комментарий, а явное указание имени пакета
В этом блоге есть еще обсуждение этой темы.
requirements.txt
позволяет следующие способы указания зависимости от пакета в git-репозитории начиная с пипа 7.0:1
[-e] git+git://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+https://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+ssh://git.myproject.org/SomeProject#egg=SomeProject
-e git+git@git.myproject.org:SomeProject#egg=SomeProject
Для Github это означает, что вы можете сделать (обратите внимание на пропущенный -e
):
git+git://github.com/mozilla/elasticutils.git#egg=elasticutils
Почему дополнительный ответ?
Я был несколько смущен -e
пометьте в других ответах, вот мое пояснение:
-e
или же --editable
флаг означает, что пакет установлен в <venv path>/src/SomeProject
и, таким образом, не в глубоко похоронен <venv path>/lib/pythonX.X/site-packages/SomeProject
в противном случае он будет помещен в.2
Документация
Сначала установите с git+git
или же git+https
В любом случае вы знаете. Пример установки kronok
ветка brabeion
проект:
pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion
Во-вторых, использовать pip freeze > requirements.txt
чтобы получить правильную вещь в вашем requirements.txt
, В этом случае вы получите
-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master
В-третьих, проверьте результат:
pip uninstall brabeion
pip install -r requirements.txt
С пипа v1.5
, (выпущено 1 января 2014 г.: CHANGELOG, PR) вы также можете указать подкаталог git-репо, содержащий ваш модуль. Синтаксис выглядит так:
pip install -e git+https://git.repo/some_repo.git#egg=my_subdir_pkg&subdirectory=my_subdir_pkg # install a python package from a repo subdirectory
Примечание. Как автор модуля pip, в идеале вы, возможно, захотите опубликовать свой модуль в своем репо верхнего уровня, если сможете. Тем не менее, эта функция полезна для некоторых уже существующих репозиториев, которые содержат модули Python в подкаталогах. Вы можете быть вынуждены установить их таким образом, если они также не публикуются в pypi.
Github имеет конечную точку zip, которая, на мой взгляд, предпочтительнее использования протокола git. Преимущества:
- Вам не нужно указывать
#egg=<project name>
- Git не нужно устанавливать в вашей среде, что хорошо для контейнерных сред.
- Он намного лучше работает с хешированием pip
- Структуру URL легче запомнить и легче обнаружить.
Обычно вы хотите, чтобы записи в файле requirements.txt выглядели так, например, без
-e
приставка:
https://github.com/org/package/archive/1a58aa586efd4bca37f2cfb9d9348958986aab6c.zip
Для установки из основной ветки:
https://github.com/org/package/archive/main.zip
Ни один из этих ответов не помог мне. Единственное, что сработало:
git+https://github.com/path_to_my_project.git
Никакого "e", никакого двойного "git" и никакой предыдущей установки не требуется.
Похоже, это тоже допустимый формат:
gym-tictactoe @ git+https://github.com/haje01/gym-tictactoe.git@84e22fc28fe192ba0040bdd56a697f63d3d4a3d5
Если вы сделаете
pip install "git+https://github.com/haje01/gym-tictactoe.git"
, затем посмотрите, что было установлено, запустив
pip freeze
, вы увидите пакет, описанный в этом формате, и сможете скопировать его и вставить в файл requirements.txt.
Я обнаружил, что довольно сложно заставить pip3 (v9.0.1, установленный менеджером пакетов Ubuntu 18.04) на самом деле установить то, что я ему говорю. Я отправляю этот ответ, чтобы сэкономить время всем, кто сталкивается с этой проблемой.
Не удалось поместить это в файл requirements.txt:
git+git://github.com/myname/myrepo.git@my-branch#egg=eggname
Под "неудачно" я подразумеваю, что, хотя он загрузил код из Git, в итоге он установил исходную версию кода, найденную на PyPi, вместо кода в репозитории этой ветки.
Однако установка коммита вместо имени ветки работает:
git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname
Для частных репозиториев я обнаружил, что у меня отлично работают эти два:
pip install https://${GITHUB_TOKEN}@github.com/owner/repo/archive/main.tar.gz
Где
main.tar.gz
относится к
main
ветка вашего репозитория и может быть заменена другими именами веток. Для получения дополнительной информации и использования более свежего API Github см. здесь:
pip install https://${GITHUB_TOKEN}@api.github.com/repos/owner/repo/tarball/master
Если у вас установлен и доступен git, то
pip install git+https://${GITHUB_TOKEN}@github.com/owner/repo.git@main
достигает того же, а также обеспечивает большую гибкость, добавляя
@branch
или же
@tag
или же
@commit-hash
. Однако этот подход фактически клонирует репозиторий в локальную временную папку, что может занять значительное время.
Вы также можете использовать URL-адреса в файле requirements.txt.