Question Comment transformer la configuration log4net comme web.config?


De mon fichier .csproj:

<Content Include="log4net.config">
  <SubType>Designer</SubType>
</Content>
<Content Include="log4net.Release.config">
  <DependentUpon>log4net.config</DependentUpon>
</Content>
<Content Include="log4net.Debug.config">
  <DependentUpon>log4net.config</DependentUpon>
</Content>
<Content Include="log4net.Live.config">
  <DependentUpon>log4net.config</DependentUpon>   
</Content>
<Content Include="log4net.Demo.config">
  <DependentUpon>log4net.config</DependentUpon>   
</Content>  

Au bas de mon fichier .csproj:

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
    <Target Name="AfterCompile" Condition="exists('log4net.$(Configuration).config')">
      <TransformXml Source="log4net.config"
        Destination="$(IntermediateOutputPath)$(TargetFileName).config"
        Transform="log4net.$(Configuration).config" />
      <ItemGroup>
        <AppConfigWithTargetPath Remove="log4net.config"/>
        <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
          <TargetPath>$(TargetFileName).config</TargetPath>
        </AppConfigWithTargetPath>
      </ItemGroup>
    </Target>

De log4net.config

<connectionString name="ConnName" 
value="Data Source=localhost\sqlexpress;Initial Catalog=localdb;Persist Security Info=True;Integrated Security=SSPI;" />

De log4net.Live.config (données sensibles supprimées)

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <connectionString name="ConnName" value="Data Source=127.0.0.1;Initial Catalog=DBName;Persist Security Info=True;User ID=userid;Password=pword"
        providerName="System.Data.SqlClient" xdt:Transform="Replace" xdt:Locator="Match(name)" />
</configuration>

J'ai vérifié la sortie de msbuild et je vois qu'il a transformé mon web.config correctement, mais je ne vois aucune sortie pour la transformation de log4net. De plus, lorsque je vérifie le fichier log4net.config après la publication, il contient la chaîne de connexion d'origine.

Qu'est-ce que je fais mal :)?

Merci!

Mettre à jour

J'ai eu quelques erreurs dans le code que msbuild produisaient comme des avertissements que je ne voyais pas. J'ai corrigé ceux-ci et maintenant je reçois des résultats de MSBuild:

AfterCompile: Transforming Source   Fichier: log4net.config       Application du fichier de transformation: log4net.Live.config       Fichier de sortie: obj \ Live \ Common.UI.Web.dll.config
  Transformation réussie

C'est toujours un problème, car le fichier doit s'appeler log4net.config, pas Common.UI.Web.dll.config ...

Pour quelque raison que ce soit

$ (TargetFileName)

prend le nom du fichier .csproj. Si je le remplace avec seulement log4net, alors il sort correctement

Mettre à jour

Le fichier est bloqué dans le dossier obj et n'est pas capté lors de la publication.


12
2018-04-05 20:10


origine


Réponses:


MISE À JOUR: pour Visual Studio 2012 (ces mises à jour fonctionnent également dans VS2010)

Après avoir essayé de nombreuses solutions différentes, je me suis penché sur la façon dont les transformations web.Config se produisent ... Voici ce que je trouve la solution la plus élégante.

Tout d'abord, excluez vos fichiers log4net.config de votre projet, à moins que vous ne compreniez vraiment le XML du projet, vous pourriez vous retrouver avec une référence en double très confuse. Ne supprimez PAS les fichiers en les excluant (nous les inclurons via l'éditeur de projet).

Maintenant, déchargez votre projet, puis éditez-le ... ou si vous choisissez d'accéder au proj xml. Assurez-vous d'avoir un nœud important Microsoft.WebApplication.targets. Si vous êtes dans un projet Web, il peut avoir été ajouté pour vous ... recherchez ce noeud

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

Une fois que vous avez ce nœud, il vous suffit d'ajouter un nœud ItemGroup ...

