Herramientas de configuración de Python: ¿Cómo puedo listar un repository privado en install_requires?

Estoy creando un archivo setup.py para un proyecto que depende de los repositorys privados de GitHub. Las partes relevantes del archivo se ven así:

 from setuptools import setup setup(name='my_project', ..., install_requires=[ 'public_package', 'other_public_package', 'private_repo_1', 'private_repo_2', ], dependency_links=[ 'https://github.com/my_account/private_repo_1/master/tarball/', 'https://github.com/my_account/private_repo_2/master/tarball/', ], ..., ) 

Estoy utilizando setuptools lugar de distutils porque este último no admite los argumentos install_requires y dependency_links para esta respuesta.

El archivo de configuración anterior no puede acceder a los repositorys privados con un error 404, que es de esperar ya que GitHub devuelve un 404 a solicitudes no autorizadas para un repository privado. Sin embargo, no puedo averiguar cómo hacer que setuptools autentique.

Aquí hay algunas cosas que he probado:

  1. Use git+ssh:// lugar de https:// en dependency_links como lo haría si instalara el repository con pip . Esto falla porque setuptools no reconoce este protocolo (“tipo de URL desconocido: git + ssh”), aunque la documentación de distribución dice que debería. Ditto git+https y git+http .

  2. https://:@github.com/... – sigue obteniendo un 404. (Este método tampoco funciona con curl o wget desde la línea de comandos, aunque curl -u -O no funciona.)

  3. Actualización de setuptools (0.9.7) y virtualenv (1.10) a las últimas versiones. También intenté instalar Distribuir, aunque esta descripción general dice que se fusionó nuevamente en setuptools. De cualquier manera, no hay dados.

Actualmente solo tengo setup.py imprimir una advertencia de que los setup.py privados deben descargarse por separado. Esto obviamente es menos que ideal. Siento que hay algo obvio que me estoy perdiendo, pero no puedo pensar en lo que podría ser. 🙂

Pregunta duplicada sin respuestas aquí .

Esto es lo que funcionó para mí:

  install_requires=[ 'private_package_name==1.1', ], dependency_links=[ 'git+ssh://git@github.com/username/private_repo.git#egg=private_package_name-1.1', ] 

Tenga en cuenta que debe tener el número de versión en el nombre del huevo, de lo contrario dirá que no puede encontrar el paquete.

Estaba intentando que esto funcionara para la instalación con pip, pero lo anterior no funcionaba para mí. De [1] entendí que debía usarse el estándar PEP508, de [2] recuperé un ejemplo que realmente funciona (al menos para mi caso).

Tenga en cuenta; esto es con pip 18.1 en Python3.6

 setup( name='', ... install_requires=[ '', ' @ git+ssh://git@github.com//@', ], ) 

Después de especificar mi paquete de esta manera, la instalación funciona bien (también con la configuración -e y sin la necesidad de especificar --process-dependency-links ).

Referencias [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566

No pude encontrar ninguna buena documentación sobre esto, pero encontré la solución principalmente a través de prueba y error. Además, la instalación desde pip & setuptools tiene algunas diferencias sutiles; Pero de esta manera debería funcionar para ambos.

GitHub no (actualmente, a partir de agosto de 2016) ofrece una forma fácil de obtener el zip / tarball de los repositorys privados. Así que debes apuntar a setuptools para decirle a setuptools que estás apuntando a un repository git:

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

Un par de notas aquí:

  • Para repositorys privados, necesita autenticarse con GitHub; La forma más sencilla que encontré es crear un touth outh, soltarlo en su entorno y luego incluirlo con la URL.
  • Debe incluir algún número de versión (aquí hay 0 ) al final del enlace, incluso si no hay un paquete en PyPI. Este tiene que ser un número real, no una palabra.
  • Necesitas prefacio con git+ para decirle a setuptools que es clonar el repository, en lugar de apuntar a un zip / tarball
  • version puede ser una twig, una etiqueta o un hash de confirmación.
  • --process-dependency-links proporcionar --process-dependency-links si se instala desde pip

He encontrado una solución (hacky):

 #!/usr/bin/env python from setuptools import setup import os os.system('pip install git+https://github-private.corp.com/user/repo.git@master') setup( name='original-name' , ... , install_requires=['repo'] ) 

Entiendo que hay problemas éticos con una llamada al sistema en un script de configuración, pero no puedo pensar en otra forma de hacerlo.

El uso de la URL de archivo de github funciona para mí, para repositorys públicos. P.ej

 dependency_links = [ 'https://github.com/username/reponame/archive/master.zip#egg=eggname-version', ] 

Editar: Esto parece funcionar solo con los repositorys públicos de github, ver comentarios.

 dependency_links=[ 'https://github.com/my_account/private_repo_1/tarball/master#egg=private_repo_1', 'https://github.com/my_account/private_repo_2/tarball/master#egg=private_repo_2', ], 

La syntax de arriba parece funcionar para mí con setuptools 1.0. Por el momento, al menos la syntax de agregar “# egg = project_name-version” a las dependencias de VCS está documentada en el enlace que proporcionó para distribuir la documentación .

Este trabajo para nuestro escenario:

  1. el paquete está en github en un repository privado
  2. queremos instalarlo en los paquetes de sitio (no en ./src con -e)
  3. pudiendo usar pip install -r Requirements.txt
  4. pudiendo usar pip install -e reposdir (o desde github), donde las dependencias solo se especifican en Requirements.txt

https://github.com/pypa/pip/issues/3610#issuecomment-356687173