This article is available in english.
Avec Visual Studio 2008, configurer l’analyse de code n’est pas simple. Si vous avez plus de 10 projets, cela peut prendre un bon moment pour gérer et appliquer un seul jeu de règles pour toute la solution. Il fallait donc mettre à jour tous les projets à la main, ou utiliser un outil qui éditerait les fichiers csproj pour appliquer le même jeu de règles.
Ce n’est pas vraiment plaisant à faire, ni efficace. En particulier lorsqu’il s’agit d’une centaine de projets.
Dans Visual Studio 2010, l’équipe du produit a ajouté deux choses :
- Les règles sont maintenant dans des fichiers externes, et ne sont plus intégrées dans le fichier de projet. Cela permet de réutiliser les règles dans les autres projets de la solution. Cool.
- Il y a une nouvelle section dans les propriétés de la solution, nommée “Code Analysis Settings”, qui permet d’appliquer un fichier de règles à un projet ou mieux, à tous les projets ! Très cool.
Cette option est aussi disponible via le menu “Analyze”, avec “Configure Code Analysis for Solution”.
Un petit truc à savoir cela dit : pour être capable de sélectionner tous les projets, Ctrl+A ne fonctionne pas. Il faut sélectionner le premier, puis maintenir Ctrl et sélectionner le dernier. Peut-être que l’équipe produit corrigera cela pour la version finale...
Migrer les règles depuis VS2008
Si vous migrez une solution depuis VS2008, et que vous utilisiez l’analyse de code, vous remarquerez probablement que le convertisseur de projet génère un fichier nommé “Migrated rules for MyProject.ruleset” pour chacun des projets de la solution. C’est intéressant si tous les projets n’ont pas les mêmes règles. Mais si elles sont toutes les mêmes, il faudrait toutes les gérer...
Comme tous les programmeurs, je suis paresseux, et j’ai écrit une petite macro qui enlève tous les fichiers “ruleset” générés pour la solution courante. Ma solution n’utilise alors plus qu’un seul jeu de règles.
Ce n'est pas une macro très efficace, mais puisqu'elle ne va pas être beaucoup utilisée... Vous arriverez certainement à vivre avec performance médiocre et un mauvais code VB.NET :)
La voici :
Sub RemoveAllRuleset()
For Each project As Project In DTE.Solution.Projects
FindRuleSets(project)
Next
End Sub
Sub FindRuleSets(ByVal project As Project)
For Each item As ProjectItem In project.ProjectItems
If Not item.SubProject Is Nothing Then
If Not item.SubProject.ProjectItems Is Nothing Then
FindRuleSets(item.SubProject)
End If
End If
If Not item.SubProject Is Nothing Then
If Not item.SubProject.ProjectItems Is Nothing Then
Dim ruleSets As List(Of ProjectItem) = New List(Of ProjectItem)
For Each subItem In item.SubProject.ProjectItems
If subItem.Name.StartsWith("Migrated rules for ") Then
ruleSets.Add(subItem)
End If
Next
For Each ruleset In ruleSets
ruleset.Remove()
Next
End If
End If
Next
End Sub