Question App.Config Transformation pour les projets qui ne sont pas des projets Web dans Visual Studio 2010?


Pour l'application Web Visual Studio 2010, nous disposons de fonctionnalités de transformation de configuration permettant de gérer plusieurs fichiers de configuration pour différents environnements. Mais la même fonctionnalité n'est pas disponible pour les fichiers App.Config pour Windows Services / WinForms ou l'application console.

Une solution de contournement est disponible, comme suggéré ici: Appliquer la magie XDT à App.Config.

Cependant, ce n'est pas simple et nécessite un certain nombre d'étapes. Existe-t-il un moyen plus facile d'obtenir la même chose pour les fichiers app.config?


485
2018-06-09 08:38


origine


Réponses:


Cela fonctionne maintenant avec le Visual Studio AddIn traité dans cet article: SlowCheetah - Syntaxe de transformation Web.config maintenant généralisée pour tout fichier de configuration XML.

Vous pouvez faire un clic droit sur votre web.config et cliquer sur "Ajouter une configuration"   Transforme. "Quand vous faites cela, vous aurez un web.debug.config et un   web.release.config. Vous pouvez créer un web.whatever.config si vous le souhaitez, comme   tant que le nom s'aligne avec un profil de configuration. Ces fichiers   sont juste les changements que vous voulez faire, pas une copie complète de votre   web.config.

Vous pourriez penser que vous souhaitez utiliser XSLT pour transformer un fichier web.config, mais   alors qu'ils se sentent intuitivement bien, c'est en fait très verbeux.

Voici deux transformations, une utilisant XSLT et la même utilisant le XML   Syntaxe / espace de noms de transformation de document. Comme avec toutes les choses il y a   de multiples façons de le faire, mais vous avez l’idée générale. XSLT   est un langage de transformation d'arbre généralisé, alors que ce déploiement   l'un est optimisé pour un sous-ensemble spécifique de scénarios courants. Mais le   la partie cool est que chaque transformation XDT est un plugin .NET, de sorte que vous pouvez faire   le tien.

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
  <xsl:copy>           
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/configuration/appSettings">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    <xsl:element name="add">
      <xsl:attribute name="key">NewSetting</xsl:attribute>
      <xsl:attribute name="value">New Setting Value</xsl:attribute>
    </xsl:element>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Ou la même chose via la transformation de déploiement:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
   <appSettings>
      <add name="NewSetting" value="New Setting Value" xdt:Transform="Insert"/>
   </appSettings>
</configuration>

392
2017-08-25 18:15



J'ai essayé plusieurs solutions et voici la plus simple que j'ai personnellement trouvée.
Dan souligné dans les commentaires que le message original appartient à Oleg Sych-merci, Oleg!

Voici les instructions:

1. Ajoutez un fichier XML pour chaque configuration au projet.

Typiquement, vous aurez Debug et Release configurations pour nommer vos fichiers App.Debug.config et App.Release.config. Dans mon projet, j'ai créé une configuration pour chaque type d'environnement, vous pouvez donc essayer de le faire.

2. Déchargez le projet et ouvrez le fichier .csproj pour le modifier

Visual Studio vous permet de modifier .csproj fichiers directement dans l'éditeur - il vous suffit de décharger le projet en premier. Ensuite, faites un clic droit dessus et sélectionnez Modifier <NomProjet> .csproj.

3. Liez App. *. Fichiers de configuration à App.config principal

Recherchez la section du fichier de projet qui contient tous App.config et App.*.config les références. Vous remarquerez que leurs actions de construction sont définies sur None:

<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />

Tout d'abord, définissez l'action de construction pour tous à Content.
Ensuite, faites tout spécifique à la configuration des dossiers dépendant sur la principale App.config Visual Studio les regroupe donc comme il le fait pour les fichiers de concepteur et de code-behind.

Remplacez XML ci-dessus par celui ci-dessous:

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

4. Activer la magie des transformations

À la fin du fichier après

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

et avant la finale

</Project>

insérez le code XML suivant:

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!-- Force build process to use the transformed configuration file from now on. -->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="app.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>

Vous pouvez maintenant recharger le projet, le construire et profiter App.config transformations!

FYI

Assurez-vous que votre App.*.config les fichiers ont la bonne configuration comme ceci:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
     <!--magic transformations here-->
</configuration>

491
2018-02-24 19:36



Une autre solution que j'ai trouvée est de ne pas utiliser les transformations mais juste d'avoir un fichier de configuration séparé, par ex. app.Release.config. Ensuite, ajoutez cette ligne à votre fichier csproj.

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <AppConfig>App.Release.config</AppConfig>
  </PropertyGroup>

Cela générera non seulement le bon fichier myprogram.exe.config, mais si vous utilisez le projet d'installation et de déploiement dans Visual Studio pour générer MSI, il forcera le projet de déploiement à utiliser le fichier de configuration correct lors de l'empaquetage.


116
2017-10-18 18:12



Dans mon expérience, les choses que je dois faire spécifiques à l'environnement sont des choses comme les chaînes de connexion, les paramètres d'applications et les paramètres souvent smpt. Le système de configuration permet de spécifier ces éléments dans des fichiers séparés. Vous pouvez donc l'utiliser dans votre app.config / web.config:

 <appSettings configSource="appsettings.config" />
 <connectionStrings configSource="connection.config" />
 <system.net>
    <mailSettings>
       <smtp configSource="smtp.config"/>
    </mailSettings>
 </system.net>

Ce que je fais généralement est de mettre ces sections spécifiques à la configuration dans des fichiers séparés, dans un sous-dossier appelé ConfigFiles (dans la racine de la solution ou au niveau du projet, dépend). Je définis un fichier par configuration, par ex. smtp.config.Debug et smtp.config.Release.

