Question

Nous souhaitons stocker nos cibles de construction remplacées dans un fichier externe et inclure ce fichier de cibles dans le fichier TFSBuild.proj. Nous avons un ensemble d'étapes de base qui se produit et aimerions obtenir ces étapes supplémentaires en ajoutant simplement la ligne d'importation au fichier TFSBuild.proj créé par l'assistant.

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>

Nous ne pouvons importer aucun fichier dans $ (SolutionRoot) car au moment où l'instruction d'importation est validée, la source n'a pas été extraite du référentiel. Il semble que TFS décompresse le TFSBuild.proj en premier sans aucun autre fichier.

Même si nous ajoutons une importation conditionnelle, la version dans le contrôle de source ne sera pas importée si elle est présente. La version précédente, déjà présente sur le disque, sera importée.

Nous pouvons renoncer à stocker ces cibles de construction avec notre source, mais il s’agit de la première dépendance à sortir de notre arborescence source, de sorte que nous hésitons à le faire.

Y a-t-il un moyen de soit:

  1. Dites à Team Build de récupérer quelques fichiers supplémentaires pour que les instructions Importer soient évaluées correctement?
  2. Remplacez les cibles Team Build telles que AfterCompile d'une manière autre que Importer ?
  3. Exécutez-vous finalement des cibles de construction dans Team Build qui sont conservées sous la source qu'il est en train de construire?
Était-ce utile?

La solution

Le build d'équipe a un " bootstrap " phase où tout le contenu du dossier Team Build Configuration (le dossier avec TFSBuild.proj) est téléchargé à partir du contrôle de version. Ceci est effectué par l'agent de génération avant que l'agent de génération appelle MSBuild.exe en lui demandant d'exécuter TFSBuild.proj.

Si vous déplacez votre fichier de cibles sous SolutionRoot et le placez dans votre dossier de configuration, à côté du fichier TFSBuild.proj, vous pourrez alors l'importer dans votre fichier TFSBuild.proj à l'aide d'une instruction d'importation relative, i.e.

.
<Import Project="myTeamBuild.targets"/>

Si ces cibles reposent sur des assemblys de tâches MSBuild personnalisés supplémentaires, vous pouvez également les placer dans le même dossier que votre fichier TFSBuild.proj et les référencer facilement à l'aide d'un chemin relatif.

Notez que dans TFS2008, le dossier de configuration de la construction est par défaut inférieur à $ / TeamProject / TeamBuildTypes, mais il n’est pas nécessaire qu’il soit là. En réalité, il peut résider dans un dossier qui se trouve dans votre solution. Il peut même s'agir d'un projet de votre solution dédié à Team Build. Cela présente plusieurs avantages, notamment de faciliter la création de branches pour la construction. Par conséquent, ma construction est généralement située dans un dossier tel que:

$/TeamProject/main/MySolution/TeamBuild

Notez également que, par défaut, pendant la phase d'amorçage de la construction, l'agent de génération ne téléchargera que les fichiers qui se trouvent dans le dossier de configuration de la construction et ne sera pas ramené dans les sous-dossiers. Si vous souhaitez inclure des fichiers dans des sous-dossiers lors de la phase d'amorçage, vous pouvez définir la propriété suivante dans les paramètres appSettings du fichier tfsbuildserver.exe.config sur les ordinateurs de l'agent de génération (situés dans% ProgramFiles% \ Visual Studio 9.0 \ Common7 \ IDE \ PrivateAssemblies)

<add key="ConfigurationFolderRecursionType" value="Full" />

Notez que si vous avez plusieurs agents de génération, vous devez vous rappeler de définir ce paramètre sur toutes les machines, ce qui affectera chaque version réalisée par cet agent de génération. Il est donc préférable de conserver les fichiers dans le répertoire. racine du dossier de configuration de construction si vous le pouvez.

Bonne chance,

Martin.

Autres conseils

Si les cibles ne doivent être exécutées que lorsque TFS exécute la construction et non sur vos machines de développement locales, vous pouvez placer votre fichier de cibles dans le dossier de la construction elle-même et le référencer avec:

<Import Project="$(MSBuildProjectDirectory)\my.team.build.targets.proj" />

Toutefois, si vous souhaitez que les cibles soient exécutées pour toutes les versions, vous pouvez la configurer de sorte que les projets individuels la référencent en ajoutant quelque chose comme:

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets" Condition="Exists('$(SolutionRoot)/libs/my.team.build/my.team.build.targets')" />

Sur mon projet, nous utilisons les deux, le premier nous permet de personnaliser les versions nocturnes afin de pouvoir effectuer des étapes supplémentaires avant et après la compilation complète de la solution, et le second permet la personnalisation projet par projet.

Si vous créez un fichier cible de substitution à importer et que vous l'appelez quelque chose comme TeamBuildOverrides.targets et que vous le placez dans le même dossier du contrôle de code source où TFSBuild.proj vit pour votre type de construction, ce dernier sera extrait et disponible pour l'importation. dans le fichier TFSBuild.proj. Par défaut, le fichier TFSBuild.proj est ajouté au dossier TeamBuildTypes du contrôle de code source directement sous le dossier racine de votre projet.

utilisez l'instruction d'importation suivante dans votre fichier TFSBuild.proj:

<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" />

Assurez-vous que votre fichier TFSBuild.proj ne comporte aucun remplacement en double, sinon les remplacements importés ne seront pas déclenchés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top