Cuestiones acerca de git, github y submódulos

Hace poco terminé un pequeño proyecto personal, bastante sencillo, y decidí publicar el código en github, para por si a alguien le podía resultar útil bien para usarlo bien para aprender o bien para hacer un fork.

Con los ficheros de cosecha propia ningún problema, los añadí a mi repositorio git local y luego los sicronicé con el de github. El tema es que utilizo una librería, Mobile-Detect, y creí que sería redundante incluirlo y que incluso me podría traer problemas hacerlo. Esta librería tiene su propio repositorio en github, así que decidí quitar el fichero php de Mobile-Detect que estuve usando para las pruebas mientras desarrollaba mi proyecto e incluir su repositorio como submódulo de mi repositorio (suena un poco líoso, espero que se entienda).

Al parecer todo ha salido bien, al hacer esto último se me creó la carpeta .gitmodules y otra carpeta con el nombre del repositorio que uso como librería. Luego hice commit y push al repositorio remoto en github.

El tema está en que me quedan unas dudas acerca de lo que acabo de hacer. Es decir, aparentemente he hecho las cosas bien, pero no me queda muy claro porque debo de incluir el repositorio entero como módulo si sólo necesito un fichero php en concreto. Tampoco termino de entender eso de tener el submódulo dentro de un directorio en la raíz, si yo cuando lo programé incluí el fichero php de la librería dando por hecho que se encontraría en la raíz. ¿Debería crear un enlace simbólico en la raíz de mi repositorio que se llame igual que el php de la librería que incluí, y que apunte al que está dentro de la carpeta?

Es que no sé, cuando programas algo en por ejemplo C, si incluyes una librería esta se busca en el directorio de sistema adecuado para ello, y el problema te lo puede dar si no la tienes instalada, pero no te tienes que preocupar por las rutas. En PHP, al menos hasta donde yo sé, lo que haces es incluir un fichero sin más, indicando su ruta o bien si no la pones se da por hecho que está en el mismo directorio que el fichero que lo incluye.
Los submódulos se usan para poder tener un repositorio independiente dentro de otro repositorio, normalmente dependencias de un proyecto, en caso de que te interese recibir actualizaciones o modificar el código sin que se estorben sendos proyectos al hacer los commits. Que parece ser no es tu caso.

Esto se resume en dos opciones. La primera, no incluir la librería en el repositorio principal y explicar en las instrucciones de instalación que es necesario añadirla manualmente o a través del submódulo si lo hubiera (ahora mismo no sé decirte si clonar el repositorio clona automáticamente los submódulos). La segunda, incluirla y santas pascuas. Mientras las licencias sean compatibles, permita la redistribución y no elimines la información de copyright del autor original no hay ningún problema. Veo que en tu caso Mobile-Detect usa la licencia MIT, así que es viable.

Por último, antes que meter un enlace simbólico ahí corrige la ruta de acceso en tu código. En el archivo de configuración de PHP se puede encontrar la opción include_path para precisamente gestionar librerías como lo hace C. Si no especificas una ruta exacta, busca el archivo en el include_path antes de buscarla en el directorio actual. El problema es que dependiendo del servidor no se tiene acceso a la configuración y a los directorios que usa, con lo que se recurre a "tirar" las librerías junto al programa.
lo que se suele hacer es poner un manual de instalación, o un pequeño script que se encarga de instalar todo lo necesario. No es la panacea, pero funciona jaja
Decisiones, decisiones...

En un principio lo más sencillo sería incluir el fichero php como dijo @John_Wheel , ya que al parecer la licencia MIT lo permite:
"...to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software..." siempre que se incluya el fichero tal cual con sus comentarios, nombres de los autores y licencia.

Pero también estaría bien dejar lo del submódulo por poder aprovechar los futuros cambios que hagan en la librería Mobile-Detect, que van mejorando y añadiendo nuevos dispositivos y useragents de navegadores para aumentar la compatibilidad, y todo sin tener que preocuparme de ello, siempre que no rompan la API, claro.
En cambio, si meto en mi repo una copia del fichero que me interesa, si quiero mantenerlo actualizado me tocará irlo haciendo manualmente.

@KiAn, el manual de instalación lo tengo que hacer de todas formas porque hay que configurar ciertos ficheros antes de echar a andar la aplicación, aparte de escribir una documentación general del programa. Podría ponerlo ahí, no es mala idea.

Ahora mismo acabo de hacer un git clone de mi repositorio en github para ver lo que se descargaría en otra máquina y la carpeta del submódulo aparece vacía [facepalm], a diferencia de mi repositorio local desde el que añadí el submódulo, que cuenta con la copia de los ficheros de Mobile-Detect.

Puff, creo que al final voy a optar por quitar el submódulo y añadir directamente el fichero php que necesito en la raíz.
Demon X escribió:Pero también estaría bien dejar lo del submódulo por poder aprovechar los futuros cambios que hagan en la librería Mobile-Detect, que van mejorando y añadiendo nuevos dispositivos y useragents de navegadores para aumentar la compatibilidad, y todo sin tener que preocuparme de ello, siempre que no rompan la API, claro.


No es buena idea dejar desatendido un submodulo, lo mejor es hacer checkout a una versión en especifico e ir actualizando el submodulo regularmente teniendo cuidado de que no se rompa el repositorio principal al actualizar el submodulo a una versión incompatible.

Demon X escribió:Ahora mismo acabo de hacer un git clone de mi repositorio en github para ver lo que se descargaría en otra máquina y la carpeta del submódulo aparece vacía [facepalm], a diferencia de mi repositorio local desde el que añadí el submódulo, que cuenta con la copia de los ficheros de Mobile-Detect.


Tienes que clonarlo usando --recursive para que descargue los submodulos.
Gracias por las respuestas, @codestation .

He probado con el parámetro --recursive al hacer un git clone para simular la descarga desde cero y funciona correctamente, descargando también lo del submódulo.

Por lo que decías de que no era recomendable descuidar un submódulo, creo que ya lo entiendo. Yo antes sólo había usado svn y de momento llevo unos pocos días con git, pero en un principio entendí que los submódulos eran un enlace simbólico a un repositorio, y al parecer no es tanto eso si no un enlace simbólico a una determinada versión (o snapshot en git) de un repositorio.
Con lo cual, aunque se hagan cambios en ese repositorio, esto no se verá reflejado en el submódulo que añadimos, que mantendrá la versión de cuando se añadió, a no ser que posteriormente lo actualicemos manualmente.

Ya busqué como actualizarlo y demás, pero al final he optado por quitar el submódulo y añadir directamente el fichero php. ¿Por qué? Pues porque, y puede que me equivoque, veo los submódulos más apropiados para cuando se va a tocar código en ellos y no se van a usar como una simple librería de terceros, como es mi caso. Vería útiles los submódulos en el caso de que en una empresa estemos desarrollando un programa y a la vez una librería de la que depende el programa base, entonces es una forma de tener "conectados" ambos proyectos en los que se está trabajando, cuando uno depende del otro.
5 respuestas