Esta pregunta trata de complementar esta . Tengo una aplicación de Python que utiliza módulos de terceros de PyPI. Quiero empaquetar mi aplicación en un paquete de Debian, pero no sé cómo manejar las dependencias de Python que no están en los depósitos de Debian / Ubuntu (también empaquetados como paquetes de Debian)
Solución n. ° 1:
compile los módulos desde PyPI directamente en mi paquete Debian.
Solución n. ° 2:
cree paquetes de Debian para todos los módulos PyPI que necesito usando stdeb y agréguelos a los repositorios de Debian / Ubuntu.
De hecho, necesito una solución n. ° 3 porque quiero instalar las dependencias de PyPI cuando instalo mi paquete Debian, ¡preferiblemente en un virtualenv!
¿Cuál sería la solución n. ° 3 ? ¿Necesito modificar el guión de mantenimiento de DEBIAN / preinst ?
fuente
.deb
archivo o configurar un repositorio privado o un PPA en Launchpad.Respuestas:
He hablado con algunos mantenedores en el canal IRC de Debian irc: //irc.debian.org#debian-mentors , preguntando exactamente lo mismo, y el consenso general fue:
Solución # 1:
Integrar dependencias en su paquete copiando sus archivos de origen como una única base de código está muy mal visto. Derrotaría el propósito de un sistema de empaque que maneje dependencias, actualizaciones, versiones, etc.
Solución # 3:
La descarga de paquetes que no son de Debian sobre la marcha al instalar un binario (
.deb
) es un grave riesgo de seguridad, definitivamente un no-no. Ni siquiera podría inspeccionar las dependencias extrayendodeb
, porque se descargan e instalan en el momento de la instalación. Es un enfoque que omite completamente el sistema de repositorios. Ningún usuario preocupado estaría contento con un paquete que, detrás de escena (y comoroot
, recuerde), descarga software adicional no confiable de fuentes no confiables. Sí, eso requeriría jugar conDEBIAN/postinst
(opreinst
) y emitir unwget
(o, en su caso,pip install
), y ese es el enfoque adoptado por Flash, Oracle Java, Steam y otros. Pero ese es un software patentado de código cerrado, por lo que su seguridad no es nada de todos modos.Solución # 1.5:
Usted no ha mencionado, pero se podría integrar las dependencias sólo al tiempo de construcción , es decir, en el origen del paquete (el
.orig.tar.gz
,.debian.tar.gz
,.dsc
triada), mediante la descarga de PyPi al crear el paquete "binario" (el.deb
). Las instrucciones parapip install
entrarían endebian/rules
(observe las minúsculasdebian
, en oposición al paquete binario), y se ejecutarían cuando emitadebuild
odpkg-buildpackage
.Este es un término medio entre # 1 y # 3. Mitiga (¡pero no resuelve!) Algunos de los problemas del n. ° 3: al menos puede inspeccionar el producto final y
.deb
no requeriría acceso a Internet en el momento de la instalación. Todos los riesgos y las cargas se transfieren del usuario final al mantenedor del paquete. Pero tiene los mismos problemas que el n. ° 1, ya que omite la mayor parte de la infraestructura del sistema de empaque. Después de todo, el manejo de dependencias (versiones, actualizaciones, requisitos, conflictos) es la razóndpkg
por la cual /apt
fue creado en primer lugar. :)Solución # 2:
The One True Right Way ™ . Puede crear paquetes de Debian para sus dependencias, enumerarlos como requisitos en su paquete y enviar todos los
.debs
paquetes de origen.A partir de ahí, tiene una serie de opciones:
Envíe los paquetes fuente, tanto su software como sus dependencias, para incluirlos en Debian. Si se aceptan, estarán disponibles automáticamente para todos los usuarios de Debian, incluidos todos los derivados como Ubuntu.
Cargue los paquetes fuente en Launchpad , creando así un PPA que cualquier usuario de Ubuntu (y sus derivados como Linux Mint) podría agregar e instalar fácilmente
Hospede su propio repositorio de Debian en su sitio web, que los usuarios de cualquier sistema basado en Debian puedan agregar a ellos
/etc/apt/sources.list.d
y usar laapt
infraestructura para descargar, instalar y mantenerse actualizado (¡como lo anterior!)Aloje los
.deb
archivos para descarga directa e instalación. Ningunaapt
o actualizaciones automáticas involucraban pensamiento.En cuanto a cómo empaquetar sus dependencias PyPi (¡y su software python también!), Hay una serie de herramientas y referencias que facilitan el proceso:
stdeb , como mencionaste. Oldie y goodie.
Pybuild , una nueva y sorprendente herramienta de Debian que reemplaza
stdeb
.Y muchas referencias útiles:
Guía de estilo para empaquetar bibliotecas de Python
Política de Debian Python
¿Necesitas ayuda? Mira eso:
Preguntas frecuentes sobre los mentores de Debian
Equipo de embalaje de Python
fuente
Creo que solo necesita agregar el código de línea de comando relevante al script postinst en el paquete .deb. Encontrado en esta respuesta , más detalles en la guía oficial de Debian .
fuente
Hay
pypi2deb
que obtener un paquete de pypi y convertirlo en un paquete deb.fuente
No lo hacen, es como cpan en perl, si tiene repositorios, puede instalar con apt-get, si no puede instalar con pip, la diferencia debería ser que pip se instale en / usr / local.
Para instalar con pip puede hacer:
por ejemplo:
fuente