<?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/ptag/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>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>
	</channel>
</rss>
