Si vous suivez mes recommandations ci-dessous (que j'ai depuis des années), vous serez en mesure de:
- mettre chaque projet n'importe où dans le contrôle de source, aussi longtemps que vous le préserver la structure à partir du répertoire racine du projet sur la baisse de l'
-- la construction de chaque projet n'importe où sur n'importe quelle machine, avec un minimum de risque, et le minimum de préparation
-- la construction de chaque projet complètement autonome, aussi longtemps que vous avez accès à ses dépendances binaires (locale "bibliothèque" et de "sortie" répertoires)
-- construire et de travailler avec n'importe quelle combinaison de projets, puisqu'ils sont indépendants
-- construire et de travailler avec de multiples copies/versions d'un même projet, puisqu'ils sont indépendants
-- évitez d'encombrer votre source référentiel de contrôle avec les fichiers générés ou les bibliothèques
Je recommande (le bœuf):
Définir chaque projet afin de produire une seule tâche principale, comme une .DLL, .EXE ou .JAR (par défaut par Visual Studio).
La Structure de chaque projet comme un répertoire de l'arbre avec une racine unique.
Créer une génération automatique de script pour chaque projet dans le répertoire racine de ce qui va construire à partir de zéro, avec PAS de dépendances sur un IDE (mais ne pas l'empêcher d'être intégré dans l'IDE, si c'est possible).
Envisager de nAnt .Projets NET sur Windows, ou quelque chose de similaire en fonction de votre système d'exploitation, la plate-forme cible, etc.
Faire de chaque projet, le script de construction de référence externe (3e partie) les dépendances à partir d'un seul local partagé "bibliothèque" de répertoire, avec tous ces binaire TOTALEMENT identifiés par version: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Faire de chaque projet, le script de construction de publier le premier résultat à un seul local partagé "sortie" du répertoire: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Faire de chaque projet, le script de construction de référence de ses dépendances via configurable et entièrement gérés chemins absolus (voir ci-dessus) dans la "bibliothèque" et de "sortie" des répertoires, ET PAS AILLEURS.
Ne laissez JAMAIS un projet directement référence à un autre projet ou de son contenu--d'autoriser uniquement les références à la primaire livrables de la "sortie" du répertoire (voir ci-dessus).
Faire de chaque projet de construction référence de script requise, construire des outils configurable et entièrement gérés chemin d'accès absolu: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Faire de chaque projet, le script de construction de référence de la source de contenu par un chemin absolu du répertoire racine du projet: ${project.base.dir}/src
, ${project.base.dir}/tst
(syntaxe varie selon l'outil de construction).
TOUJOURS besoin d'un projet de construction de script de référence de CHAQUE fichier ou répertoire via un absolu, configurable chemin (la racine d'un répertoire spécifié par une variable configurable): ${project.base.dir}/some/dirs
ou ${env.Variable}/other/dir
.
Ne permettez JAMAIS à un projet de construction de script pour faire référence à QUOI que ce soit avec un chemin relatif, comme .\some\dirs\here
ou ..\some\more\dirs
, TOUJOURS utiliser des chemins absolus.
Ne permettez JAMAIS à un projet de construction de script pour faire référence à quelque CHOSE en utilisant un chemin absolu qui n'est pas configurable répertoire racine, comme C:\some\dirs\here
ou \\server\share\more\stuff\there
.
Pour chaque configurable racine du répertoire référencé par un projet de construction d'un script, de définir une variable d'environnement qui sera utilisé pour ces références.
Tentez de réduire le nombre de variables d'environnement, vous devez créer la configuration de chaque machine.
Sur chaque machine, créer un script shell qui définit les variables d'environnement nécessaires, ce qui est spécifique à la machine (et éventuellement spécifique à l'utilisateur, le cas échéant).
Ne mettez PAS la machine à la configuration spécifique d'un script shell dans le contrôle de code source; au lieu de cela, pour chaque projet, de commettre une copie du script dans le répertoire racine du projet en tant que modèle.
EXIGER que chaque projet de construction de script pour vérifier chacune de ses variables d'environnement, l'abandon et la un message s'ils ne sont pas définis.
EXIGER que chaque projet de construction de script pour vérifier chacune de ses dépendante de l'outil de génération des exécutables, des fichiers de bibliothèque externes, et dépendant de livrables de projet fichiers, et abandonner un message si ces fichiers n'existent pas.
RÉSISTER à la tentation de commettre l'un QUELCONQUE de fichiers générés dans le contrôle de source--non livrables du projet, aucune source généré, génération de documents, etc.
Si vous utilisez un IDE, générer quel que soit le projet de contrôle des fichiers que vous pouvez, et ne pas les commettre à la source de contrôle (cela inclut les fichiers de projets Visual Studio).
Établir un serveur avec une copie officielle de tous les outils et de bibliothèques, d'être copié/installé sur les stations de travail des développeurs et de la construction des machines. En arrière, le long de avec votre référentiel de contrôle source.
Établir un serveur d'intégration continue (machine de compilation) avec AUCUN des outils de développement que ce soit.
Considérons un outil pour gérer vos bibliothèques externes et des livrables, telles que le Lierre (utilisé avec Ant).
Ne PAS utiliser Maven--il va d'abord vous rendre heureux, et éventuellement vous faire pleurer.
Notez que rien de tout cela est spécifique à la Subversion, et la plupart des il est generic à des projets ciblés pour tous les systèmes d'exploitation, le matériel, la plate-forme, la langue, etc. J'ai eu un peu d'OS et d'outil spécifique de la syntaxe, mais uniquement à des fins d'illustration--j'espère que vous allez traduire à votre système d'exploitation ou un outil de choix.
Remarque supplémentaire concernant les solutions Visual Studio: ne les mettez pas dans le contrôle de source! Avec cette approche, vous n'en avez pas besoin ou vous pouvez les générer (tout comme les fichiers de projets Visual Studio). Cependant, je trouve qu'il vaut mieux laisser les fichiers de la solution pour les développeurs à créer/utiliser comme ils l'entendent (mais pas vérifié à la source de contrôle). Je garde un Rob.sln
le fichier sur mon poste de travail à partir de laquelle je référence mon projet actuel(s). Depuis mes projets tous les stand-alone, je peux ajouter/supprimer des projets à volonté (ce qui signifie pas de projet basée sur la dépendance des références).
S'il vous plaît ne pas utiliser Subversion des alias (ou similaires dans d'autres outils), ils sont un anti-modèle et, par conséquent, inutile.
Lorsque vous mettez en place de l'intégration continue, ou même si vous voulez juste pour automatiser le processus de diffusion, créer un script pour ça. Faire un simple script shell qui: prend en paramètres le nom du projet (telles que listées dans le référentiel) et le nom de la balise, crée un répertoire temporaire dans un configurable répertoire racine, vérifie la source pour le nom du projet et le nom de la balise (par la construction de l'URL appropriée dans le cas de la Subversion) pour que le répertoire temporaire, effectue une nouvelle version qui exécute les tests et les paquets du livrable. Ce script shell doit travailler sur un projet et doit être vérifiée dans le contrôle de code source dans le cadre de votre "outils de construction" du projet. Votre serveur d'intégration continue pouvez utiliser ce script comme sa fondation pour les projets de construction, ou il pourrait même fournir (mais vous pourriez encore envie de votre propre).
@VonC: Vous ne voulez PAS tout le temps avec "ant.jar" plutôt que de "ant-a.b.c.d.jar" après vous êtes brûlé lors de votre script de génération des pauses parce que vous sans le savoir, il a couru avec une version incompatible de Fourmi. Ceci est particulièrement commun entre Ant 1.6.5 et 1.7.0. En généralisant, on a TOUJOURS envie de savoir quelle version spécifique de CHAQUE composant est utilisé, y compris votre plate-forme (Java A. B. C. D) et votre outil build (Ant E. F. G. H). Sinon, vous finirez par rencontrer un bug, et votre premier GRAND problème sera de traquer quelles sont les versions de vos différents composants sont impliqués. Il est tout simplement mieux de résoudre le problème de front.