En vista de ello, parece que requirements.txt
y setup.py
son duplicados tontas, pero es importante entender que mientras que la forma es similar, la función prevista es muy diferente.
El objetivo del autor de un paquete, al especificar dependencias, es decir "donde sea que instale este paquete, estos son los otros paquetes que necesita para que este paquete funcione".
Por el contrario, el autor de la implementación (que puede ser la misma persona en un momento diferente) tiene un trabajo diferente, ya que dice "aquí está la lista de paquetes que hemos reunido y probado y que ahora necesito instalar".
El autor del paquete escribe para una amplia variedad de escenarios, porque están poniendo su trabajo ahí fuera para que lo usen de formas que quizás no conozcan, y no tienen forma de saber qué paquetes se instalarán junto con su paquete. Para ser un buen vecino y evitar conflictos de versiones de dependencia con otros paquetes, necesitan especificar una gama tan amplia de versiones de dependencia como pueda funcionar. Esto es lo que install_requires
en setup.py
sí.
El autor de la implementación escribe para un objetivo muy diferente y muy específico: una única instancia de una aplicación o servicio instalado, instalado en una computadora en particular. Para controlar con precisión una implementación y asegurarse de que los paquetes correctos se prueben e implementen, el autor de la implementación debe especificar la versión exacta y la ubicación de origen de cada paquete que se instalará, incluidas las dependencias y las dependencias de la dependencia. Con esta especificación, una implementación se puede aplicar repetidamente a varias máquinas, o probarse en una máquina de prueba, y el autor de la implementación puede estar seguro de que los mismos paquetes se implementan cada vez. Esto es lo que requirements.txt
hace.
Entonces puede ver que, si bien ambos parecen una gran lista de paquetes y versiones, estas dos cosas tienen trabajos muy diferentes. ¡Y definitivamente es fácil mezclar esto y equivocarse! Pero la forma correcta de pensar en esto es que requirements.txt
es una "respuesta" a la "pregunta" planteada por los requisitos en todos los diversos setup.py
archivos de paquete. En lugar de escribirlo a mano, a menudo se genera diciéndole a pip que mire todos los setup.py
archivos en un conjunto de paquetes deseados, encuentre un conjunto de paquetes que considere que cumple con todos los requisitos y luego, una vez instalados, "congele "esa lista de paquetes en un archivo de texto (de aquí pip freeze
proviene el nombre).
Entonces la comida para llevar:
setup.py
debería declarar las versiones de dependencia más flojas posibles que aún sean viables. Su trabajo es decir con qué puede funcionar un paquete en particular.
requirements.txt
es un manifiesto de implementación que define un trabajo de instalación completo y no debe considerarse vinculado a ningún paquete. Su trabajo es declarar una lista exhaustiva de todos los paquetes necesarios para que una implementación funcione.
- Debido a que estas dos cosas tienen un contenido y razones tan diferentes para existir, no es factible simplemente copiar una en la otra.
Referencias
install_requires
se usa para declarar dependencias en los paquetes que son necesarios para que el paquete funcione y los usa el desarrollador del paquete, mientras querequirements.txt
se usa para automatizar la instalación de entornos, lo que permite instalar software adicional y anclar la versión y los administradores de sistemas los usan paquete. Su rol y público objetivo difieren significativamente, por lo que tratar de combinarlos como lo desea OP es un verdadero error de diseño en mi humilde opinión.