<ItemGroup>
  <WebConfigsToTransform Include="log4net.config">
    <DestinationRelativePath>log4net.config</DestinationRelativePath>
    <Exclude>False</Exclude>
    <TransformFileFolder>$(TransformWebConfigIntermediateLocation)\original</TransformFileFolder>
    <TransformFile>log4net.$(Configuration).config</TransformFile>
    <TransformOriginalFolder>$(TransformWebConfigIntermediateLocation)\original</TransformOriginalFolder>
    <TransformOriginalFile>$(TransformWebConfigIntermediateLocation)\original\%(DestinationRelativePath)</TransformOriginalFile>
    <TransformOutputFile>$(TransformWebConfigIntermediateLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile>
    <TransformScope>$(_PackageTempDir)\%(DestinationRelativePath)</TransformScope>
    <SubType>Designer</SubType>
  </WebConfigsToTransform>
  <None Include="log4net.Debug.config">
    <DependentUpon>log4net.config</DependentUpon>
  </None>
  <None Include="log4net.Release.config">
    <DependentUpon>log4net.config</DependentUpon>
  </None>
</ItemGroup>

J'ai inclus les fichiers dépendants dans ItemGroup, bien que ce ne soit pas nécessaire, mais cela permet de garder les choses ensemble. Notez que vous n'avez pas créé de nouvelle tâche ou cible, la transformation est désormais gérée EXACTEMENT comme les transformations web.config.


15
2018-05-13 22:01



Un employé Microsoft sur son temps libre a ajouté la possibilité de le faire pour tous les fichiers maintenant, comme vous pouvez le faire avec web.config, dans une extension appelée SlowCheetah. Consultez la revue SlowCheetah Xml Transform et le téléchargement de l'extension vsi.


7
2017-08-23 16:56



J'ai utilisé l'article suivant pour faire ce type de configuration

http://geekswithblogs.net/EltonStoneman/archive/2010/08/20/using-msbuild-4.0-web.config-transformation-to-generate-any-config-file.aspx

c'était très utile pour moi


2
2018-04-05 20:22



Terminé en utilisant http://mint.litemedia.se/2010/01/29/transforming-an-app-config-file/ pour la configuration de l'application et la configuration log4net. Fonctionne très bien.

Pour la configuration log4net, ajoutez ceci à csproj:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Target Name="ApplyConfiguration" Condition="Exists('log4net.$(Configuration).config')">  
       <XslTransformation XmlInputPaths="log4net.config" XslInputPath="log4net.$(Configuration).config" OutputPaths="log4net.config_output" />  
       <Copy SourceFiles="log4net.config_output" DestinationFiles="log4net.config" />  
   </Target>  
   <Target Name="BeforeBuild">  
       <CallTarget Targets="ApplyConfiguration"/>  
   </Target> 

2
2018-04-11 15:30



Pour moi, cette solution fonctionnait mieux (VS2013):

  <Target Name="ApplyLoggingConfiguration" BeforeTargets="BeforeBuild" Condition="Exists('log4net.$(Configuration).config')">
    <TransformXml Source="log4net.config" Transform="log4net.$(Configuration).config" Destination="log4net.config" />
  </Target>

Si vous avez d'autres propriétés que $ (Configuration), vous êtes libre d'utiliser ce dont vous avez besoin. Nous utilisons publishprofiles et utilisons cette commande msbuild dans notre build CI

msbuild ConfigTransform.sln /p:DeployOnBuild=true;PublishProfile=Test;Configuration=Release

dans ce cas, remplacez simplement $ (Configuration) par $ (PublishProfile)


1
2018-05-08 18:19



La réponse de ms007 m'a presque amené là-bas bien que je recevais un problème d'accès refusé sur le fichier car le serveur de compilation l'avait configuré en lecture seule. Voici ma solution

  <Target Name="ApplyLoggingConfiguration" BeforeTargets="BeforeBuild" Condition="Exists('log4net.$(Configuration).config')">

    <TransformXml Source="log4net.config"
                  Transform="log4net.$(Configuration).config"
                  Destination="temp_log4net.config" />
    <Copy SourceFiles="temp_log4net.config"
          DestinationFiles="log4net.config"
          OverwriteReadOnlyFiles="True" />

    <Delete Files="temp_log4net.config" />
  </Target>

0
2018-06-05 12:00