¿Cómo se manejarían las dependencias externas en un proyecto de código abierto?


23

Cuando uno escribe un proyecto de código abierto y usa Google Code o GitHub, y quiere usar una biblioteca como Lua, ¿cómo debería hacerlo?

  • ¿Debería incluirse la dependencia en el repositorio?
  • ¿Debería construirse la dependencia desde el mismo script de compilación que el resto del proyecto, o desde un script de compilación separado?

Dado que la biblioteca no necesita instalación antes de la compilación.

Respuestas:


10

Recomiendo leer la documentación de Git sobre submódulos ; aborda este mismo problema, suponiendo que todas sus fuentes usan Git. Si no lo hacen, siempre puede configurar un repositorio git con el propósito de integración. El esfuerzo es trivial y la recompensa es significativa.


1
Submodules es una implementación bastante débil de la gestión de dependencias en común y en Git. Al menos git subtree es una iteración mucho mejor
Lazy Badger

44
-1 Incluya detalles del enlace en su respuesta; de lo contrario, la respuesta será inútil cuando el enlace desaparezca, como es el caso ahora. Desafortunadamente, todavía no tengo el representante para
votar a favor

@Precastic: si buscas en Google el texto del enlace, te lleva directamente a la nueva página; No estoy seguro de cuánto más informativo puede ser.
Bryan Agee

1
Lea stackoverflow.com/help/how-to-answer , específicamente la sección titulada "Proporcionar contexto para enlaces" (cita: "Siempre cite la parte más relevante de un enlace importante, en caso de que el sitio de destino no sea accesible o quede permanentemente desconectado . ")
Precastic

17

¿Debería incluirse la dependencia en el repositorio?

Creo que las dependencias siempre deben incluirse en el repositorio siempre que su inclusión no viole los términos de uso. Pocas cosas son más molestas que tener que encontrar las versiones correctas de las dependencias correctas manualmente antes de poder hacer una compilación. Claro, esto es fácil cuando tienes herramientas automatizadas para hacer esto por ti, que pueden encontrar y descargar la dependencia correcta, pero qué pasa si no estás conectado a la web en este momento o si el servidor está caído o el proyecto de la dependencia ha sido descontinuado por completo y desconectado? Incluya siempre las dependencias si es posible.

¿Debería construirse la dependencia desde el mismo script de compilación que el resto del proyecto, o desde un script de compilación separado?

A menos que haya una buena razón para compilar desde la fuente, use versiones precompiladas.

¿Y por qué no proporcionar opciones en el script de compilación? Un simple cambio para elegir si las dependencias también deben compilarse o no. Si el usuario elige compilar también las dependencias, simplemente invoque sus propios scripts de compilación desde el script de compilación de su producto. Por lo tanto, el usuario puede invocar los scripts de compilación de las dependencias manualmente o elegir crear una compilación completa de todo. Pero solo entregaría las dependencias como archivos binarios si no hay una buena razón para compilarlas desde las fuentes. Creo que en el mundo del Código Abierto, algunas licencias requieren que distribuyas las fuentes junto con tu producto, pero eso no significa que no puedas tenerlas precompiladas.

En resumen: si es posible, proporcione un paquete de trabajo completo e independiente. Esto proporcionará la mayor comodidad a sus usuarios.


1
@tdammers: Lo sé, si está instalando software en un sistema Linux, el administrador de paquetes hace todo el trabajo por usted. Pero eso requiere una conexión a Internet y el paquete debe estar en un cierto formato y expliqué explícitamente que las herramientas de automatización pueden ayudar con esto. No puede utilizar un sistema de este tipo para herramientas de código abierto .NET, por ejemplo. Si echa un vistazo a las herramientas de sourceforge como NHibernate o Castle Windsor, verá que todas las dependencias están incluidas como binarios. Y esa es la única cosa razonable que hacer.
Falcon

