Comment ajouter des transformations de configuration pour un fichier de configuration personnalisé dans Visual Studio?

le projet sur lequel je travaille implique la lecture de nombreux paramètres de service (url) à partir d'un fichier de configuration. Depuis la liste serait très grand, j'ai décidé de les garder dans un fichier de configuration personnalisé pour garder mon web.config propre et petit. J'ai inclus la section personnalisée pour mon site web ci-dessous:

<mySection configSource="myConfig.config" />

je travaille parfaitement bien.

mais le problème de la transformation apparaît lors du déploiement du projet dans différents environnements. J'ai trois web.config fichiers:

Web.config

Web.L'Uat.config

Web.Publier.config

alors que le Web de transformation.la configuration fonctionne, les transformations pour les fichiers de configuration personnalisés échouent lors du déploiement.

y a-t-il un moyen de transformer le fichier de configuration personnalisé pendant le déploiement?

16
demandé sur TejSoft 2016-01-12 06:31:26

3 réponses

Visual Studio ne transforme que le web.les fichiers de configuration par défaut.

si vous avez besoin d'un fichier de configuration personnalisé avec transformation pour les environnements DEV, UAT, PROD, etc, alors essayez

  1. utilisez des extensions personnalisées pour Visual Studio comme Slowcheeetah-XML transforme pour la fonctionnalité de prévisualisation de la transformation de la configuration.
  2. Ajouter pour le projet de Nuget SlowCheetah fournir une transformation intégrée.

Un peu peu de détails:

ajouter VS Extension SlowCheetah à partir des Extensions et des mises à jour Screen of Extensions and Updates

clic Droit sur votre maconfig.config et choisir Ajouter transorm: Screen of Extensions and Updates

à l'intérieur de chaque configuration définie insérez vos propres règles de transormation comme ceci:

<services xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <service name="WebApplication1.Services.Service2" xdt:Transform="Replace" xdt:Locator="Match(name)" >
    <endpoint address="http://localhost:57939/Services/DebugService" behaviorConfiguration="WebApplication1.Services.Service2AspNetAjaxBehavior"
      binding="webHttpBinding" contract="WebApplication1.Services.Service2" />
  </service>
</services>

j'Espère qu'il vous a été utile

17
répondu Michael 2018-10-05 16:19:40

J'ai utilisé SlowCheetah mais j'ai trouvé quelque chose qui je pense est plus élégant. Je dis juste à la construction de générer le .config en fonction de la configuration de construction.

avoir une application.Publier.config dans votre projet (ou beaucoup plus selon vos besoins de déploiement) vous avez juste besoin d'éditer le fichier du projet (le .csproj un, si vous programmez en C#). Trouver la fin de celui-ci, entre le dernier </ItemGroup> et </Project> et d'ajouter:

  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
  <Target Name="AfterBuild">
    <PropertyGroup>
      <OutputTypeName>$(OutputType)</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Library'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Module'">dll</OutputTypeName>
      <OutputTypeName Condition="'$(OutputTypeName)'=='Winexe'">exe</OutputTypeName>
    </PropertyGroup>
    <TransformXml Source="Config\app.config" Transform="Config\app.$(Configuration).config" Destination="$(OutputPath)$(AssemblyName).$(OutputTypeName).config" />
  </Target>
</Project>

enregistrer et recharger à partir de VisualStudio. Compilez en mode Release et vérifiez le dossier bin/Release sur votre <MyProject>.config fichier la transformation est terminée.

cet exemple s'applique aux fichiers exe et Dll et à toute version de VisualStudio car il inclut ce post aide

1
répondu Andoni Ripoll Jarauta 2018-05-24 09:57:41

je vais m'étendre un peu sur la réponse D'Andoni Ripoll Jarauta.

Nous avons été confrontés à un problème similaire. Je voulais tirer les ficelles de connexion du web.fichier de configuration pour limiter les conflits de fusion. Je voulais aussi créer une configuration" release " contenant des informations statiques lors de la publication.

...assez simple. Créer un fichier de configuration personnalisé, webdb.config, et de mettre à jour le site web.fichier de configuration.

Ex. Web.config

<connectionStrings configSource="WebDB.config"/>

wedbdb.config (xml version="1.0" est nécessaire pour la transformation)

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

ajouter ensuite des fichiers de transformation pour webdb.config

enter image description here

WebDB.Débogage.exemple de configuration:

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

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=localhost;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=localhost;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

WebDB.Publier.exemple de configuration:

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

<connectionStrings xdt:Transform="Replace" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <add name="PRRADDataContainer" connectionString="metadata=~/PRRADData.csdl|~/PRRADData.ssdl|~/PRRADData.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=prod_server;Initial Catalog=;User ID=;Password=;multipleactiveresultsets=True;App=EntityFramework';" providerName="System.Data.EntityClient" />
    <add name="MyConnectionString" connectionString="Data Source=prod_server;Initial Catalog=;Persist Security Info=True;User ID=;Password=;" providerName="System.Data.SqlClient" />
</connectionStrings>

ensuite, nous devons ajouter un événement après-construction. Ceci est créé en éditant simplement le fichier CSPROJ.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterBuild">
    <TransformXml Source="WebDB.config" Transform="WebDB.$(Configuration).config" Destination="WebDB.config" />
</Target>

maintenant, quand j'exécute localement, J'obtiens WebDB.Débogage.config et quand je publie mon code je dois juste m'assurer de sélectionner "Release" comme source de configuration. Dans les deux cas, la WebDB.fichier de configuration sera mis à jour avec le fichier correspondant lorsque vous générez.

NOTE: assurez-vous de configurer la webdb.config, webdb.débogage.config, et webdb.publier.config pour "Ne pas copier" pour le "Copier dans le Répertoire de Sortie" option.

Espérons que cette aide!

1
répondu spyder1329 2018-07-31 16:39:20