2010-05-11 4 views
10

He configurado algunas transformaciones de configuración en mi web.config para mis connectionStrings, etc. Pero he separado algunas áreas de mi web.config en archivos separados, por ejemplo, appSettings.config.¿Cómo se usa la nueva configuración de VS 2010 para transformarla y aplicarla a otros archivos .config?

¿Cómo puedo configurar Visual Studio y MSBuild para realizar transformaciones de configuración en estos archivos de configuración adicionales?

Ya he seguido el enfoque de web.config para relacionar los archivos dentro del archivo de proyecto de mi aplicación web, pero las transformaciones no se aplican automáticamente.

<ItemGroup> 
    <Content Include="appSettings.Debug.config"> 
     <DependentUpon>appSettings.config</DependentUpon> 
    </Content> 
</ItemGroup> 

Respuesta

11

Por defecto, el objetivo de la gestión de la transformación (TransformWebConfig) sólo funcionan en los web.config archivo.


Para hacer que funcione en su archivo appSettings.config tendrá que:

  • Establecer la Build Action de su archivo a Content
  • Llame al MSBuild objetivo TransformWebConfig con ProjectConfigFileName=appSettings.config y Configuration=$(Configuration).

Para llamar MSBuild TransformWebConfig objetivo para appSettings.config justo después de la transformación de web.config archivos, es necesario agregar esto al final de su archivo de proyecto:

<PropertyGroup> 
    <!-- Name of your custom config file --> 
    <ConfigFileName>appSettings.config</ConfigFileName> 
</PropertyGroup> 

<PropertyGroup> 
    <!-- 
     This property is used to handle circular dependency between 
     TransformWebConfig and our custom target TransformAppConfig 
    --> 
    <FirstRun Condition="$(FirstRun) == ''">true</FirstRun> 
</PropertyGroup> 

<!-- This target will be called one time after a call to TransformWebConfig --> 
<Target Name="TransformAppConfig" 
     AfterTargets="TransformWebConfig" 
     Condition="$(FirstRun) == 'true'"> 

    <MSBuild Projects="$(MSBuildProjectFile)" 
      Targets="TransformWebConfig" 
      Properties="ProjectConfigFileName=$(ConfigFileName); 
         Configuration=$(Configuration); 
         FirstRun=false"/> 
</Target> 

<!-- 
    This target will be called one time before PreAutoParameterizationWebConfigConnectionStrings 
    to add $(ConfigFileName) to autoparameterization step 
--> 
<Target Name="AddToAutoParameterizationStep" 
     BeforeTargets="PreAutoParameterizationWebConfigConnectionStrings"> 
    <ItemGroup> 
    <_WebConfigsToAutoParmeterizeCS Include="@(FilesForPackagingFromProject)" 
          Condition="('%(FilesForPackagingFromProject.Filename)%(FilesForPackagingFromProject.Extension)'=='$(ConfigFileName)') And !%(FilesForPackagingFromProject.Exclude)"> 
     <TransformOriginalFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\original\%(DestinationRelativePath)</TransformOriginalFile> 
     <TransformOutputFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile> 
     <TransformScope>$(_PackageTempDir)\%(DestinationRelativePath)</TransformScope> 
    </_WebConfigsToAutoParmeterizeCS> 
    <_WebConfigsToAutoParmeterizeCSOuputFiles Include="@(_WebConfigsToAutoParmeterizeCS->'%(TransformOutputFile)')"> 
    </_WebConfigsToAutoParmeterizeCSOuputFiles> 
    </ItemGroup> 
</Target> 
+1

Esto parece funcionar. Mi archivo appSettings.config se transforma, pero durante mi implementación, el archivo de configuración final no se coloca en la carpeta de salida. –

+0

He actualizado el código para usar BeforeTarget y AfterTarget en lugar de anular los destinos de TransformWebConfig dependson, y para gestionar el paso de autoparametización. Ahora su archivo de configuración personalizada debe estar en la carpeta de salida con web.config –

