2010-12-30 35 views
7

Antes que nada quiero decirle qué tipo de sistema tengo y sobre lo que quiero construir.Administración de código en diferentes proyectos con diferentes repositorios svn

1- A Solution (has) 
    a- Shared Class Library project (which is for lots of different solutions) 
    b- Another Class Library project (which is only for this solution) 
    c- Web Application project (which main part of this solution) 
    d- Shared Web Service project (which also serves for different solutions) 

2- B Solution (has) 
    a- Shared Class Library project (which is for lots of different solutions) 
    c- Windows Form Application project (which is main part of this solution) 
    d- Web Service project (which also serves for different solutions) 

y otros proyectos de esa manera ....

estoy usando xp-dev.com como nuestro servidor repositorio SVN. Y abrí diferentes proyectos para estos elementos (Biblioteca de clases compartida, proyecto de servicio web, proyecto de aplicación Windows Form, proyecto de aplicación web, proyecto de otra biblioteca de clases).

Quiero hacer la versión de todos estos proyectos, por supuesto.

Mi primera pregunta es, ¿debo poner cada proyecto (una solución) en un repositorio svn para obtener su número de revisión más adelante?

¿O debería poner cada uno de ellos en diferentes repositorios svn y mantener (escribir) su número de versión correcto que se utiliza para publicar/implementar cada solución? alt text

Si utilizo un SVN para cada proyecto (clase compartida Lib, de aplicación web, servicio web compartido ....) ¿cómo puedo relacionar la dirección de SVN derecho y la versión en VS.2010 dentro de la solución real? alt text

Entonces, ¿cómo gestionas tus repositorios y proyectos?

Respuesta

3

Otro enfoque que puede tomar para esto es usar la propiedad Subversion externals para poder administrar su código, ya sea en repositorios separados o en un único repositorio. La ventaja es que simplemente puede actualizar las URL en cuestión cuando necesite una nueva versión del código compartido en su solución.

Nota: No recuerdo a Jack sobre la solución de Visual Studio y la organización del proyecto; Han pasado al menos 5 años desde que hice cualquier desarrollo de Windows. Dicho esto, esta discusión es aplicable independientemente del diseño del archivo/directorio. Voy a hacer uno y por favor solo ajústelo a su situación real.

Supongamos que tiene un gran repositorio que tiene todos sus proyectos relacionados en él. Si crees que no es necesariamente escalable, te sugiero echar un vistazo al Apache projects SVN setup; ellos tienen todos los proyectos en un repositorio. Tomando una página de la ASF, vamos a empezar por la estructura del repositorio de la siguiente manera:

/SolutionA/trunk 
/SolutionA/tags 
/SolutionA/branches 

/SolutionB/trunk 
/SolutionB/tags 
/SolutionB/branches 

/SharedClassLib/trunk 
/SharedClassLib/tags 
/SharedClassLib/branches 

/SharedWebService/trunk 
/SharedWebService/tags 
/SharedWebService/branches 

Hasta el momento esto es sólo un diseño estándar SVN; cada entidad más o menos independiente tiene su propia área del repositorio para jugar. Ahora, supongamos que ha estado desarrollando lejos en el SharedClassLib y está hasta la versión 2.0.0, y en SharedWebService está en la versión 1.2.5. La estructura de directorios se verá algo como:

/SharedClassLib/tags/1.0.0 
/SharedClassLib/tags/1.5.0 
/SharedClassLib/tags/2.0.0 

/SharedWebService/tags/1.0.0 
/SharedWebService/tags/1.2.0 
/SharedWebService/tags/1.2.5 

Las otras etiquetas son sólo para ilustración del hecho de que su desarrollo ha estado marchando en el tiempo y que ha tenido varias versiones.

Ahora, de vuelta en SolutionA, tiene un proyecto LocalClassLibrary y un proyecto LocalWebApp.Estos proyectos son estrictamente parte de esta solución y no se comparten fuera de esta solución. Tomar una puñalada en una estructura de directorios, el tronco podría ser algo como:

Por lo tanto, nuestro problema es, ¿cómo podemos llegar al SharedClassLib y SharedWebService en nuestra SolutionA? Mediante el uso de elementos externos de Subversion. Primero lea la página web externals, luego regrese aquí.

Para hacerte la vida un poco más fácil, te sugiero crear un archivo svn.externals en tu directorio de soluciones para establecer la propiedad svn: externals si estás haciendo esto desde la línea de comandos. Si está utilizando alguna otra herramienta, solo tenga en cuenta que en este caso, necesitará agregar varias líneas. El archivo se verá así:

