119 votes

Comment sélectionner différentes app.config pour plusieurs configurations de construction

J'ai une dll type de projet qui contient MSTest des tests d'intégration. Sur ma machine les tests passent, et je veux le même pour arriver sur un serveur CI (j'utilise TeamCity). Mais les tests échouent, parce que j'ai besoin de modifier certains paramètres de l'app.config. C'est pourquoi je pensais avoir une deuxième application.fichier de configuration qui contiendra les paramètres de serveur CI.

Donc, je voudrais avoir

/Sln
/Proj
 app.config (je pense que cela est requis par VS)
 app.La libération.config (C'est un autonome, indépendant du fichier de config)

Donc si j'ai sélectionner la Version de la configuration de créer une config CI, j'aimerais utiliser l'application.La libération.fichier de configuration au lieu d'application.config

Problème
Cela ne semble pas être simple pour simple .dll type de projets. Pour les projets web, je peux faire de configuration web de transformations. J'ai trouvé un hack comment faire ces transformations pour une dll type de projet, mais je ne suis pas un grand fan de hacks.

Question
Ce qui est une approche standard de tweak app.les fichiers de configuration en fonction de construire config .NET de projets (tels que Debug, Release, ...)?

154voto

oleksii Points 17099

Comme vous l'avez déjà remarqué, il n'y a pas de défaut et facile à utiliser différents fichiers de configuration pour un type de Bibliothèque (.dll) du projet. La raison en est que le courant thining est: "Vous n'avez pas besoin"! Cadre développeurs pense que vous besoin de configuration, le fichier exécutable: une console, un bureau, web, application mobile ou quelque chose d'autre. Si vous commencer à fournir de configuration pour une dll, vous pouvez vous retrouver avec quelque chose que je peux appeler une config d'enfer. Vous pouvez ne comprends plus (facilement) pourquoi ce et que les variables ont de telles valeurs étranges venant apparemment de nulle part.

"Hold on", - vous pouvez dire, "mais j'en ai besoin pour mon intégration/tests unitaires, c'est une bibliothèque!". Et ce qui est vrai et ce est ce que vous pouvez faire (ne choisir qu'un seul, ne se mélangent pas):

1. SlowCheetah de transformations de fichier actuel

Vous pouvez installer SlowCheetah - Visual Studio plug-in qui fait tout le bas niveau XML piquer (ou de transformation) pour vous. La manière dont il fonctionne, brièvement:

  • Installer SlowCheetah et redémarrez Visual Studio
  • Définir vos configurations de solution (Debug et Release sont là par défaut), vous pouvez ajouter plus d' (clic droit sur la solution dans l'Explorateur de solutions > Gestionnaire de Configuration... > Configuration de la Solution Active > Nouveau...
  • Ajouter un fichier de configuration si nécessaire
  • Clic droit sur le fichier de config > Ajout de Transformer
    • Cela permettra de créer des fichiers de Transformation - et-un pour votre configuration
    • Transformer les fichiers de travail comme injecteurs/mutateurs, ils trouvent nécessaire de code XML dans le fichier de config d'origine et d'injecter de nouvelles lignes ou de muter nécessaire de valeur, tout ce que vous lui dites de faire

2. Tripoter .proj copie de fichier-renommer un tout nouveau fichier de configuration

À l'origine, à partir d' ici. Il est une coutume tâche MSBuild que vous pouvez intégrer dans Visual Studio .proj fichier. Copiez et collez le code suivant dans le fichier de projet

<Target Name="AfterBuild">
    <Delete Files="$(TargetDir)$(TargetFileName).config" />
    <Copy SourceFiles="$(ProjectDir)\Config\App.$(Configuration).config"
          DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</Target>

Maintenant, créez un dossier dans le projet appelé Config et ajouter de nouveaux fichiers: App.Debug.config, App.La libération.config et ainsi de suite. Maintenant, en fonction de votre configuration, Visual Studio va chercher le fichier de configuration à partir d'un Config le dossier et copiez-le renommer dans le répertoire de sortie. Donc, si vous aviez PatternPA.Test.L'intégration du projet et un Débogage config sélectionné, dans le dossier de sortie après la construction, vous trouverez une PatternPA.Test.De l'intégration.dll.config fichier qui a été copié à partir d' Config\App.Debug.config et renommé par la suite.

Ces quelques notes vous pouvez les laisser dans les fichiers de configuration

<?xml version="1.0" encoding="utf-8"?>
<configuration>

    <!-- This file is copied and renamed by the 'AfterBuild' MSBuild task -->

    <!-- Depending on the configuration the content of projectName.dll.config 
        is fully substituted by the correspondent to build configuration file 
        from the 'Config' directory. -->

</configuration>

Dans Visual Studio, vous pouvez avoir quelque chose comme ceci

Project structure

3. Utiliser des scripts des fichiers en dehors de Visual Studio

Chaque outil de construction (comme le NAnt, MSBuild) permettent de transformer le fichier de configuration en fonction de la configuration. Ceci est utile si vous construisez votre solution sur une machine de compilation, où vous avez besoin d'avoir plus de contrôle sur ce que et comment vous préparer le produit pour la libération.

Par exemple, vous pouvez utiliser la publication web dll tâche de transformer n'importe quel fichier de config

<UsingTask AssemblyFile="..\tools\build\Microsoft.Web.Publishing.Tasks.dll"
    TaskName="TransformXml"/>

<PropertyGroup>
    <!-- Path to input config file -->  
    <TransformInputFile>path to app.config</TransformInputFile>
    <!-- Path to the transformation file -->    
    <TransformFile>path to app.$(Configuration).config</TransformFile>
    <!-- Path to outptu web config file --> 
    <TransformOutputFile>path to output project.dll.config</TransformOutputFile>
</PropertyGroup>

<Target Name="transform">
    <TransformXml Source="$(TransformInputFile)"
                  Transform="$(TransformFile)"
                  Destination="$(TransformOutputFile)" />
</Target>

23voto

Romeo Points 2251

Vous pouvez essayer la méthode suivante:

  1. Cliquez-droit sur le projet dans l'Explorateur de solutions et sélectionnez Décharger le Projet.
  2. Le projet sera déchargé. Cliquez-droit sur le projet et sélectionnez Edit <YourProjectName>.csproj.
  3. Vous pouvez maintenant éditer le fichier de projet dans Visual Studio.
  4. Localiser l'endroit *.fichier csproj où votre fichier de configuration d'application est inclus. Il ressemblera à:
<ItemGroup>
 <Aucun Include="App.config"/>
</ItemGroup>
  1. Remplacer cette ligne:
 <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
 <Aucun Include="App.Debug.config"/>
</ItemGroup>

 <ItemGroup Condition=" '$(Configuration)' == 'Libération' ">
 <Aucun Include="App.La libération.config"/>
</ItemGroup>

Je n'ai pas essayé cette approche de l' app.config fichiers, mais il a bien fonctionné avec les autres éléments de projets Visual Studio. Vous pouvez personnaliser le processus de construction dans presque n'importe quelle manière que vous aimez. De toute façon, laissez-moi savoir la suite.

13voto

tem peru Points 11

Utilisant la même approche que Romeo, je me suis adapté à vs2010

  <None Condition=" '$(Configuration)' == 'Debug' " Include="appDebug\App.config" />

 <None Condition=" '$(Configuration)' == 'Release' " Include="appRelease\App.config" />
 

Ici, vous devez conserver les deux appconfig dans des répertoires différents appDebug et appRelease que j'ai testés et cela fonctionne bien! Ragards

12voto

Daniel Dyson Points 9913

Vous devriez envisager de ConfigGen. Il a été développé à cet effet. Il produit un fichier de config pour chaque machine de déploiement, basé sur un modèle de fichier et un fichier de paramètres. Je sais que ce n'est pas la réponse à votre question précisément, mais il se pourrait bien répondre à votre problème.

Donc, plutôt que de Debug, Release, etc, vous pourriez avoir de Test, UAT, Production, etc. Vous pouvez aussi avoir des paramètres différents pour chaque développeur de la machine, de sorte que vous pouvez générer une configuration spécifique à votre machine de dev et de le modifier sans affecter un autre déploiement.

Un exemple d'utilisation peut être...

<Target Name="BeforeBuild">
    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t       
        $(ProjectDir)App.config.template.xml -o $(SolutionDir)ConfigGen" />

    <Exec Command="C:\Tools\cfg -s $(ProjectDir)App.Config.Settings.xls -t
        $(ProjectDir)App.config.template.xml -l -n $(ProjectDir)App.config" />
</Target>

Si vous placez ceci dans votre .fichier csproj, et vous avez les fichiers suivants...

$(ProjectDir)App.Config.Settings.xls

MachineName        ConfigFilePath   SQLServer        

default             App.config      DEVSQL005
Test                App.config      TESTSQL005
UAT                 App.config      UATSQL005
Production          App.config      PRODSQL005
YourLocalMachine    App.config      ./SQLEXPRESS


$(ProjectDir)App.config.template.xml 

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=[%SQLServer%]; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

... puis ce sera le résultat...

À partir de la première commande, un fichier de configuration généré pour chaque environnement spécifié dans le fichier xls, placé dans le répertoire de sortie $(SolutionDir)ConfigGen

.../solutiondir/ConfigGen/Production/App.config

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
   <configuration>
   <appSettings>
       <add key="ConnectionString" value="Data Source=PRODSQL005; 
           Database=DatabaseName; Trusted_Connection=True"/>
   </appSettings>
</configuration>

À partir de la deuxième commande, le local de l'Application.config utilisée sur votre machine de dev, sera remplacé par le générés config spécifié par le local (-l) de l'interrupteur et le nom de fichier (-n) de l'interrupteur.

3voto

Ludwo Points 3166

J'utilise l'outil XmlPreprocess pour la manipulation des fichiers de configuration. Il utilise un fichier de mappage pour plusieurs environnements (ou plusieurs cibles de construction dans votre cas). Vous pouvez modifier le fichier de mappage par Excel. C'est très facile à utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X