J'ai trouvé ce tuto : https://www.linkedin.com/pulse/multi-appconfig-visual-studio-2017-benjamin-davis/
Voici la traduction rapide avec mes notes.
Attention : C'est un peu long, mais ça marche tellement bien que cela vaut le coup. En plus on ne le fait qu'une seule fois par projet.
Prérequis : .NET4.5 (ou plus) et Visual studio 17
1) Charger le projet et ajouter 2 fichiers : App.Debug.config et App.Release.config sans pour l'instant les modifier.
2) Enregistrer et Déchargez le projet
3) Avec un éditeur de texte quelconque éditer le fichier projet (.csproj)
4) Après le dernier bloc XML PropertyGroup Ajouter
<PropertyGroup> <ProjectConfigFileName>App.config</ProjectConfigFileName>
</PropertyGroup>
Sans ce bloc la librairie qui fait la transformation du fichier cherche un fichier "web.config" ! (C'est normal c'est une librairie qui vient des projets Web)
5) Dans le bloc XML qui contient l'inclusion du fichier App.config, modifier comme suit (en orange) afin de lier les fichiers Debug et Release avec le fichier App.config.
<ItemGroup> <None Include="App.config" />
<!-- Ne pas toucher ce qu'il y a avant -->
<None Include="App.Debug.config"> <DependentUpon>App.config</DependentUpon> </None> <None Include="App.Release.config"> <DependentUpon>App.config</DependentUpon> </None> <!-- Ne pas toucher ce qu'il y a après --> </ItemGroup>
A noter le fichier App.config a peut être d'autres configurations en fonction du projet : par exemple dans mon projet j'ai :
<None Include="App.config">
<SubType>Designer</SubType>
</None>
Ne pas toucher : non plus !
6) Chercher si un nœud XML PropertyGroup existe et contient un nœud VisualStudioVersion si ce n'est pas le cas, il faut le créer sinon il faut y ajouter le noeud VSToolsPath. Ce nœud permet au processus de Build de connaitre le chemin d'accès de la librairie de transformation.
Donc à la fin vous devez avoir :
<PropertyGroup> <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
Ne mettez pas d'espace dans de texte du noeud VSToolsPath (pas d'espace avant le $(MSBuild. et après le ...VisualstudioVersion)</VSToolsPath.
Bien sûr il faudra surement ajuster le numéro de version de Visual Studio en fonction de votre version (Je n'ai testé qu'avec un Visual Studio 2017)
7) En fin de fichier après le dernier Import ajouter l'import de la librairie à utiliser
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets"
Condition="'$(VSToolsPath)' != ''" />
8) Ajouter le lancement de la transformation en toute fin de fichier à la racine
<!-- Tout le fichier avant -->
<Target Name="AfterBuild"> <TransformXml Source="@(AppConfigWithTargetPath)" Transform="$(ProjectConfigTransformFileName)"
Destination="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')" /> </Target> </Project>
Le Tutorial s'arrête la !
Moi J'ajouterais :
9) Recharger le projet dans Visual Studio. Constater que le fichier App.config peut se déplier et qu'il y a les fichiers App.Debug.config et App.Release.config en dessous.
10) Modifier les fichier Debug et Release en fonction de vos besoins.
Pour ce faire : un peu de lecture de la doc Microsoft et roule ma poule !
https://docs.microsoft.com/fr-fr/previous-versions/dd465326(v=vs.100)
11) Cas d'exemple : Changer la chaîne de connexion en fonction de DEBUG ou RELEASE
Un des choix possible est :
11.a) Dans le App.config
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="MonAppli" connectionString="Sera remplace dans le App.Debug.config ou le App.Release.config"/>
</connectionStrings>
<appSettings>
<!--- Suite du fichier --->
</appSettings>
</configuration>
A noter ici :
- Le nom de la chaîne de connexion peut changer en fonction de vos besoins
- Le texte de la chaîne de connexion est non valide : Cela permet de valider que cela fonctionne bien dans les 2 configuration.
11.b) Dans le App.Debug.config ou App.Release.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add name="MonAppli" connectionString="Data Source=ServerBDD;Initial Catalog=MaBase_test;integrated security=SSPI" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
</configuration>
A noter ici :
- Le NameSpace ajouté au nœud configuration est obligatoire
- Le nom de la chaîne de connexion est le même que dans le fichier App.config (c'est important voir ci-dessous)
- La chaîne dans l'attribut ConnectionString (en rose) est a adapter en fonction du fichier et de la base à laquelle se connecter quand on est en Debug ou en Release.
- L'attribut xdt:Locator permet d'indiquer, à l'aide d'une requête XPath, dans le fichier App.config, sur quel ou quels nœuds XML la transformation va s'appliquer. Ici on Matche sur l'attribut name c'est à dire tous les nœuds du fichier App.config qui ont le chemin XML suivant : configuration/ConnectionStrings/add[name="MonAppli"]
- L'attribut xdt:Transform permet d'expliquer quelle transformation appliquer (Ici remplacement de tous les attributs du ou des nœuds trouvés.
12) Compilez et Enjoy !