Ensuite, vous pouvez définir un événement de pré-construction comme suit:

copy $(ProjectDir)ConfigFiles\smtp.config.$(ConfigurationName) $(TargetDir)smtp.config

Dans le développement d'une équipe, vous pouvez améliorer ce paramètre en incluant les paramètres% COMPUTERNAME% et / ou% USERNAME% dans la convention.

Bien sûr, cela implique que les fichiers cibles (x.config) ne doivent PAS être placés dans le contrôle de la source (puisqu'ils sont générés). Vous devez toujours les ajouter au fichier de projet et définir leur propriété de type de sortie sur 'copy always' ou 'copy if newer'.

Simple, extensible, il fonctionne pour tous les types de projets Visual Studio (console, winforms, wpf, web).


31
2018-02-12 10:08



Vous pouvez utiliser un fichier de configuration distinct par configuration, par ex. app.Debug.config, app.Release.config, puis utilisez la variable de configuration dans votre fichier de projet:

<PropertyGroup>
    <AppConfig>App.$(Configuration).config</AppConfig>
</PropertyGroup>

Cela créera ensuite le fichier ProjectName.exe.config correct en fonction de la configuration que vous construisez.


25
2017-07-02 09:32



Inspiré par Oleg et d'autres dans cette question, j'ai pris la solution https://stackoverflow.com/a/5109530/2286801 une étape supplémentaire pour permettre les opérations suivantes.

  • Fonctionne avec ClickOnce
  • Fonctionne avec les projets d'installation et de déploiement dans VS 2010
  • Fonctionne avec VS2010, 2013, 2015 (n'a pas testé 2012 mais devrait fonctionner aussi bien).
  • Fonctionne avec Team Build. (Vous devez installer A) Visual Studio ou B) Microsoft.Web.Publishing.targets et Microsoft.Web.Publishing.Tasks.dll)

Cette solution fonctionne en effectuant la transformation app.config avant que le fichier app.config soit référencé pour la première fois dans le processus MSBuild. Il utilise un fichier de cibles externes pour faciliter la gestion de plusieurs projets.

Instructions:

Des étapes similaires à l'autre solution. J'ai cité ce qui reste le même et l'ai inclus pour l'exhaustivité et la comparaison plus facile.

0. Ajoutez un nouveau fichier à votre projet appelé AppConfigTransformation.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Transform the app config per project configuration.-->
  <PropertyGroup>
    <!-- This ensures compatibility across multiple versions of Visual Studio when using a solution file.
         However, when using MSBuild directly you may need to override this property to 11.0 or 12.0 
         accordingly as part of the MSBuild script, ie /p:VisualStudioVersion=11.0;
         See http://blogs.msdn.com/b/webdev/archive/2012/08/22/visual-studio-project-compatability-and-visualstudioversion.aspx -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
  </PropertyGroup>

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />

  <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" 
          Condition="exists('app.$(Configuration).config')">
    <PropertyGroup>
      <!-- Force build process to use the transformed configuration file from now on. -->
      <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
    </PropertyGroup>
    <Message Text="AppConfig transformation destination: = $(AppConfig)" />
  </Target>

  <!-- Transform the app.config after the prepare for build completes. -->
  <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <TransformXml Source="app.config" Destination="$(AppConfig)" Transform="app.$(Configuration).config" />
  </Target>

</Project>

1. Ajoutez un fichier XML pour chaque configuration au projet.

En règle générale, vous aurez des configurations de débogage et de version, nommez donc vos fichiers App.Debug.config et App.Release.config. Dans mon projet, j'ai créé une configuration pour chaque type d’enironnement.

2. Déchargez le projet et ouvrez le fichier .csproj pour le modifier

Visual Studio vous permet d'éditer le fichier .csproj directement dans l'éditeur, il vous suffit de décharger le projet en premier. Ensuite, faites un clic droit dessus et sélectionnez Modifier .csproj.

3. Liez App. *. Fichiers de configuration à App.config principal

Recherchez la section du fichier projet qui contient toutes les références App.config et App. *. Config et remplacez-les comme suit. Vous remarquerez que nous utilisons None au lieu de Content.

<ItemGroup>
  <None Include="app.config"/>
  <None Include="app.Production.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.QA.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
  <None Include="app.Development.config">
    <DependentUpon>app.config</DependentUpon>
  </None>
</ItemGroup>

4. Activer la magie des transformations

À la fin du fichier après

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

et avant la finale

</Project>

insérez le code XML suivant:

<Import Project="AppConfigTransformation.targets" />

Terminé!


20
2017-10-01 23:23



J'ai écrit une belle extension pour automatiser la transformation app.config comme celle du projet d'application Web intégré Transformation de configuration

Le plus grand avantage de cette extension est que vous n'avez pas besoin de l'installer sur toutes les machines de construction


12
2018-05-27 07:59



Je suis tombé sur l'article suivant qui semble un peu plus simple mais je ne l'ai pas essayé moi-même.

http://fknut.blogspot.com/2009/11/appconfig-transformation-with-new.html

En outre, il existe une demande de fonctionnalité sur MS Connect qui peut être utile de voter afin que cela soit inclus dans le prochain SP ou version.

https://connect.microsoft.com/VisualStudio/feedback/details/564414


5
2018-06-14 10:56



Je résous ce problème avec cet outil http://ctt.codeplex.com/. Je l'utilise avec le script CCNet / nAnt pour faire des paquets.


3
2017-08-26 20:19



Juste un peu d'amélioration à la solution qui semble être postée partout maintenant:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  • c'est-à-dire, sauf si vous envisagez de rester avec votre version VS actuelle pour toujours

3
2017-08-06 08:34