SharedClassLib   http://your.svn.server/SharedClassLib/tags/2.0.0 
SharedWebService  http://your.svn.server/SharedWebService/tags/1.2.5 

Editar 1: En este punto, se puede ver que las direcciones URL que usted se refiere son completamente calificado. Lo que significa que pueden ser repositorios separados, y no tienes que usar el diseño que he descrito aquí. Además, si se encuentra en una etapa intermedia en su desarrollo y necesita la última versión de desarrollo de su código compartido, use una URL como http://your.svn.server/SharedClassLib/trunk. Sin embargo, en algún momento, querrá establecer una versión de sable del código externo antes de etiquetar y lanzar su solución.

Editar 2: Tenga en cuenta que esta es la sintaxis svn pre-1.5. Ha cambiado un poco en 1.5

Haga un svn propset svn:externals -F svn.externals . en su directorio de soluciones, luego svn commit && svn update. En este punto, svn completará su copia de trabajo con el contenido de esas URL. Su copia de trabajo sería algo como:

./SolutionA/svn.externals 
./SolutionA/<some_solution_level_files> 
./SolutionA/LocalClassLibrary/<some_project_level_files> 
./SolutionA/LocalWebApp/<some_project_level_files> 
./SolutionA/SharedClassLibrary/<some_project_level_files> 
./SolutionA/SharedWebApp/<some_project_level_files> 

Cuando tenga que traer nuevas versiones de los proyectos compartidos, actualice la propiedad svn: externos adecuadamente. Tenga en cuenta que hay algunas advertencias sobre este enfoque y se detallan en la documentación de SVN Externals. Principalmente, no planeas ser capaz de hacer cambios en ./SolutionA/SharedClassLibrary y esperar que los cambios sean mágicamente recogidos cuando realizas una confirmación en la Solución A.

Ahora está listo para lanzar SolutionA al mundo. Basta con crear la etiqueta apropiada (copia SVN) del tronco al directorio etiquetas:

/SolutionA/tags/1.0.0 

Ahora su SolutionA tendrá su propio código en la correcta etiqueta/versión, y está utilizando la versión correcta de los proyectos compartidos para ese lanzamiento.

Obviamente, la misma discusión se aplica a SolutionB.

No he trabajado con SVN desde hace tiempo, así que mis disculpas si he entendido algo de lo anterior un poco mal.

6

Creo que la solución correcta es etiquetar. No creo que sea una buena idea separar su solución en diferentes repositorios. Es aconsejable mantener todos los proyectos que están incluso ligeramente relacionan en el mismo repositorio, y utilizar el esquema de repositorio estándar, es decir:

/ramas
/tags
/tronco

Con todas las carpetas de solución de trabajo descritos arriba en/trunk. Trunk puede contener tantos proyectos/soluciones como considere manejable, e incluso podría organizarse más por tipo de proyecto. Una de las carpetas de mis troncales es/trunk/websites y guardo todas las soluciones de mi sitio web allí.

Cuando esté listo para una versión de lanzamiento, puede "etiquetar" su baúl, o parte de su baúl, con esa versión de lanzamiento o compilación, utilizando "Sucursal/Etiqueta" en/etiquetas/Esto le brinda la oportunidad para grabar también sus notas de la versión en la copia etiquetada.

Para obtener más información sobre la ramificación y el etiquetado en SVN (asumiendo Tortoise), consulte Branching/Tagging en los documentos de TortiseSVN.

Para obtener más información sobre estos términos, see this question en StackOverflow.

Espero que esto sea útil. No sé cuáles son las limitaciones que puede encontrar en su host SVN. Estas sugerencias se basan en mi experiencia al alojar mi propio repositorio VisualSVN Server.

Llegué a SVN desde SourceSafe, y me llevó algo de tiempo ver el valor de este estándar y comenzar a utilizar estas prácticas. Ellos son invaluables para mí ahora.

+0

Pero cuando agrego nuevas características a mis proyectos dll compartidos que están separados de las soluciones (tiene su propio repositorio) mientras desarrolla otras necesidades de proyecto, el resto de los proyectos principales no tendrán las nuevas características. Quiero mantener cada proyecto actualizado pero compatible con los proyectos principales. – uzay95

+0

