<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Benjamin Devuyst &#187; TFS</title>
	<atom:link href="https://blog.developpez.com/bdevuyst/pcategory/alm/tfs/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/bdevuyst</link>
	<description>:)</description>
	<lastBuildDate>Mon, 16 Mar 2020 06:57:16 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Comment éviter de modifier les requêtes TFS à chaque changement d&#8217;itération</title>
		<link>https://blog.developpez.com/bdevuyst/p12839/alm/comment-eviter-de-modifier-les-requetes-tfs-a-chaque-changement-diteration</link>
		<comments>https://blog.developpez.com/bdevuyst/p12839/alm/comment-eviter-de-modifier-les-requetes-tfs-a-chaque-changement-diteration#comments</comments>
		<pubDate>Wed, 04 Mar 2015 13:40:56 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[actuel]]></category>
		<category><![CDATA[changement]]></category>
		<category><![CDATA[current]]></category>
		<category><![CDATA[itération]]></category>
		<category><![CDATA[requête]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=172</guid>
		<description><![CDATA[Lorsque l&#8217;on crée un workitem dans TFS, il est de bon usage de préciser le chemin d&#8217;itération. TFS propose un ensemble de requêtes afin de manipuler les workitems de l&#8217;itération actuelle. Le problème : lorsque l&#8217;itération actuelle est modifiée, il est indispensable de modifier chaque requête traitant de l&#8217;itération actuelle afin d&#8217;adapter le filtre &#171;&#160;IterationPath&#160;&#187;. Ce billet propose une solution pour éviter ces fréquentes modifications. Le contournement est assez simple : il suffit de créer [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Lorsque l&rsquo;on crée un workitem dans TFS, il est de bon usage de préciser le chemin d&rsquo;itération.<br />
TFS propose un ensemble de requêtes afin de manipuler les workitems de l&rsquo;itération actuelle.<br />
<strong>Le problème </strong>: lorsque l&rsquo;itération actuelle est modifiée, il est indispensable de modifier chaque requête traitant de l&rsquo;itération actuelle afin d&rsquo;adapter le filtre &laquo;&nbsp;IterationPath&nbsp;&raquo;.</p>
<p>Ce billet propose une solution pour éviter ces fréquentes modifications.<br />
<span id="more-172"></span></p>
<p>Le contournement est assez simple : il suffit de </p>
<ul>
<li>créer une itération nommée &laquo;&nbsp;Current&nbsp;&raquo;</li>
<li>modifier les requêtes &laquo;&nbsp;Current&nbsp;&raquo; pour pointer vers cette itération</li>
<li>Ensuite, lorsque l&rsquo;itération actuelle change, il suffit de déplacer la nouvelle itération sous l&rsquo;itération &laquo;&nbsp;Current&nbsp;&raquo; préalablement créée</li>
</ul>
<p><strong>Info </strong>: Le but du jeu n&rsquo;est pas de compter le nombre d’occurrence du terme itération dans ce billet <img src="https://blog.developpez.com/bdevuyst/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Voyons cela en détail :</p>
<ul>
<li>
<h2>Préparation</h2>
<ol>
<li>
<h3><strong>Création de l&rsquo;itération &laquo;&nbsp;Current&nbsp;&raquo; dans TFS</strong></h3>
<p>Ouvrir l&rsquo;éditeur d&rsquo;itérations de TFS (la capture d&rsquo;écran traite de TFS 2013)<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-Iterations.png" alt="TFS2013-Iterations" /><br />
Créer une itération nommée &laquo;&nbsp;<strong>Current</strong>&nbsp;&raquo; sous Releases.</li>
<li>
<h3><strong>Edition des requêtes</strong></h3>
<p>Ouvrir le module WIT (WorkItem Tracking) de Visual Studio.<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-Queries.png" alt="TFS2013-Queries" /><br />
Pour chaque requête traitant de l&rsquo;itération actuelle, modifier le filtre pour pointer vers &laquo;&nbsp;Current&nbsp;&raquo;&#8230;<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-QueryEdition.png" alt="TFS2013-QueryEdition" /><br />
Enregistrer</li>
</ol>
</li>
<li>
<h2>Lorsqu&rsquo;une itération débute</h2>
<ol>
<li>Ouvrir l&rsquo;éditeur d&rsquo;itérations de TFS (la capture d&rsquo;écran traite de TFS 2013)<br />
<img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-1.png" alt="TFS2013-MoveCurrent-1" /><br />
Ci-dessus, l&rsquo;itération est nommée : &laquo;&nbsp;2015-03-04 Sprint 1&Prime;</p>
<p><img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-2.png" alt="TFS2013-MoveCurrent-2" /><br />
Déplacer l&rsquo;itération (drag-drop), de son emplacement vers &laquo;&nbsp;Current&nbsp;&raquo;<br />
TFS synchronisera les workitems concernés (modification de l&rsquo;itération) dynamiquement.</p>
<p><img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-3.png" alt="" /><br />
Le résultat&#8230;</li>
</ol>
</li>
<li>
<h2>Lorsqu&rsquo;une itération se termine</h2>
<p>Il suffit de déplacer l&rsquo;itération terminée pour la repositionner sur son parent. Dans mon exemple, Le résultat sera :<br /><img src="http://blog.developpez.com/bdevuyst/files/2015/03/TFS2013-MoveCurrent-4.png" alt="TFS2013-MoveCurrent-4" />
</li>
</ul>
<p>Enfin, si vous souhaitez ne pas devoir effectuer la phase de préparation à chaque création d&rsquo;un teamproject, vous pouvez toujours modifier le template TFS afin d&rsquo;intégrer l&rsquo;itération &laquo;&nbsp;Current&nbsp;&raquo; et les requêtes modifiées. Les projets TFS créés intégreront alors la notion d&rsquo;itération courante et les requêtes liées.</p>
<p>La notion a été trouvé ici : <a href="http://intellitect.com/transitioning-between-sprintsiterations-with-tfs/" target="_blank">Transitioning Between Sprintsiterations With TFS</a>, </p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Génération de packages ClickOnce au sein de TFS Build</title>
		<link>https://blog.developpez.com/bdevuyst/p12078/dotnet-net/generation-de-packages-clickonce-au-sein-de-tfs-build</link>
		<comments>https://blog.developpez.com/bdevuyst/p12078/dotnet-net/generation-de-packages-clickonce-au-sein-de-tfs-build#comments</comments>
		<pubDate>Fri, 21 Jun 2013 13:26:28 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=88</guid>
		<description><![CDATA[Problématique : La solution Visual Studio contient une application WPF déployée par ClickOnce, et l&#8217;objectif est de créer un package ClickOnce lors de l&#8217;exécution du nightly build sous TFS 2010 (industrialisation oblige). Solution #1 : Utiliser l&#8217;activity présente dans la librairie tfsbuildextensions. Inconvénients : L&#8217;utilisation de l&#8217;activity est peu documentée&#8230; Il convient donc d&#8217;ouvrir avec iLSpy l&#8217;assembly pour pouvoir la paramétrer. Cela pourra faire l&#8217;objet d&#8217;un autre billet. L&#8217;implémentation de l&#8217;activity impose à la build [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Problématique </strong>: La solution Visual Studio contient une application WPF déployée par ClickOnce, et l&rsquo;objectif est de créer un package ClickOnce lors de l&rsquo;exécution du nightly build sous TFS 2010 (industrialisation oblige).</p>
<p><strong>Solution #1 :</strong> Utiliser l&rsquo;activity présente dans la librairie <a href="http://tfsbuildextensions.codeplex.com" title="tfsbuildextensions" target="_blank">tfsbuildextensions</a>.<br />
<em>Inconvénients </em>:</p>
<ul>
<li>L&rsquo;utilisation de l&rsquo;activity est peu documentée&#8230; Il convient donc d&rsquo;ouvrir avec iLSpy l&rsquo;assembly pour pouvoir la paramétrer.<br /> Cela pourra faire l&rsquo;objet d&rsquo;un autre billet.</li>
<li>L&rsquo;implémentation de l&rsquo;activity impose à la build de ne contenir (au plus) qu&rsquo;une seule application !
<p>En effet, la création du package ClickOnce est réalisée à la main.<br />
Les grandes lignes du processus sont les suivantes :<br />
 1. Copie du contenu du répertoire binaries de la build dans le répertoire du package<br />
 2. Renommage des fichiers en .deploy<br />
 3. Manipulation de Mage.exe pour créer le manifest de déploiement et le signer.</p>
<p>Etant donné que sous un build TFS, le répertoire des binaries est commun à tous les projets de la build, si votre solution contient plus d&rsquo;une application, le package ClickOnce généré contiendra également les binaires des autres applications&#8230;</p>
<p>Dans ce cas, il ne vous plus reste qu&rsquo;à passez votre chemin et à évaluer la solution #2 !</li>
</ul>
<p>
<strong>Solution #2 :</strong> Modification du template pour ajouter la génération du package ClickOnce par l&rsquo;appel MSBuild.<br />
<u>Étapes :</u></p>
<ol>
<li><strong>Configuration ClickOnce dans le projet concerné</strong><br />
Cela consiste à ouvrir les propriétés du projet, et a paramétrer la publication ClickOnce.<br />
Ensuite, à exécuter le wizard de déploiement afin de tester le paramétrage, et le corriger le cas échéant.<br />
Attention a ne pas oublier d&rsquo;archiver les modifications sur TFS !
</li>
<li><strong>Trouver les bons paramètres en ligne de commande msbuild</strong><br />
L&rsquo;idée est la suivante : il est possible de générer un package ClickOnce à partir d&rsquo;un appel MSBuild à condition de disposer des bons paramètres.<br />
La ligne de commande est la suivante (dans mon cas) :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">msbuild &nbsp;chemin-vers-fichier-projet.csproj<br />
&nbsp; /t:build;publish <br />
&nbsp; /p:ApplicationVersion=1.2.3.4 <br />
&nbsp; /p:BootstrapperEnabled=true <br />
&nbsp; /p:IsWebBootstrapper=true <br />
&nbsp; /p:Configuration=Release <br />
&nbsp; /p:ManifestKeyFile=chemin-vers-fichier-signature.pfx <br />
&nbsp; /p:OutputPath=chemin-vers-repertoire-sortie<br />
&nbsp; /p:InstallUrl=http://url-installation-clickonce</div></div>
<table border="1" cellpadding="5">
<tr>
<td>/t:build;publish</td>
<td>MSBuild doit exécuter Build et Publish</td>
</tr>
<tr>
<td>/p:ApplicationVersion</td>
<td>Propriété indiquant le numéro de version ClickOnce du déploiement<br />
Le format : Majeur.Mineur.Build.Revision</td>
</tr>
<tr>
<td>BootstrapperEnabled</td>
<td>Valeur indiquant si le bootstrapper (setup.exe) doit être généré.</td>
</tr>
<tr>
<td>IsWebBootstrapper</td>
<td>Valeur indiquant que le déploiement ClickOnce doit pouvoir être effectué par le Web (manifeste de déploiement xxx.application)</td>
</tr>
<tr>
<td>Configuration</td>
<td>Valeur indiquant la configuration de build (Debug, Release).</td>
</tr>
<tr>
<td>ManifestKeyFile</td>
<td>Chemin vers le fichier pfx qui signe le manifeste ClickOnce</td>
</tr>
<tr>
<td>OutputPath</td>
<td>Chemin vers le répertoire de destination du package (pour la génération)</td>
</tr>
<tr>
<td>InstallUrl</td>
<td>URL cible de l&rsquo;installation ClickOnce<br />
Ex. : http://server/monapplicationClickOnce</td>
</tr>
</table>
<p><strong>Attention :</strong> Si le fichier de signature a besoin d&rsquo;un mot de passe, il est indispensable d&rsquo;installer le certificat de l&rsquo;autorité racine dans le magasin correspondant du poste de travail, et d&rsquo;installer le certificat de signature dans le magasin my de l&rsquo;utilisateur courant.</p>
</li>
<li><strong>Modification du template de build</strong><br />
Elle consiste à ajouter une activité de type &laquo;&nbsp;MSBuild&nbsp;&raquo; après la commande MSBuild native au workflow en renseignant les paramètres obtenus à l&rsquo;étape ci dessus.<br />
Il peut être nécessaire de préciser une condition d&rsquo;exécution (&laquo;&nbsp;If&nbsp;&raquo;) si plusieurs fichiers solution sont indiqués dans la build afin d&rsquo;éviter que l&rsquo;action de packaging soit exécutée plusieurs fois.<br />
Exemple d&rsquo;utilisation dans un workflow :<br />
<a href="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build.png"><img src="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build.png" alt="ClickOnce-TFS-Build" width="1000" height="538" class="aligncenter size-full wp-image-161" /></a></p>
<p>La paramétrage de l&rsquo;activité msbuild de packaging ressemble à ceci :<br />
<a href="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build-Props.png"><img src="http://blog.developpez.com/bdevuyst/files/2013/06/ClickOnce-TFS-Build-Props.png" alt="ClickOnce-TFS-Build-Props" width="964" height="579" class="aligncenter size-full wp-image-159" /></a><br />
<br />
J&rsquo;attire votre attention sur les deux points suivants :<br />
 &#8211; Les paramètres /p: &#8230; sont injectés dans la case &laquo;&nbsp;CommandLineArguments&nbsp;&raquo;<br />
 &#8211; Le contenu de &laquo;&nbsp;CommandLineArguments&nbsp;&raquo; formatte la chaine à l&rsquo;aide de string.Format (d&rsquo;où la syntaxe {x})<br />
 &#8211; Les paramètres /t: &#8230; sont injectés dans la case &laquo;&nbsp;Targets&nbsp;&raquo;</p>
<p>Je vous laisse consulter la MSDN pour la documentation relative aux paramètre d&rsquo;une activité de build
</li>
</ol>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS 2010, build et MsTest 2012</title>
		<link>https://blog.developpez.com/bdevuyst/p11983/alm/tfs-2010-build-et-mstest-2012</link>
		<comments>https://blog.developpez.com/bdevuyst/p11983/alm/tfs-2010-build-et-mstest-2012#comments</comments>
		<pubDate>Tue, 21 May 2013 12:08:49 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=81</guid>
		<description><![CDATA[Nous disposons de projets .net réalisés en Framework 4.5 et dont la ferme ALM est TFS 2010. Ces projets disposent d&#8217;assemblies de tests, et l&#8217;intégration continue (build) exécutent ces tests. Nativement, il n&#8217;est pas possible d&#8217;exécuter des tests 4.5 sous une machine de build TFS 2010. En effet, le log d&#8217;exécution des builds atteste qu&#8217;il tente d&#8217;utiliser mstest en version 2010 : &#160;&#187; Exécuter MSTest pour les assemblys de tests C:\Program Files (x86)\Microsoft Visual Studio [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Nous disposons de projets .net réalisés en Framework 4.5 et dont la ferme ALM est TFS 2010.<br />
Ces projets disposent d&rsquo;assemblies de tests, et l&rsquo;intégration continue (build) exécutent ces tests.</p>
<p>Nativement, il n&rsquo;est pas possible d&rsquo;exécuter des tests 4.5 sous une machine de build TFS 2010.<br />
En effet, le log d&rsquo;exécution des builds atteste qu&rsquo;il tente d&rsquo;utiliser mstest en version 2010 :</p>
<p>&nbsp;&raquo;<br />
<b>Exécuter MSTest pour les assemblys de tests<br />
  C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe &#8230;</b><br />
&nbsp;&raquo;</p>
<p>La solution consiste à indiquer aux agents de build quel est le chemin de mstest 2012, à savoir :</p>
<ol>
<li>Faire une copie du template de build $\BuildProcessTemplate\DefaultTemplate.xaml<br />
   Exemple de nom pour la copie : DefaultTemplate-MsTest2012</li>
<li>Ouvrir le template DefaultTemplate-MsTest2012 et rechercher les occurrence d&rsquo;activités nommées<br />
    soit &laquo;&nbsp;Exécuter MSTest&nbsp;&raquo;, soit &laquo;&nbsp;Run Test&nbsp;&raquo;</li>
<li>Renseigner dans l&rsquo;argument &laquo;&nbsp;ToolPath&nbsp;&raquo; des activités d&rsquo;exécution de MSTest le chemin du répertoire qui contient mstest pour la version 2012 sur les machines de build<br />
Chemin par défaut :<br />
  &laquo;&nbsp;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\&nbsp;&raquo;</li>
</ol>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS 2010 &#8211; Build WF &gt; CheckIn dll</title>
		<link>https://blog.developpez.com/bdevuyst/p11966/alm/tfs-2010-build-wf-checkin-dll</link>
		<comments>https://blog.developpez.com/bdevuyst/p11966/alm/tfs-2010-build-wf-checkin-dll#comments</comments>
		<pubDate>Mon, 13 May 2013 10:25:43 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[foundation]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=70</guid>
		<description><![CDATA[Dans le cadre de gros développements, nous séparons les projets en plusieurs solutions. Exemple : Solution 1 : Composants extérieurs ne disposant d&#8217;aucune interaction avec les couches de services métiers (drivers, interfaces avec des systèmes extérieurs, etc) Solution 2 : Composants de la couche de services métiers, ou utilisant la couche métier (excepté les applications finales) Solution 3 : Composants affectant les applications finales (exe, applications web, configuration unity, controles graphiques, reporting, etc.) Pour plus [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans le cadre de gros développements, nous séparons les projets en plusieurs solutions.</p>
<p>Exemple :</p>
<ul>
<li>Solution 1 : Composants extérieurs ne disposant d&rsquo;aucune interaction avec les couches de services métiers (drivers, interfaces avec des systèmes extérieurs, etc)</li>
<li>Solution 2 : Composants de la couche de services métiers, ou utilisant la couche métier (excepté les applications finales)</li>
<li>Solution 3 : Composants affectant les applications finales (exe, applications web, configuration unity, controles graphiques, reporting, etc.)</li>
</ul>
<p>Pour plus d’informations sur le multi sln : <a href="http://tfsguide.codeplex.com/" title="tfsguide.codeplex.com">tfsguide.codeplex.com</a></p>
<p>Les dll&rsquo;s générées par les projets non finaux (Solution 1 et 2 ci dessus) sont alors archivées, afin que les membres de l&rsquo;équipe ne soient pas obligés de re générer les sorties de projets à chaque modification de source effectuée par un collègue.<br />
Les références entre projets de solutions différentes étant par dll dans le repository correspondant.</p>
<p>Lorsque l&rsquo;intégration continue est en place, un build par solution est installé.<br />
Dès lors, lorsqu&rsquo;une source est archivée, le contrôleur de build initie un build de la solution concernée.</p>
<p>Etant donné que le build se produit à chaque archivage, il est de bonne augure de le responsabiliser afin qu&rsquo;il réalise lui même la mise à jour des dll lors des archivages (cela décharge donc les développeurs de cette tache).</p>
<p>Le workflow TFS 2010 situé dans l&rsquo;archive <a href="http://bdevuyst.ftp-developpez.com/blog/TFS/Template-de-build-TFS-2010-CheckIn-dll-multi-sln.zip" title="Template-de-build-TFS-2010-CheckIn-dll-multi-sln" target="_blank">Template-de-build-TFS-2010-CheckIn-dll-multi-sln.zip</a> réalise cela sur base du DefaultTemplate.xaml</p>
<p>Attention</p>
<ul>
<li>
le compte utilisateur exécuté par les services de build doit disposer de droits d&rsquo;extraction / archivage sur le répertoire !
</li>
<li>
Nous vous conseillons de ne pas exécuter deux identiques simultanément (mode continu avec un délai de xx minutes entre deux démarrages;  le délai préconisé correspond à la durée d&rsquo;exécution des builds)
</li>
<p>Edit : J&rsquo;ai modifié le WorkFlow pour permettre d&rsquo;éviter l&rsquo;évènement de CheckIn ( via RepositoryConstants.NoCICheckInComment) afin d&rsquo;éviter les builds en cascade (la solution 2 utilise les dll produites par la solution 1, du coup, si CheckIn dll Sln 1 &gt; Build Sln 2).</p>
<p>Enjoy</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS et workflow de build</title>
		<link>https://blog.developpez.com/bdevuyst/p11956/dotnet-net/tfs-et-workflow-de-build</link>
		<comments>https://blog.developpez.com/bdevuyst/p11956/dotnet-net/tfs-et-workflow-de-build#comments</comments>
		<pubDate>Tue, 07 May 2013 08:46:50 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[large]]></category>
		<category><![CDATA[projets]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[team]]></category>
		<category><![CDATA[workflow]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=67</guid>
		<description><![CDATA[Cette fois ci, je ne vais pas épiloguer&#8230; car cela ne sert à rien de reprendre un contenu déjà existant et correspondant à mes attentes : clair et complet ! Customize Team Build 2010 Edit 2013-05-16 : Petite précision, dans la partie Part 5 : Increase AssemblyVersion, l&#8217;auteur précise dans le code de l&#8217;activité check out l&#8217;instruction &#160;&#187; workflow.Folders &#160;&#187; pour récupérer les répertoires mappés dans le workspace. Ensuite, &#160;&#187; folder.LocalItem &#160;&#187; pour récupérer le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cette fois ci, je ne vais pas épiloguer&#8230; car cela ne sert à rien de reprendre un contenu déjà existant et correspondant à mes attentes : clair et complet !</p>
<p><a href="http://www.ewaldhofman.nl/post/2010/04/20/Customize-Team-Build-2010-e28093-Part-1-Introduction.aspx" title="Customize Team Build 2010" target="_blank">Customize Team Build 2010</a></p>
<p><b>Edit 2013-05-16 :</b> Petite précision, dans la partie Part 5 : <a href="http://www.ewaldhofman.nl/post/2010/05/13/Customize-Team-Build-2010-e28093-Part-5-Increase-AssemblyVersion.aspx" title="Increase AssemblyVersion" target="_blank">Increase AssemblyVersion</a>, l&rsquo;auteur précise dans le code de l&rsquo;activité check out l&rsquo;instruction &nbsp;&raquo; workflow.Folders &nbsp;&raquo; pour récupérer les répertoires mappés dans le workspace.<br />
Ensuite, &nbsp;&raquo; folder.LocalItem &nbsp;&raquo; pour récupérer le chemin local (dans la boucle &laquo;&nbsp;pour chaque folder contenu dans le workspace&nbsp;&raquo;).<br />
Le problème est le suivant : si le workspace contient un folder cloaked, il est bien contenu dans la liste retournée par la propriété workspace.Folder, mais la propriété LocalItem est nulle ! (ce qui est logique !)<br />
Donc, lorsqu&rsquo;il est nécessaire de lister les répertoires : il faut ajouter un filtre sur soit <b>folder.IsCloaked</b> soit sur <b>string.IsNullOrEmpty(folder.LocalItem)</b> afin de ne récupérer que les folders mappés dans le workspace courant !</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi solution Visual Studio et dépendances</title>
		<link>https://blog.developpez.com/bdevuyst/p11860/dotnet-net/multi-solution-visual-studio-et-dependances</link>
		<comments>https://blog.developpez.com/bdevuyst/p11860/dotnet-net/multi-solution-visual-studio-et-dependances#comments</comments>
		<pubDate>Tue, 26 Mar 2013 09:51:57 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[ALM]]></category>
		<category><![CDATA[DotNet - .net]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[big]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[complex]]></category>
		<category><![CDATA[foundation]]></category>
		<category><![CDATA[large]]></category>
		<category><![CDATA[multiple]]></category>
		<category><![CDATA[muti]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[projets]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[team]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/bdevuyst/?p=56</guid>
		<description><![CDATA[Les projets informatiques de taille conséquentes sont notre quotidien (refonte de SI, utilisation de nombreuses interfaçages extérieur au projet initial, etc). Si on ajoute le respect des bonnes pratiques (ex : couplage faible entre couches &#62; l&#8217;utilisation de mécaniques d&#8217;injections de dépendances &#8211; en d&#8217;autres termes, Article sur les IOC), On obtient des fichiers solutions Visual Studio dont le nombre de projet excède largement la douzaine projets&#8230; ce billet propose juste une piste de travail [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les projets informatiques de taille conséquentes sont notre quotidien (refonte de SI, utilisation de nombreuses interfaçages extérieur au projet initial, etc).<br />
Si on ajoute le respect des bonnes pratiques (ex : couplage faible entre couches &gt; l&rsquo;utilisation de mécaniques d&rsquo;injections de dépendances &#8211; en d&rsquo;autres termes, <a href="http://philippe.developpez.com/articles/dotnet/injectiondedependances/" title="Article sur les IOC">Article sur les IOC</a>),</p>
<p>On obtient des fichiers solutions Visual Studio dont le nombre de projet excède largement la douzaine projets&#8230;</p>
<p>ce billet propose juste une piste de travail pour ce genre de problématiques&#8230;</p>
<p>Or, d&rsquo;après les cahiers blancs MS (<a href="http://tfsguide.codeplex.com/" title="Un bon guide de mise en place des pratiques TFS">Un bon guide de mise en place des pratiques TFS</a>), des fichiers SLN de plus d&rsquo;une douzaine de projet ont des conséquences fâcheuses sur le projet :<br />
 &#8211; Absence d&rsquo;optimisation des assemblies à la compilation, (je confirme)<br />
 &#8211; Temps de compilations excessifs sur les machines des développeurs  (je confirme)<br />
 &#8211; Temps de compilations excessifs sur les agents de builds (intégration continue),  (je confirme)<br />
 &#8211; Piètre performance au chargement de la solution  (je confirme)<br />
 &#8211; &#8230;</p>
<p>La solution consiste à considérer les stratégies décrites dans le cahier blanc, pour éventuellement aboutir sur un Multi SLN.<br />
Exemple :<br />
 &#8211; SLN1 : Projets totalement indépendants des projets de la solution (drivers, API client de partenaires extérieurs, API commune à l&rsquo;entreprise)<br />
 &#8211; SLN2 : Projets de la couche de services, la DAL, etc.<br />
 &#8211; SLN3 : Projets propres à la couche de présentation</p>
<p>L&rsquo;exemple ci-dessus est une stratégie, d&rsquo;autres stratégies existent.</p>
<p>La règle, en termes de références entre projets, est la suivante : tous les projets situés au sein du même SLN peuvent se référencer entre eux, les liens entre projets de solutions différentes doivent se réaliser par DLL.<br />
Dès lors, les outputs des projets des solutions (excepté celle de présentation) doivent être archivées (par solution) afin de ne pas forcer les développeur à devoir régénérer toutes les SLN lorsqu&rsquo;un autre membre de l&rsquo;équipe modifie une couche intermédiaire.<br />
En d&rsquo;autres termes :<br />
 &#8211; les outputs des projets de la SLN1 sont redirrigés en postBuild Event vers un répertoire (ex : $SlnRoot\_Build-SLN1) puis archivés.<br />
 &#8211; les outputs des projets de la SLN2 sont redirrigés en postBuild Event vers un répertoire (ex : $SlnRoot\_Build-SLN2) puis archivés.</p>
<p>La commande xcopy à placer dans le postBuild Event du projet est la suivante :<br />
   xcopy /E /Y /D /R &laquo;&nbsp;$(TargetDir)*.*&nbsp;&raquo; &laquo;&nbsp;$(SolutionDir)_Build-SLN-1-[SlnName]&nbsp;&raquo;</p>
<p>/E : Copie les répertoires et sous-répertoires, y compris les répertoires vides<br />
/Y : Supprime la demande de confirmation de remplacement de fichiers de destination existants<br />
/D : Copie les fichiers modifiés à partir de la date spécifiée. Si aucune date n&rsquo;est donnée, copie uniquement les fichiers dont l&rsquo;heure source est plus récente que l&rsquo;heure de destination<br />
/R : Remplace les fichiers en lecture seule</p>
<p>La dernière option est très importante, car les dll&rsquo;s de destination sont en Read Only (puisque archivées sur TFS)&#8230; Sans le /R, on peut avoir des erreurs comme :<br />
Error	3	The command &laquo;&nbsp;xcopy /E /Y /D &laquo;&nbsp;E:\DEV\&#8230;\MonProjet\bin\Debug\*.*&nbsp;&raquo; &laquo;&nbsp;E:\DEV\_Build-SLN-1-SlnName&nbsp;&raquo; &#8230; exited with code 4.</p>
<p>Astuce : Pour vérifier le message d&rsquo;erreur réel : copier la commande remontée par Visual Studio lors des erreurs de build liées à xcopy dans une invite de commande et l&rsquo;exécuter !</p>
<p>Un dernier point : Si vous êtes confronté à ces problèmes de solutions complexes, je vous invite à<br />
 &#8211; lire le document cité ci dessus afin d&rsquo;élaborer une stratégie de multi SLN (non trivial),<br />
 &#8211; échanger avec les membres de l&rsquo;équipe, car en définitive ce sont eux qui exploiteront les SLNs !</p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Work item viewer</title>
		<link>https://blog.developpez.com/bdevuyst/p11195/alm/tfs/work_item_viewer</link>
		<comments>https://blog.developpez.com/bdevuyst/p11195/alm/tfs/work_item_viewer#comments</comments>
		<pubDate>Tue, 31 Jul 2012 08:30:47 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je cherchais un petit outil permettant de visualiser graphiquement les liens entre workitems TFS, et si possible open source&#8230; &#171;&#160;Work Item Visualization&#160;&#187; du CodePlex correspond parfaitement au cahier des charges ! Cerise sur le gâteau : le fichier graphique en sortie est un dgml ! http://visualization.codeplex.com/ Enjoy !]]></description>
				<content:encoded><![CDATA[<p>Je cherchais un petit outil permettant de visualiser graphiquement les liens entre workitems TFS, et si possible open source&#8230;<br />
&laquo;&nbsp;Work Item Visualization&nbsp;&raquo; du CodePlex correspond parfaitement au cahier des charges !<br />
Cerise sur le gâteau : le fichier graphique en sortie est un dgml !</p>
<p><a href="http://visualization.codeplex.com/">http://visualization.codeplex.com/</a></p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lenteurs d&#8217;accès à TFS par des outils client&#8230;</title>
		<link>https://blog.developpez.com/bdevuyst/p11179/alm/tfs/tfs_visual_studio_excel_office_lenteur_s</link>
		<comments>https://blog.developpez.com/bdevuyst/p11179/alm/tfs/tfs_visual_studio_excel_office_lenteur_s#comments</comments>
		<pubDate>Fri, 27 Jul 2012 13:34:24 +0000</pubDate>
		<dc:creator><![CDATA[benji_dv]]></dc:creator>
				<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Depuis la réinstallation de mon portable, les accès TFS avec des outils clients tels que Visual Studio 2010 ou application office (Excel) étaient lent&#8230; trèèèès lent&#8230; Après recherche, la solution pour Visual Studio 2010 (trouvée ici ) fut appliquée : Modifier le fichier de configuration de Visual Studio 2010 (devenv.exe.config) pour lui ajouter la ligne suivante : 1: &#60;system.net&#62; 2: &#60;defaultProxy enabled=&#160;&#187;false&#160;&#187; /&#62; &#60;!&#8211; Nouvelle ligne &#8211;&#62; 3: &#60;settings&#62; 4: &#60;ipv6 enabled=&#160;&#187;true&#160;&#187;/&#62; 5: &#60;/settings&#62; 6: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Depuis la réinstallation de mon portable, les accès TFS avec des outils clients tels que Visual Studio 2010 ou application office (Excel) étaient lent&#8230; trèèèès lent&#8230;</p>
<p>Après recherche, la solution pour Visual Studio 2010 (trouvée <a href="http://bartwullems.blogspot.fr/2010/11/slow-connection-when-connecting-to-team.html">ici</a> ) fut appliquée :<br />
 Modifier le fichier de configuration de Visual Studio 2010 (devenv.exe.config) pour lui ajouter la ligne suivante :<br />
   1:  &lt;system.net&gt;<br />
   2:     &lt;defaultProxy enabled=&nbsp;&raquo;false&nbsp;&raquo; /&gt; &lt;!&#8211; Nouvelle ligne &#8211;&gt;<br />
   3:     &lt;settings&gt;<br />
   4:        &lt;ipv6 enabled=&nbsp;&raquo;true&nbsp;&raquo;/&gt;<br />
   5:     &lt;/settings&gt;<br />
   6:  &lt;/system.net&gt;</p>
<p>Ceci résolut le problème sous VS mais par sous Excel.</p>
<p>Après investigation dans le répertoire d&rsquo;Office, j&rsquo;ai trouvé un fichier manifest excel.exe.manifest<br />
Bonne nouvelle : cela a l&rsquo;odeur de .net !<br />
Dès lors :</p>
<ol>
<li>Création d&rsquo;un fichier nommé excel.exe.config</li>
<li>Ajout des lignes suivantes :</li>
</ol>
<p>   0:  &lt;configuration&gt;<br />
   1:  &lt;system.net&gt;<br />
   2:     &lt;defaultProxy enabled=&nbsp;&raquo;false&nbsp;&raquo; /&gt; &lt;!&#8211; Nouvelle ligne &#8211;&gt;<br />
   3:     &lt;settings&gt;<br />
   4:        &lt;ipv6 enabled=&nbsp;&raquo;true&nbsp;&raquo;/&gt;<br />
   5:     &lt;/settings&gt;<br />
   6:  &lt;/system.net&gt;<br />
   7:  &lt;/configuration&gt;<br />
<br />
Et&#8230; cela fonctionne : les problèmes TFS Excel sont résolus !</p>
<p>Bon à savoir !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
