Estoy intentando escribir setup.py
para mi paquete. Mi paquete necesita especificar una dependencia en otro repositorio de git.
Esto es lo que tengo hasta ahora:
from setuptools import setup, find_packages
setup(
name='abc',
packages=find_packages(),
url='https://github.abc.com/abc/myabc',
description='This is a description for abc',
long_description=open('README.md').read(),
install_requires=[
"requests==2.7.0",
"SomePrivateLib>=0.1.0",
],
dependency_links = [
"git+git://github.abc.com/abc/SomePrivateLib.git#egg=SomePrivateLib",
],
include_package_data=True,
)
Cuando corro:
pip install -e https://github.abc.com/abc/myabc.git#egg=analyse
yo obtengo
No se pudo encontrar una versión que satisfaga el requisito SomePrivateLib> = 0.1.0 (de analizar) (de versiones :) No se encontró una distribución coincidente para SomePrivateLib> = 0.1.0 (de analizar)
Qué estoy haciendo mal ?
Respuestas:
Puede encontrar la forma correcta de hacerlo aquí .
dependency_links=['http://github.com/user/repo/tarball/master#egg=package-1.0']
La clave no es dar un enlace a un repositorio de git, sino un enlace a un tarball. Github crea un tarball de la rama maestra para usted si agrega
/tarball/master
como se muestra arriba.fuente
/tarball/master
método no funciona para gitlabDespués de investigar el problema de pip 3939 vinculado por @muon en los comentarios anteriores y luego la especificación PEP-508 , encontré éxito al instalar mi dependencia de repositorio privado mediante el
setup.py
uso de este patrón de especificación eninstall_requires
(no másdependency_links
):install_requires = [ 'some-pkg @ git+ssh://[email protected]/someorgname/[email protected]#egg=some-pkg', ]
El
@v1.1
indica la etiqueta de versión creado en github y podría sustituirse con una rama, cometer, o diferente tipo de etiqueta.fuente
git+https://github.com
si no desea utilizar SSH.La siguiente respuesta está obsoleta para Pip 19+
Desafortunadamente, la otra respuesta no funciona con repositorios privados, que es uno de los casos de uso más comunes para esto. Finalmente lo hice funcionar con un
setup.py
archivo que se ve así:from setuptools import setup, find_packages setup( name = 'MyProject', version = '0.1.0', url = '', description = '', packages = find_packages(), install_requires = [ # Github Private Repository - needs entry in `dependency_links` 'ExampleRepo' ], dependency_links=[ # Make sure to include the `#egg` portion so the `install_requires` recognizes the package 'git+ssh://[email protected]/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1' ] )
Las versiones más nuevas de pip hacen que esto sea aún más fácil al eliminar la necesidad de usar "dependency_links" -
from setuptools import setup, find_packages setup( name = 'MyProject', version = '0.1.0', url = '', description = '', packages = find_packages(), install_requires = [ # Github Private Repository 'ExampleRepo @ git+ssh://[email protected]/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1' ] )
fuente
-0.1
representa su enfoque? ¿Toma el número de versión de una versión de git o de lasetup.py
descripción?dependency_links
(que está en desuso )Una respuesta más general, para obtener la información del archivo requeriments.txt, hago:
from setuptools import setup, find_packages from os import path loc = path.abspath(path.dirname(__file__)) with open(loc + '/requirements.txt') as f: requirements = f.read().splitlines() required = [] dependency_links = [] # do not add to required lines pointing to git repositories EGG_MARK = '#egg=' for line in requirements: if line.startswith('-e git:') or line.startswith('-e git+') or \ line.startswith('git:') or line.startswith('git+'): if EGG_MARK in line: package_name = line[line.find(EGG_MARK) + len(EGG_MARK):] required.append(package_name) dependency_links.append(line) else: print('Dependency to a git repository should have the format:') print('git+ssh://[email protected]/xxxxx/xxxxxx#egg=package_name') else: required.append(line) setup( name='myproject', # Required version='0.0.1', # Required description='Description here....', # Required packages=find_packages(), # Required install_requires=required, dependency_links=dependency_links, )
fuente
En realidad, si desea que sus paquetes se puedan instalar de forma recursiva (YourCurrentPackage incluye su SomePrivateLib), por ejemplo, cuando desee incluir YourCurrentPackage en otro (como OuterPackage -> YourCurrentPackage -> SomePrivateLib), necesitará ambos:
install_requires=[ ..., "SomePrivateLib @ git+ssh://github.abc.com/abc/[email protected]#egg=SomePrivateLib" ], dependency_links = [ "git+ssh://github.abc.com/abc/[email protected]#egg=SomePrivateLib" ]
Y asegúrese de tener una etiqueta creada con su número de versión.
Además, si su proyecto git es privado y desea instalarlo dentro del contenedor, por ejemplo, Docker o GitLab runner, necesitará acceso autorizado a su repositorio. Considere usar git + https con tokens de acceso (como en GitLab: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html ):
import os from setuptools import setup TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN') setup( .... install_requires=[ ..., f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/[email protected]#egg=SomePrivateLib" ], dependency_links = [ f"git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/[email protected]#egg=SomePrivateLib" ] )
fuente
Tuve éxito con estas 3 opciones en gitlab. Estoy usando la versión 11 de gitlab.
opción 1: no se especifica ningún token. shell le pedirá nombre de usuario / contraseña.
from setuptools import setup TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN') setup( install_requires=[ "SomePrivateLib @ git+https://gitlab.server.com/abc/[email protected]#egg=SomePrivateLib" ] )
opción 2: token de acceso de usuario especificado. token generado yendo a gitlab> cuenta arriba a la derecha> configuración> tokens de acceso. crear token con derechos read_repository.
ejemplo:
import os from setuptools import setup TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN') setup( install_requires=[ f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/[email protected]#egg=SomePrivateLib" ] )
opción 3: token de nivel de repositorio especificado. token generado yendo al repositorio> configuración> repositorio> implementar tokens. desde aquí cree un token con derechos read_repository.
ejemplo:
import os from setuptools import setup TOKEN_USER = os.getenv('EXPORTED_TOKEN_USER') TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN') setup( install_requires=[ f"SomePrivateLib @ git+https://{TOKEN_USER}:{TOKEN_VALUE}@gitlab.server.com/abc/[email protected]#egg=SomePrivateLib" ] )
En los 3, pude hacer simplemente: "SomePrivateLib @ git + https: //gitlab.server.com/abc/SomePrivateLib.git" sin la marca #egg al final.
fuente