1
@tdammers: De manera casual, hoy tengo que instalar el SDK de OpenOffice en una máquina Linux. Como el SDK no se puede instalar a través del administrador de paquetes, tomé el RPM del sitio web. ¿Cuál crees que es el primer mensaje que recibo cuando intento ejecutar "rpm --install"? error: dependencias fallidas: ooobasis3.3-core01 es necesario para ooobasis3.3-sdk-3.3.0-9567.x86_64 - ¡OH ALEGRÍA!
Falcon

2
@tdammers: tienes razón, pero en el caso me encantaría tener esta redundancia si solo la configuración e instalación fuera fácil. Y cuando quiera ver un infierno de dependencia, eche un vistazo al directorio / usr / lib. Hay de todo: redundancia, subversiones y ni siquiera sabes qué programa usa qué libs. ¡Claro, deja que el administrador de paquetes lo maneje! Pero qué pasa si el administrador de paquetes no puede manejarlo como en el caso de la oficina abierta que mencioné. Eso básicamente significa que estás jodido y tendrás dificultades para instalar algo.
Falcon

2
@tdammers: Y cuanto más pienso en esto y en mis experiencias: ni siquiera puedo contar las veces que tuve que crear enlaces simbólicos en este directorio solo porque las dependencias fallaron o algunos programas se negaron a ejecutarse, incluso cuando se instalaron a través de un administrador de paquetes. Tal vez la situación ha mejorado ahora, pero a menudo sigue siendo un trabajo duro lograr que algunas cosas funcionen. Problemas que podrían haberse evitado si hubieran enviado la dependencia con la aplicación. Con mucho gusto pagaré los pocos MB de espacio adicional solo para evitar esa molestia.
Falcon

2
@tdammers: los innumerables tutoriales en la web sobre cómo instalar un programa específico en un sistema Linux específico son testigos de este problema.
Falcon

3

Esto puede o no aplicarse a su caso de uso, pero lo que hacemos en el trabajo es incluir una carpeta "Referencias" en cada rama. Colocamos archivos DLL de terceros aquí. Esto causa una gran cantidad de duplicación de archivos binarios relativamente inmutables en el control de código fuente, pero el almacenamiento es económico y en cualquier momento cada rama y etiqueta tiene exactamente las dependencias (¡y la versión!) Que espera.

Precompilamos las dependencias nosotros mismos y movemos los binarios compilados a esa carpeta. Nuestra propia biblioteca compartida interna también se trata de esta manera. De esa manera, la misma técnica funciona para bibliotecas propietarias precompiladas, bibliotecas de código abierto y bibliotecas internas.


En cuanto a responder realmente a su pregunta ahora que la he vuelto a leer, haga lo mismo y solo mencione que su proyecto utiliza una versión 1.3.5 precompilada de Lua.


1

¿Debería incluirse la dependencia en el repositorio?

Se puede hacer referencia en el repositorio (por cualquier método utilizable para SCM), si esta dependencia es parte integral del producto (dependencia de origen), no dependencia binaria, que se puede resolver por separado

¿Debería construirse la dependencia desde el mismo script de compilación que el resto del proyecto, o desde un script de compilación separado?

No importa en absoluto. Puede preferir cualquier método, de acuerdo con sus requisitos (velocidad / transparencia / capacidad de administración / etc.)


0

Al ser una tienda de Eclipse, acabamos de comenzar a usar Buckminster para administrar nuestro proceso de construcción / montaje / implementación.

Nuestra primera etapa ha sido sacar todas nuestras bibliotecas dependientes existentes y dejar que Buckminster se encargue de materializar las correctas. Esto permite una implementación mucho más rápida y pequeña.

El siguiente paso será mover nuestro svnrepositorio monolítico a una serie de gitrepositorios modulares .

No sé qué tan bien se integraría gitBuckminster con submódulos (o subrepos mercuriales para el caso), pero es bueno que Buckminster sea agnóstico con respecto al VCS utilizado para cualquier componente dado.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.