tutoriales subir proyecto facilito codigofacilito codigo python github setuptools

python - subir - tutoriales codigofacilito



Herramientas de configuración de Python: ¿cómo puedo incluir un repositorio privado en install_requires? (6)

Estoy creando un archivo setup.py para un proyecto que depende de repositorios 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 por this respuesta.

El archivo de configuración anterior no puede acceder a los repos privados con un error 404, que es de esperar, ya que GitHub devuelve un 404 a las solicitudes no autorizadas de un repositorio privado. Sin embargo, no puedo entender cómo hacer que las setuptools autentiquen.

Aquí hay algunas cosas que he intentado:

  1. Use git+ssh:// lugar de https:// en dependency_links como lo haría si instalo el repositorio 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://<username>:<password>@github.com/... - aún así obtener un 404. (Este método tampoco funciona con curl o wget desde la línea de comando, aunque curl -u <username> <repo_url> -O <output_file_name> funciona.)

  3. Actualizando 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 repos privados deben ser descargados por separado. Esto es obviamente menos que ideal. Siento que hay algo obvio que me estoy perdiendo, pero no puedo pensar qué podría ser. :)

Pregunta duplicada sin respuestas here .


Editar: Esto parece funcionar solo con repositorios 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 sintaxis anterior parece funcionar para mí con setuptools 1.0. Por el momento, al menos la sintaxis de agregar "# egg = project_name-version" a las dependencias de VCS está documentada en el enlace que proporcionó para distribuir la documentación .


Encontré 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.


Este trabajo para nuestro escenario:

  1. el paquete está en github en un repositorio privado
  2. queremos instalarlo en site-packages (no en ./src con -e)
  3. pudiendo usar pip install -r requirements.txt
  4. poder 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


Esto es lo que funcionó para mí:

install_requires=[ ''private_package_name==1.1'', ], dependency_links=[ ''git+ssh://[email protected]/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.


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 repositorios privados. Así que debes apuntar a las herramientas de configuración para decir a las herramientas de configuración que estás apuntando a un repositorio de 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 repositorios privados, necesita autenticarse con GitHub; La forma más sencilla que encontré es crear un token oauth, colocarlo en su entorno y luego incluirlo con el URL
  • Debe incluir algún número de versión (aquí es 0 ) al final del enlace, incluso si no hay ningún paquete en PyPI. Esto tiene que ser un número real, no una palabra.
  • Debes prefacio con git+ para decirle a setuptools que debe clonar el repositorio, en lugar de apuntar a un zip / tarball
  • version puede ser una rama, una etiqueta o un hash de confirmación
  • --process-dependency-links suministrar --process-dependency-links si se instala desde pip

Usar la URL de archivo de github funciona para mí, para repositorios públicos. P.ej

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