es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo organizar un proyecto para compartir código?

Estoy escribiendo algunas aplicaciones sobre un núcleo común que construí, una especie de mi propio marco de trabajo.

Me gustaría tener estas aplicaciones enlazadas, de modo que si actualizo un archivo en el núcleo común, todas las aplicaciones también se actualizarán.

Entonces organicé el código de la siguiente manera. Creé un proyecto en GitHub donde en la rama principal están los archivos del núcleo común, y luego cada rama individual es una aplicación diferente. Así que si actualizo el núcleo común, puedo crear una solicitud de extracción (pull request) desde la rama principal a la rama de la aplicación y el núcleo común se actualizará.

Todo funciona bien de esta manera, el único problema es cuando tengo situaciones particulares.

Si tengo que editar un archivo del núcleo común dentro de una rama de la aplicación, porque por ejemplo necesito un comportamiento diferente solo para esa aplicación, me gustaría tener la oportunidad de mantener ese archivo único del núcleo común aislado y editarlo solo dentro de la rama de la aplicación, pero los demás archivos deberían actualizarse como antes.

En cambio, obviamente en esta situación ya no podría fusionar la solicitud de extracción, porque el archivo dentro de la rama de la aplicación es diferente al del núcleo común.

Mis proyectos normalmente están organizados así:

core/...
features/...
public/...
main.ts

Las carpetas core y public contienen los archivos del núcleo común y normalmente estos archivos no se cambian. Entonces ramifico el repositorio del núcleo común, agrego los módulos de características dentro de la carpeta y luego cargo todos los módulos (núcleo y características) desde el main.ts (es una aplicación web de TypeScript). En la carpeta public tengo archivos de soporte que no deberían cambiar mucho. Con esta arquitectura, todo funciona bien, hasta que necesito cambiar un archivo en la carpeta public solo para una aplicación. Si lo cambio, ya no podré fusionar la rama y recibir las actualizaciones de los archivos del núcleo común.

Antes probé el enfoque con submódulos, pero no quedé satisfecho en absoluto.

El objetivo es poder obtener actualizaciones continuas de los archivos del núcleo común, incluso si algunos de ellos se cambian localmente y deberían estar “sin seguimiento” o algo así.

¿Tienes alguna idea de cómo solucionar este problema u organizar el código de una mejor manera?

Muchas gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en TypeScript, Git, módulos y control de versiones, sugeriría utilizar los “Git Subtrees” como solución a tu problema. Los “Subtrees” son una forma de fusionar dos repositorios separados de Git en uno solo. En otras palabras, te permite incluir un repositorio Git como un subdirectorio de otro repositorio Git.

    Aquí te explico cómo puedes utilizar los “Git Subtrees” en tu caso:

    1. Crea una nueva rama en tu repositorio principal para cada aplicación.
    2. Usa los “Git Subtrees” para añadir el repositorio del núcleo común como un subdirectorio de cada rama de aplicación.
    3. Realiza los cambios específicos de cada aplicación en los archivos del núcleo común dentro de las respectivas ramas de aplicación.
    4. Si necesitas actualizar los archivos del núcleo común, realiza los cambios en la rama principal y crea una solicitud de extracción para fusionar los cambios en las ramas de aplicación.
    5. Cuando desees obtener actualizaciones del repositorio del núcleo común, puedes hacer “pull” desde la rama principal y usar los “Git Subtrees” para actualizar el subdirectorio en cada rama de aplicación.

    Al utilizar los “Git Subtrees”, puedes mantener tus archivos del núcleo común aislados y editados solo dentro de las respectivas ramas de aplicación, al mismo tiempo que puedes obtener actualizaciones continuas desde el repositorio del núcleo común. Este enfoque te permite mantener un control de versiones para cada aplicación por separado, mientras que aún mantienes una conexión con el código base del núcleo común.

Comments are closed.