Как изложить в 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.

Другие вопросы по тегам