Si sigue mis recomendaciones a continuación (las he hecho durante años), podrá:
- coloque cada proyecto en cualquier lugar del control de código fuente, siempre que conserve la estructura desde el directorio raíz del proyecto hacia abajo
- construya cada proyecto en cualquier lugar de cualquier máquina, con un riesgo mínimo y una preparación mínima
- construya cada proyecto de forma completamente independiente, siempre que tenga acceso a sus dependencias binarias ("biblioteca" local y directorios de "salida")
- construir y trabajar con cualquier combinación de proyectos, ya que son independientes
- construir y trabajar con múltiples copias / versiones de un solo proyecto, ya que son independientes
- evite saturar su repositorio de control de fuente con archivos o bibliotecas generados
Recomiendo (aquí está la carne):
Defina cada proyecto para producir una única entrega principal, como .DLL, .EXE o .JAR (predeterminado con Visual Studio).
Estructure cada proyecto como un árbol de directorios con una sola raíz.
Cree un script de compilación automatizado para cada proyecto en su directorio raíz que lo compile desde cero, SIN dependencias en un IDE (pero no impida que se compile en el IDE, si es posible).
Considere nAnt para proyectos .NET en Windows, o algo similar según su sistema operativo, plataforma de destino, etc.
Haga que cada script de construcción del proyecto haga referencia a sus dependencias externas (de terceros) desde un único directorio de "biblioteca" compartido local, con cada uno de esos binarios TOTALMENTE identificado por la versión: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Haga que cada script de construcción de proyecto publique la entrega principal en un único directorio de "salida" compartido local: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Haga que cada script de construcción de proyecto haga referencia a sus dependencias a través de rutas absolutas configurables y completamente versionadas (ver arriba) en los directorios "biblioteca" y "salida", Y EN NINGÚN OTRO LUGAR.
NUNCA permita que un proyecto haga referencia directamente a otro proyecto o cualquiera de sus contenidos; solo permita referencias a los entregables primarios en el directorio de "salida" (ver arriba).
Haga que cada secuencia de comandos de compilación del proyecto haga referencia a sus herramientas de compilación necesarias mediante una ruta absoluta configurable y completamente versionada: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Hacer todos los proyectos del script de creación de contenido de código de referencia mediante una ruta absoluta relativa al directorio raíz del proyecto: ${project.base.dir}/src
, ${project.base.dir}/tst
(sintaxis varía según la herramienta de construcción).
SIEMPRE requiera un script de construcción del proyecto para hacer referencia a CADA archivo o directorio a través de una ruta absoluta y configurable (enraizada en un directorio especificado por una variable configurable): ${project.base.dir}/some/dirs
o ${env.Variable}/other/dir
.
NUNCA permita que un script de construcción de proyecto haga referencia a NADA con una ruta relativa como .\some\dirs\here
o ..\some\more\dirs
, SIEMPRE use rutas absolutas.
NUNCA permita que un script de construcción de proyecto haga referencia a NADA utilizando una ruta absoluta que no tenga un directorio raíz configurable, como C:\some\dirs\here
o \\server\share\more\stuff\there
.
Para cada directorio raíz configurable al que hace referencia un script de construcción del proyecto, defina una variable de entorno que se utilizará para esas referencias.
Intente minimizar la cantidad de variables de entorno que debe crear para configurar cada máquina.
En cada máquina, cree un script de shell que defina las variables de entorno necesarias, que es específico para ESA máquina (y posiblemente específico para ese usuario, si es relevante).
NO coloque el script de shell de configuración específico de la máquina en el control de código fuente; en su lugar, para cada proyecto, envíe una copia del script en el directorio raíz del proyecto como plantilla.
REQUIERE que cada script de construcción del proyecto verifique cada una de sus variables de entorno y anule con un mensaje significativo si no están definidas.
REQUIERE que cada secuencia de comandos de compilación del proyecto verifique cada uno de los ejecutables de la herramienta de compilación dependiente, los archivos de la biblioteca externa y los archivos entregables del proyecto dependiente, y anule con un mensaje significativo si esos archivos no existen.
RESISTE la tentación de comprometer CUALQUIER archivo generado en el control de la fuente: sin entregables del proyecto, sin fuente generada, sin documentos generados, etc.
Si usa un IDE, genere todos los archivos de control del proyecto que pueda y no los confíe al control de código fuente (esto incluye los archivos de proyecto de Visual Studio).
Establezca un servidor con una copia oficial de todas las bibliotecas y herramientas externas, que se copiará / instalará en las estaciones de trabajo de los desarrolladores y en las máquinas de construcción. Realice una copia de seguridad junto con su repositorio de control de código fuente.
Establezca un servidor de integración continua (máquina de construcción) SIN herramientas de desarrollo en absoluto.
Considere una herramienta para administrar sus bibliotecas externas y entregables, como Ivy (utilizada con Ant).
NO uses Maven: inicialmente te hará feliz y eventualmente te hará llorar.
Tenga en cuenta que nada de esto es específico de Subversion, y la mayoría es genérico para proyectos dirigidos a cualquier sistema operativo, hardware, plataforma, lenguaje, etc. Usé un poco de sintaxis específica del sistema operativo y de la herramienta, pero solo como ilustración. -Confío en que lo traducirá a su sistema operativo o herramienta de elección.
Nota adicional sobre las soluciones de Visual Studio: ¡no las ponga en control de código fuente! Con este enfoque, no los necesita en absoluto o puede generarlos (al igual que los archivos de proyecto de Visual Studio). Sin embargo, creo que es mejor dejar los archivos de la solución a los desarrolladores individuales para que los creen / usen como mejor les parezca (pero no registrados en el control de código fuente). Yo guardo unRob.sln
archivo en mi estación de trabajo desde el que hago referencia a mis proyectos actuales. Dado que todos mis proyectos son independientes, puedo agregar / eliminar proyectos a voluntad (eso significa que no hay referencias de dependencia basadas en proyectos).
No utilice externos de Subversion (o similares en otras herramientas), son un anti-patrón y, por lo tanto, innecesarios.
Cuando implemente la integración continua, o incluso cuando solo desee automatizar el proceso de lanzamiento, cree un script para ello. Cree un único script de shell que: tome parámetros del nombre del proyecto (como se enumeran en el repositorio) y el nombre de la etiqueta, cree un directorio temporal dentro de un directorio raíz configurable, verifique la fuente para el nombre del proyecto y el nombre de la etiqueta dados (construyendo el URL apropiada en el caso de Subversion) a ese directorio temporal, realiza una compilación limpia que ejecuta pruebas y empaqueta el entregable. Este script de shell debería funcionar en cualquier proyecto y debería incorporarse al control de código fuente como parte de su proyecto de "herramientas de construcción". Su servidor de integración continua puede utilizar este script como base para la creación de proyectos, o incluso puede proporcionarlo (pero es posible que desee el suyo propio).
@VonC: NO desea trabajar en todo momento con "ant.jar" en lugar de "ant-abcdjar" después de que se queme cuando se rompe el script de compilación porque, sin saberlo, lo ejecutó con una versión incompatible de Ant. Esto es particularmente común entre Ant 1.6.5 y 1.7.0. Generalizando, SIEMPRE desea saber qué versión específica de CADA componente se está utilizando, incluida su plataforma (Java ABCD) y su herramienta de compilación (Ant EFGH). De lo contrario, eventualmente encontrará un error y su primer GRAN problema será rastrear qué versiones de sus diversos componentes están involucradas. Simplemente, es mejor resolver ese problema desde el principio.