Pregunta

Resumen

Hace poco tuve una conversación con el creador de un marco que una de mis aplicaciones depende. Durante esa conversación se refirió como una especie de un lado que haría mi vida más simple si sólo liado su marco con mi solicitud y se entrega al usuario final una versión que yo sabía que era coherente con mi código. Intuitivamente siempre he tratado de evitar hacer esto y, de hecho, me he tomado la molestia de segmento de mi propio código de manera que partes de éste podrían ser redistribuidos sin tener todo el proyecto (incluso cuando había muy poco oportunidad alguien pueda volver a utilizar cualquiera de eso). Sin embargo, después de meditarlo durante algún tiempo que no he sido capaz de llegar a una particularmente buena razón ¿Por qué que hago esto. De hecho, ahora que he pensado en ello, estoy viendo un caso bastante convincente para agrupar todos mis dependencias más pequeñas. He llegado con una lista de pros y contras y yo estoy esperando que alguien puede señalar cualquier cosa que me falta.

Pros

  • Consistencia de versiones significa más fácil pruebas y resolución de problemas.
  • La aplicación puede llegar a una más amplia audiencia ya que no parece que haya un menor número de componentes que desea instalar.
  • Los pequeños ajustes a la dependencia puede más fácilmente ser hecho aguas abajo y proporcionado con la aplicación, en lugar de esperar a que se filtrarse en la base de código de aguas arriba.

Contras

  • proceso de envasado más complejas para incluir dependencias.
  • El usuario puede terminar con varias copias de una dependencia de su máquina.
  • Por la respuesta de Bortzmeyer, existen preocupaciones potenciales de seguridad con no ser capaz de actualizar los componentes individuales.

Notas

A modo de referencia, mi aplicación está escrita en Python y las dependencias que estoy haciendo referencia son "luz", y me refiero a pequeños y no están en uso muy común. (Así que no existen en todas las máquinas o incluso en todos los repositorios.) Y cuando digo "paquete con" mi solicitud, me refiero a distribuir bajo mi propio árbol de código fuente, no instale con un guión que reside dentro de mi paquete, para que no hubiera ninguna posibilidad de versiones contradictorias. También estoy desarrollando únicamente en Linux para que no haya problemas de instalación de Windows que preocuparse.

Todo lo que se dice, estoy interesado en escuchar cualquier pensamiento sobre la cuestión más amplia (independiente del idioma) de las dependencias de embalaje también. ¿Hay algo que me falta o se trata de una decisión fácil que yo soy un poco más de pensamiento?

Addendum 1

Vale la pena mencionar que yo también soy muy sensible a las necesidades de los envasadores de aguas abajo. Me gustaría que sea lo más sencillo posible para envolver la aplicación en un DEB o RPM específicos de la distribución.

¿Fue útil?

Solución

Estoy a favor de la agrupación de dependencias, si que no es factible el uso de un sistema para la resolución automática de dependencias (es decir setuptools), y si que puede hacerlo sin introducir conflictos de versión. Usted todavía tiene que considerar su aplicación y su público; desarrolladores o aficionados serios son más propensos a querer trabajar con una versión específica (última) de la dependencia. La agrupación en la materia puede ser molesto para ellos, ya que no es lo que esperan.

Pero, sobre todo para los usuarios finales de una aplicación, tengo serias dudas de la mayoría de las personas disfrutan de tener que buscar dependencias. Por lo que tenga copias duplicadas va, yo preferiría pasar un extra de 10 milisegundos descarga de algunos kilobytes adicionales, o gastar lo fracción de un centavo en la meg extra de espacio en disco, que pasar 10 minutos más buscando a través de sitios web (que puede estar abajo ), la descarga, la instalación (que puede fallar si las versiones son incompatibles), etc.

No me importa cuántas copias de una biblioteca que tengo en mi disco, siempre y cuando no obtienen en forma de los demás. El espacio en disco es muy, muy barato.

Otros consejos

¿No puedes confiar en una determinada versión de esas dependencias? P.ej. en Python con setuptools puede especificar qué versión exacta que necesita o incluso dar algunas condiciones como <= > etc. por supuesto, esto sólo se aplica a Python y en el gestor de paquetes specifc pero yo personalmente siempre en primer lugar tratar de no agrupar todo. Con el envío como un huevo Python también tendrá todas las dependencias instalan automáticamente.

