Estoy creando un setup.py
archivo 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 usando en setuptools
lugar de distutils
porque este último no admite los argumentos install_requires
y dependency_links
según esta respuesta.
El archivo de configuración anterior no puede acceder a los repositorios privados con un error 404, lo cual es de esperar, ya que GitHub devuelve un 404 a solicitudes no autorizadas de un repositorio privado. Sin embargo, no puedo averiguar cómo setuptools
autenticarme.
Aquí hay algunas cosas que he probado:
Utilizar
git+ssh://
en lugar dehttps://
endependency_links
como lo haría si se instala con el repositoriopip
. 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 hacerlo. Ídemgit+https
ygit+http
.https://<username>:<password>@github.com/...
- sigue obteniendo un 404. (Este método tampoco funciona concurl
owget
desde la línea de comandos, aunquecurl -u <username> <repo_url> -O <output_file_name>
funciona).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 con setuptools. De cualquier manera, sin dados.
Actualmente, acabo de setup.py
imprimir una advertencia de que los repositorios privados deben descargarse por separado. Obviamente, esto es menos que ideal. Siento que hay algo obvio que me estoy perdiendo, pero no puedo pensar qué podría ser. :)
Pregunta duplicada sin respuestas aquí .
fuente
Respuestas:
Estaba tratando de que esto funcionara para instalar con pip, pero lo anterior no me funcionaba. De [1] entendí
PEP508
que se debería usar el estándar, de [2] obtuve un ejemplo que realmente funciona (al menos en mi caso).Tenga en cuenta; esto es con
pip 20.0.2
elPython 3.7.4
setup( name='<package>', ... install_requires=[ '<normal_dependency>', # Private repository '<dependency_name> @ git+ssh://[email protected]/<user>/<repo_name>@<branch>', # Public repository '<dependency_name> @ git+https://github.com/<user>/<repo_name>@<branch>', ], )
Después de especificar mi paquete de esta manera, la instalación funciona bien (también con
-e
configuraciones 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
fuente
#egg=...
parte parece innecesaria ahora.#egg
ybranch
son opcionales (ver editar) y también funciona paragit+https
.ssh://
y se encuentra con,Could not resolve hostname
cambie:
a/
en su URL de clonación. Tuve este error con gitlab.Reading https://pypi.org/simple/some-fake-name/
y luegoCouldn't find index page for 'some_fake_name' (maybe misspelled?)
. Al final, el último error que se muestra eserror: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://[email protected]/cglacet/quadtree.git')
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.
fuente
pip install --process-dependency-links ...
--process-dpendency-links
está en desuso, vea mi respuesta usando la especificación de URL PEP508No 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 esta forma debería funcionar para ambos.
GitHub no ofrece (actualmente, a agosto de 2016) una manera fácil de obtener el zip / tarball de repositorios privados. Por lo tanto, debe señalar setuptools para decirle a setuptools que está 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í:
0
) al final del enlace, incluso si no hay ningún paquete en PyPI. Tiene que ser un número real, no una palabra.git+
Debe comenzar con para decirle a setuptools que debe clonar el repositorio, en lugar de apuntar a un zip / tarballversion
puede ser una rama, una etiqueta o un hash de confirmación--process-dependency-links
si se instala desde pipfuente
v
prefijo en github. Así que necesitaba usar env1.1.0
lugar de1.1.0
en mi script setup.py.Encontré una solución (pirata):
#!/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 existen problemas éticos al tener una llamada al sistema en un script de configuración, pero no puedo pensar en otra forma de hacerlo.
fuente
import pip
. Ni la respuesta de @ vadimg ni esta sugerencia en pypa / pip funcionaron.python setup.py --version
.A través de la respuesta de Tom Hemmes, encontré que esto es lo único que funcionó para mí:
install_requires=[ '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']
fuente
El uso de 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', ]
fuente
eggname-version
?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 .
fuente
Este trabajo para nuestro escenario:
https://github.com/pypa/pip/issues/3610#issuecomment-356687173
fuente