+1

También intenté con su solución. Al igual que @Wallace Breza, parece funcionar: puedo ver el archivo EntLib.config transformado en obj \ $ (Configuración) \ TransformWebConfig \ transformado, pero no se implementa. Intenté usar el enfoque (clic con el botón derecho en el proyecto)> Publicar ... (Método de publicación: sistema de archivos) y también usar Proyecto> Desarrollar paquete de implementación que luego ejecuté en otra máquina. Ambos me dejan con EntLib.config en su forma original más cada uno de los archivos EntLib. ($ Configuration) .config junto a él. – SGarratt

5

Algo que hace esto mucho más fácil, eche un vistazo al complemento SlowCheetah VS en ... visualstudiogallery

+0

¡Gracias Steve! Definitivamente estoy de acuerdo contigo. Mucho más fácil. Estaba buscando lo que sugirió exactamente. Gracias :) – curiousBoy

3

Aquí está el código que funciona para mí:

<PropertyGroup> 
    <!-- Name of your custom config file --> 
    <ConfigFileName>ConnectionStrings.config</ConfigFileName> 
    <ConfigTransformFileName>ConnectionStrings.$(Configuration).config</ConfigTransformFileName> 
    </PropertyGroup> 
    <PropertyGroup> 
    <!-- 
     This property is used to handle circular dependency between 
     TransformWebConfig and our custom target TransformAppConfig 
    --> 
    <FirstRun Condition="$(FirstRun) == ''">true</FirstRun> 
    </PropertyGroup> 
    <Target Name="AddConfigToTransform" AfterTargets="CollectWebConfigsToTransform"> 
    <ItemGroup> 
     <WebConfigsToTransform Include="@(FilesForPackagingFromProject)" Condition="'%(FilesForPackagingFromProject.Filename)%(FilesForPackagingFromProject.Extension)'=='$(ConfigFileName)'"> 
     <TransformFile>%(RelativeDir)$(ConfigTransformFileName)</TransformFile> 
     <TransformOriginalFile>$(TransformWebConfigIntermediateLocation)\original\%(DestinationRelativePath)</TransformOriginalFile> 
     <TransformOutputFile>$(TransformWebConfigIntermediateLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile> 
     <TransformScope>$([System.IO.Path]::GetFullPath($(_PackageTempDir)\%(DestinationRelativePath)))</TransformScope> 
     </WebConfigsToTransform> 
    </ItemGroup> 
    </Target> 
    <!-- 
    This target will be called one time before PreAutoParameterizationWebConfigConnectionStrings 
    to add $(ConfigFileName) to autoparameterization step 
--> 
    <Target Name="AddToAutoParameterizationStep" BeforeTargets="PreAutoParameterizationWebConfigConnectionStrings"> 
    <ItemGroup> 
     <_WebConfigsToAutoParmeterizeCS Include="@(FilesForPackagingFromProject)" Condition="('%(FilesForPackagingFromProject.Filename)%(FilesForPackagingFromProject.Extension)'=='$(ConfigFileName)') And !%(FilesForPackagingFromProject.Exclude)"> 
     <TransformOriginalFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\original\%(DestinationRelativePath)</TransformOriginalFile> 
     <TransformOutputFile>$(AutoParameterizationWebConfigConnectionStringsLocation)\transformed\%(DestinationRelativePath)</TransformOutputFile> 
     <TransformScope>$(_PackageTempDir)\%(DestinationRelativePath)</TransformScope> 
     </_WebConfigsToAutoParmeterizeCS> 
     <_WebConfigsToAutoParmeterizeCSOuputFiles Include="@(_WebConfigsToAutoParmeterizeCS->'%(TransformOutputFile)')"> 
     </_WebConfigsToAutoParmeterizeCSOuputFiles> 
    </ItemGroup> 
    </Target> 
Cuestiones relacionadas