Se podría, por supuesto, también el uso de una estrategia de doble vía en la prestación de su propio paquete con sólo vincula a las dependencias y sin embargo proporciona una configuración completa de alguna instalador como la moda. Pero incluso entonces (en el caso de Python) que sugeriría que basta con empaquetar los huevos con ella.

Para algunos introducción en los huevos ver este post mío .

Por supuesto, esto es muy específico de Python pero supongo que otra lengua podría tener herramientas de empaquetado similares.

Si usted está produciendo software para un usuario final, el objetivo es dejar que el cliente utilice su software. Cualquier cosa que se interpone en el camino es contraproducente. Si tienen que descargar las dependencias a sí mismos, hay una posibilidad de que van a decidir evitar su software en su lugar. No se puede controlar si las bibliotecas serán compatibles hacia atrás, y no desea que el software deje de funcionar porque el usuario actualiza su sistema. Del mismo modo, usted no quiere un cliente para instalar una versión antigua de su software con las bibliotecas antiguas y tienen el resto de la ruptura del sistema.

Esto significa agrupación generalmente es el camino a seguir. Si usted puede asegurarse de que su software se instalará sin problemas, sin agrupación dependencias, y eso es menos trabajo, entonces eso puede ser una mejor opción. Se trata de lo que satisface a sus clientes.

Para Linux, ni siquiera pensar en la agrupación. Usted no es más inteligente que el gestor de paquetes o los envasadores, y cada distribución tiene acercarse a su manera - que no será feliz si intenta ir a tu manera. A lo sumo, no se molestarán con el empaquetado de su aplicación, que no es muy grande.

Tenga en cuenta que en Linux, dependencias se extraen automáticamente por usted. No es una cuestión de hacer que el usuario conseguirlos. Ya está hecho para ti.

Para las ventanas, se sienten libres para empaquetar, usted está en su propia allí.

Un punto importante parece haber sido olvidado en los contras de la agrupación de las bibliotecas / marcos / etc con la aplicación:. Actualizaciones de seguridad

La mayoría de los marcos web están llenos de agujeros de seguridad y parches requieren frecuentes. Cualquier biblioteca, de todos modos, puede tener que ser actualizado un día u otro por un fallo de seguridad.

Si no junte, los administradores de sistemas se acaba de actualizar una copia de la biblioteca y reiniciar las aplicaciones dependientes.

Si paquete, los administradores de sistemas, probablemente ni siquiera saber que tienen que mejorar algo.

Por lo tanto, el problema con la agrupación no es el espacio en el disco, es el riesgo de dejar copias antiguas y peligrosas alrededor.

Sólo mi experiencia, tomarlo con un grano de sal.

Mi preferencia por un par de bibliotecas de código abierto que es autor por la independencia de librerías adicionales tanto como sea posible. La razón de ser, no sólo soy yo en el gancho para la distribución de bibliotecas adicionales junto con la mía, también estoy obligado a actualizar mi solicitud de compatibilidad como aquellas otras bibliotecas se actualizan también.

A partir de las bibliotecas que he usado de otros que llevan las dependencias de bibliotecas "comunes", siempre termino con requiriendo múltiples versiones de la biblioteca común en mi sistema. La velocidad de actualización relativa de las bibliotecas de nicho que estoy usando simplemente no es tan rápido, mientras que las bibliotecas comunes se actualizan con mucha más frecuencia. Versionado infierno.

Pero eso se habla genéricamente. Si puedo ayudar a mi proyecto y ahora los usuarios mediante la incorporación de una dependencia, siempre estoy mirando a los efectos aguas abajo y posteriormente actualizada de esa decisión. Si soy capaz de ello, puedo incluir la dependencia con confianza.

Como siempre, su experiencia puede variar.

Siempre incluyo todas las dependencias para mis aplicaciones web. No sólo esta instalación más simple maquillaje, la aplicación se mantiene estable y funcione de la manera que usted espera que incluso cuando se actualizan otros componentes en el sistema.

Cuidado con la reproducción de demonios clásico de Windows DLL. Por todos los medios reducir al mínimo el número de dependencias: idealmente, sólo depende de su idioma y su marco, nada más, si es posible

.

Después de todo, la preservación de espacio en disco duro no es el objetivo más, para que los usuarios no tienen por qué se preocupan por tener múltiples copias. También, a menos que tenga un número minúsculo de los usuarios, asegúrese de tomar la responsabilidad de los envases en sí mismo en lugar de que tengan que efectuar todas las dependencias!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top