Estoy usando pip con virtualenv para empaquetar e instalar algunas bibliotecas de Python.
Me imagino que lo que estoy haciendo es un escenario bastante común. Soy el encargado de mantenimiento de varias bibliotecas para las que puedo especificar las dependencias explícitamente. Algunas de mis bibliotecas dependen de bibliotecas de terceros que tienen dependencias transitivas sobre las que no tengo control.
Lo que estoy tratando de lograr es que pip install
en una de mis bibliotecas descargue / instale todas sus dependencias ascendentes. Con lo que estoy luchando en la documentación de pip es si / cómo los archivos de requisitos pueden hacer esto por sí mismos o si en realidad son solo un complemento del uso install_requires
.
¿Usaría install_requires
en todas mis bibliotecas para especificar dependencias y rangos de versiones y luego solo usaría un archivo de requisitos para resolver un conflicto y / o congelarlos para una compilación de producción?
Supongamos que vivo en un mundo imaginario (lo sé, lo sé) y mis dependencias ascendentes son sencillas y están garantizadas que nunca entrarán en conflicto o romperán la compatibilidad con versiones anteriores. ¿Me vería obligado a usar un archivo de requisitos de pip o simplemente dejaría que pip / setuptools / distribution instale todo en función de él install_requires
?
Hay muchas preguntas similares aquí, pero no pude encontrar ninguna que fuera tan básica como cuándo usar una u otra o usarlas juntas en armonía.
fuente
Respuestas:
Mi filosofía es que
install_requires
debe indicar un mínimo de lo que necesita. Puede incluir requisitos de versión si sabe que algunas versiones no funcionarán; pero no debería tener requisitos de versión de los que no esté seguro (por ejemplo, no esté seguro de si una versión futura de una dependencia romperá su biblioteca o no).Por otro lado, los archivos de requisitos deben indicar lo que sabe que funciona y pueden incluir dependencias opcionales que recomiende. Por ejemplo, puede usar SQLAlchemy pero sugerir MySQL, y así poner MySQLdb en el archivo de requisitos).
Entonces, en resumen:
install_requires
es mantener a las personas alejadas de cosas que sabes que no funcionan, mientras que los archivos de requisitos llevan a las personas hacia cosas que sabes que funcionan. Una razón de esto es que losinstall_requires
requisitos siempre se verifican y no se pueden deshabilitar sin cambiar realmente los metadatos del paquete. Así que no es fácil probar una nueva combinación. Los archivos de requisitos solo se comprueban en el momento de la instalación.fuente
setup.py
install_requires=
profundidadesrequirements.txt
?-U
porque eso podría anular las dependencias del archivo de requisitos? ¿Cómo se actualiza?esto es lo que puse en mi setup.py:
fuente
--extra-index-url
que se requirió una crítica en los requisitos y esto estalló en mi cara. Gracias @RomainHardouinLa Guía del usuario de Python Packaging tiene una página sobre este tema, le recomiendo que la lea:
Resumen:
install_requires
¿Hay una lista de las dependencias del paquete que absolutamente deben instalarse para que funcione? No está destinado a anclar las dependencias a versiones específicas, pero se aceptan rangos, por ejemploinstall_requires=['django>=1.8']
.install_requires
es observado porpip install name-on-pypi
y otras herramientas.requirements.txt
es solo un archivo de texto, con el que puede optar por ejecutarpip install -r requirements.txt
. Se supone que tienen las versiones de todas las dependencias y subdependencies cubrió, como esto:django==1.8.1
. Puede crear uno usandopip freeze > requirements.txt
. (Algunos servicios, como Heroku, se ejecutan automáticamentepip install -r requirements.txt
para usted.)pip install name-on-pypi
No mirarequirements.txt
, solo mirainstall_requires
.fuente
Solo uso un
setup.py
yinstall_requires
porque solo hay un lugar para mirar. Es tan poderoso como tener un archivo de requisitos y no hay duplicaciones que mantener.fuente