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:
Use
git+ssh://
lugar dehttps://
endependency_links
como lo haría si instalo el repositorio conpip
. 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. Dittogit+https
ygit+http
.https://<username>:<password>@github.com/...
- aún así obtener un 404. (Este método tampoco funciona concurl
owget
desde la línea de comando, aunquecurl -u <username> <repo_url> -O <output_file_name>
funciona.)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:
- el paquete está en github en un repositorio privado
- queremos instalarlo en site-packages (no en ./src con -e)
- pudiendo usar pip install -r requirements.txt
- 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'',
]