2010-05-11 7 views
10

Mam niektóre transformacje konfiguracji w moim web.config dla moich connectionStrings, itp. Ale oddzieliłem niektóre obszary mojego pliku web.config na osobne pliki, np. AppSettings.config.Jak używać nowej konfiguracji VS 2010 transformuje i stosuje je do innych plików .config?

Jak skonfigurować program Visual Studio i MSBuild do wykonywania przekształceń konfiguracji dla tych dodatkowych plików konfiguracyjnych?

Podążyłem już za podejściem pliku web.config, aby powiązać pliki w ramach pliku projektu aplikacji WWW, ale transformacje nie są automatycznie stosowane.

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

Odpowiedz

11

Domyślnie cel zarządzania transformację (TransformWebConfig) działa tylko na web.config pliku.


Aby pracować na pliku appSettings.config musisz:

  • Ustaw Build Action swojego pliku Content
  • Wywołać MSBuild kierować TransformWebConfig z ProjectConfigFileName=appSettings.config i Configuration=$(Configuration).

Aby wywołać MSBuild TransformWebConfig docelową appSettings.config tuż po transformacji web.config plików, trzeba dodać to na końcu pliku projektu:

<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

To wydaje się działać. Mój plik appSettings.config został przekształcony, ale podczas mojego wdrożenia ostateczny plik konfiguracyjny nie został umieszczony w folderze wyjściowym. –

+0

Zaktualizowałem kod, aby używał PrzedTarget i AfterTarget zamiast przesłonić cele zależne TransformWebConfig i obsłużyć krok autoparametryzacji. Teraz niestandardowy plik konfiguracyjny powinien znajdować się w folderze wyjściowym za pomocą pliku web.config –

+1

Próbowałem również Twojego rozwiązania. Podobnie jak w przypadku @Wallace Breza, wygląda na to, że działa: Widzę transformowany plik EntLib.config w obj \ $ (Configuration) \ TransformWebConfig \ transformed, ale nie jest on wdrożony. Próbowałem już za pomocą podejścia (kliknij prawym przyciskiem myszy na projekt)> Opublikuj ... (metoda publikowania: system plików), a także za pomocą polecenia Project> Build Deployment Package, który następnie uruchomiłem na innym komputerze. Oba zostawiają mnie z EntLib.config w oryginalnej formie plus każdy z plików EntLib. ($ Configuration) .config. – SGarratt

5

coś, co sprawia to dużo łatwiejsze, spójrz na dodatek VC SlowCheetah na ... visualstudiogallery

+0

Dziękuję Steve !!! Zdecydowanie się z tobą zgadzam. Dużo łatwiej. Szukałem tego, co dokładnie zasugerowałeś. Dzięki :) – curiousBoy

3

Oto kod, który działa dla mnie:

<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> 
Powiązane problemy