De hecho, este es un problema si los proyectos dependientes están en otro repositorio. Si estos proyectos estuvieran en el mismo repositorio, podría etiquetarlos juntos. Mi respuesta se basa en la recomendación de que todos sus proyectos relacionados estén dentro del mismo repositorio. Si esto no es posible, puede haber una forma aceptada de hacerlo, como usar svn: extern (ver: http://svnbook.red-bean.com/en/1.0/ch07s03.html) pero aunque no tengo experiencia directa con esto, tengo la impresión de que es algo que solo debería usarse por necesidad. – Derrick

1

Mi consejo será poner en el mismo repositorio proyectos con el mismo ciclo de vida.

Tomemos el escenario A. Tenemos:

    proyecto
  1. biblioteca de clases compartida (que es para un montón de diferentes soluciones)
  2. Otro proyecto de biblioteca de clases (que es sólo para esta solución)
  3. proyecto de aplicación Web (que parte principal de esta solución)
  4. proyecto
  5. servicio web compartido (que también sirve para diferentes soluciones)

Eso va a hacer un depósito de 2 & 3, que son diferentes proyectos del mismo sol ution (por lo tanto con el mismo ciclo de vida):

/solution-A/trunk/ClassLib 
/solution-A/trunk/WebApp 
/solution-A/tags/1.0.0/ClassLib 
/solution-A/tags/1.0.0/WebApp 

Y un repositorio para 1 & otro para 4 suponiendo que tienen diferentes ciclos de vida.

/library-A/trunk/ShClassLib 
/library-A/tags/1.0.0/ShClassLib 
/library-B/trunk/ShWebService 
/library-B/tags/1.0.0/ShWebService 

Ahora dependiendo del tema en el que un desarrollador está trabajando se puede comprobar a cabo bien el tronco, una etiqueta (sólo lectura) o una rama. Por ejemplo, un desarrollador que trabaje en la solución utilizando las bibliotecas publicadas revisará el tronco de la solución y las etiquetas de la derecha para las bibliotecas. El mismo que requiere las próximas versiones de las bibliotecas revisará el tronco (o una rama) para las bibliotecas, etc.

Por supuesto, será mejor tener un sistema de compilación/versión capaz de entregar versiones binarias para las bibliotecas, así como las construcciones nocturnas.

1

No hay mucho que decir sobre el soporte de Visual Studio porque el uso de Subversion y Tortoise no funciona dentro de Visual Studio. Cuando trabaje con proyectos y soluciones, puede considerar cuidadosamente si la configuración del proyecto y la solución afecta a otros usuarios. Si sus rutas locales no son las mismas que los proyectos en el repositorio, por ejemplo, puede que tenga que verificar los archivos del proyecto y la solución y dejarlos revisados ​​permanentemente.

Para las aplicaciones web a menudo el archivo web.config puede requerir una consideración cuidadosa si hay configuraciones específicas de la máquina en el archivo. Por ejemplo, si está ejecutando IIS 7 y descarga un proyecto que se creó con IIS 6, el archivo del proyecto cambiará potencialmente para apuntar al módulo del sistema y las referencias del controlador en diferentes ubicaciones. O puede tener una cadena de conexión apuntando a un servidor diferente al archivo web.config original. Aquí también la solución es descargar el archivo originalmente y luego mantener el archivo comprobado localmente y recordar no actualizarlo.

Mi sugerencia sincera es poner los proyectos en el mismo repositorio; es fácil de encontrar y hacer una copia de seguridad.Pero la clave para recordar al crear nuevas sucursales y la adición de nuevos archivos en el repositorio es:

Crear carpeta en el repositorio primera

Pedido sólo la carpeta a la carpeta local

agregar archivos con la tortuga en el Explorador

confirmar los cambios

nota al margen:

Si prefiere tener la integración de Visual Studio para el control de código fuente, puede consultar VisualSvn que proporciona integración con TortoiseSVN directamente desde Visual Studio. Visual SVN funciona con sus carpetas de Subversion existentes para que no use el proveedor de control de versiones de Visual Studio (algo bueno en mi humilde opinión). Más bien, habla con las API de TortoiseSVN y obtiene sus datos directamente del almacén de archivos. No he usado Visual SVN por mucho tiempo, pero hasta ahora se ve bien, aunque estoy tan acostumbrado a usar Explorer para el control de código fuente, no ayuda mucho a tener la integración.

Una cosa que es definitivamente más fácil es la creación de nuevos proyectos: solo puede usar Agregar a Subversión y VSVN se encargará de crear la sucursal y revisar los archivos por usted.

Definitivamente es agradable ver el estado de los archivos directamente en el IDE y también es agradable si agrega con frecuencia nuevos archivos al sistema ya que VSVN conoce las asociaciones de archivos de Visual Studio y agrega automáticamente todos los archivos relacionados.

Cuestiones relacionadas