Como declarar no requirements.txt uma fonte direta do github


448

Eu instalei uma biblioteca usando o comando

pip install git+git://github.com/mozilla/elasticutils.git

que o instala diretamente de um repositório do Github. Isso funciona bem e eu quero ter essa dependência na minha requirements.txt. Eu olhei para outros tickets como este, mas isso não resolveu o meu problema. Se eu colocar algo como

-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev

no requirements.txtarquivo, pip install -r requirements.txtresulta na seguinte saída:

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))

A documentação do arquivo de requisitos não menciona links usando o git+gitespecificador de protocolo, portanto, talvez isso não seja suportado.

Alguém tem uma solução para o meu problema?

Respostas:


327

A sintaxe dos pacotes “editáveis” pode ser usada requirements.txtpara importar pacotes de uma variedade de VCS (git, hg, bzr, svn) :

-e git://github.com/mozilla/elasticutils.git#egg=elasticutils

Além disso, é possível apontar para um commit específico:

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils

3
Não consegui fazer checkout localmente de uma versão editável (devido a problemas de sintaxe, provavelmente) e, portanto, acabei usando a git+gitvariante (que funcionava). Nos requirements.txtseus versão funciona, então muito obrigado :)
Alfe

1
O docslink não estava funcionando para mim; Eu usei um mais velho .
Osa12

42
O que eu não entendi é que a sintaxe mostrada é exatamente o que se aplica nos requisitos, ou seja, não há nome de pacote antes do -e.
sage

5
Adicionar "-e" não é necessário, dependendo se você deseja que o pacote esteja no modo editável, veja a resposta em @qff.
Sky

17
Não deveria ser em -e git+git://vez de -e git://? Eu recebi uma mensagem de erro "deve ser um caminho para um projeto local ou uma URL VCS começando com svn +, git +, hg + ou bzr +" .
Bruce Wayne

424

Normalmente, seu requirements.txtarquivo ficaria assim:

package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...

Para especificar um repositório do Github, você não precisa do package-name== convenção.

Os exemplos abaixo são atualizados package-twousando um repositório GitHub. O texto entre @e# denota as especificidades do pacote.

Especifique o hash de confirmação ( 41b95ecno contexto de atualizado requirements.txt):

package-one==1.9.4
git+git://github.com/path/to/package-two@41b95ec#egg=package-two
package-three==1.0.1

Especifique o nome da filial ( master):

git+git://github.com/path/to/package-two@master#egg=package-two

Especifique a tag ( 0.1):

git+git://github.com/path/to/package-two@0.1#egg=package-two

Especifique release ( 3.7.1):

git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two

Observe que #egg=package-twonão é um comentário aqui, é declarar explicitamente o nome do pacote

Esta postagem do blog tem mais algumas discussões sobre o tópico.


54
De todas as outras respostas, não acredito que nenhuma delas tenha mostrado um arquivo de requisitos com uma mistura de reqs "normais" com um git usado para comparação. Fiquei tão impressionado com o que pareciam -eopções de linha de comando ( ). Obrigado por mostrar uma mistura de ambos, para que eu possa colocar isso em contexto!
Hendy 22/10

Apontar para o lançamento 3.7.1com git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-twonão funcionou para mim. O que funcionou para mim foi git+git://github.com/path/to/package-two@3.7.1#egg=package-two.
Jean Paul

Esta resposta foi muito útil. Uma coisa, porém. De git+git://...alguma forma, essa notação causou erros relativos ao ssh na minha caixa do Linux. Acabei trocando-os para git+https://...notação e eles funcionam perfeitamente.
RayLuo 28/03

174

requirements.txtpermite as seguintes maneiras de especificar uma dependência em um pacote em um repositório git a partir do pip 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

Para o Github, isso significa que você pode fazer (observe o omitido -e):

git+git://github.com/mozilla/elasticutils.git#egg=elasticutils

Por que a resposta extra?
Fiquei um pouco confuso com a -ebandeira nas outras respostas, então aqui está o meu esclarecimento:

O -eou --editableos meios de bandeira de que o pacote é instalada dentro <venv path>/src/SomeProjecte, assim, não no profundamente enterrado <venv path>/lib/pythonX.X/site-packages/SomeProjectque de outra forma seriam colocados em. 2

Documentação


9
Mas note que, se você omitir a -esua próxima pip freezepode não dar os resultados corretos para este pacote
Maccesch

82

Primeiro, instale com git+gitou git+https, da maneira que você souber. Exemplo de instalação kronokdo ramo do brabeionprojeto:

pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion

Segundo, use pip freeze > requirements.txtpara obter a coisa certa no seu requirements.txt. Nesse caso, você receberá

-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master

Terceiro, teste o resultado:

pip uninstall brabeion
pip install -r requirements.txt

4
O pip freeze ainda lista o pacote que eu uso como uma versão anterior fechada. e não um github direta check-out
Antoine Claval

4
Você precisa usar a opção `-e 'para' pip freeze 'para gerar um URL
Janusz Skonieczny

2
pip 9.0.1:no such option: -e
sds

Você quer dizer git+https? No texto que você diz git+gite no código #git+https
Antony Hatchkins 18/06

@AntonyHatchkins corrigido.
Osa

17

Desde o pip v1.5(lançado em 1º de janeiro de 2014: CHANGELOG , PR ), você também pode especificar um subdiretório de um repositório git para conter seu módulo. A sintaxe é assim:

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

Nota: Como autor do módulo pip, idealmente, você provavelmente desejaria publicar seu módulo em seu próprio repositório de nível superior, se puder. No entanto, esse recurso é útil para alguns repositórios preexistentes que contêm módulos python em subdiretórios. Você pode ser forçado a instalá-los dessa maneira, se eles também não forem publicados no pypi.


1

Estou descobrindo que é meio complicado conseguir que o pip3 (v9.0.1, instalado pelo gerenciador de pacotes do Ubuntu 18.04) realmente instale o que eu digo para instalar. Estou postando esta resposta para economizar tempo de qualquer um que tenha esse problema.

Colocar isso em um arquivo requirements.txt falhou:

git+git://github.com/myname/myrepo.git@my-branch#egg=eggname

Por "falha", quero dizer que, enquanto ele baixava o código do Git, acabou instalando a versão original do código, como encontrada no PyPi, em vez do código no repositório nesse ramo.

No entanto, a instalação do commit em vez do nome da filial funciona:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname

Tem certeza de que sua filial também é remota?
Alfe

Não estava apontando para uma cópia local, se é isso que você está se perguntando.
Jogue fora a conta de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.