Как я могу применить преобразования конфигурации к EntLib.config? - PullRequest
1 голос
/ 24 марта 2011

У меня был большой проект Silverlight с громоздким web.config, в котором использовались преобразования для файлов web.debug.config, web.uat.config и web.release.config.

У меня естьне разделил мою конфигурацию EntLib на EntLib.config, с соответствующими файлами EntLib.debug.config, EntLib.uat.config и EntLib.release.config.Я отредактировал файл .csproj и использовал DependentUpon, чтобы файлы были вложены в EntLib.config.Теперь я пытаюсь заставить VS2010 применить преобразования, когда я использую опцию меню Publish ... для публикации файлов прямо на тестовом сервере.

Я пытался применить this , как показано ниже, но это не похоже на работу.Я вижу преобразованный файл EntLib.config в obj \ $ (Configuration) \ TransformWebConfig \ transformed, но он не развернут.Я также попытался использовать Project> Build Deployment Package, который я затем запустил на другом компьютере.Оба оставляют мне EntLib.config в его оригинальной форме плюс каждый файл EntLib. ($ Configuration) .config вместе с ним.Должно ли это работать?Буду признателен за любую помощь, которую может предложить любой.

<PropertyGroup>
    <ConfigFileName>EntLib.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);&#xD;&#xA;                         Configuration=$(Configuration);                        &#xD;&#xA;                         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>

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Я использую T4 и TextTransform.exe , чтобы создавать различные конфигурации на основе конфигурации сборки.Вы можете посмотреть мои фрагменты для app.config, но тот же метод может быть применен для web.config.

1) Структура проекта

ProjectDir
  App_Config 
    Configuration.tt     // template for all configs
    Debug.App.tt         // settings for Debug
    Release.App.tt       // settings for Release
    ProductDeploy.App.tt // settings for deploy
  App.config             // autogenerated. Ignored in SVN
  project.csproj          

2) Модификация project.csproj позволяет иметь актуальную конфигурацию для указанной Платформы / Конфигурации.

  <PropertyGroup>
    <T4Template>$(ProjectDir)\App_Config\$(Configuration).App.tt</T4Template>
    <T4CommonTemplate>$(ProjectDir)\App_Config\Configuration.tt</T4CommonTemplate>
    <T4Config>$(ProjectDir)\App.config</T4Config>
    <T4LastConfiguration>$(BaseIntermediateOutputPath)\$(Configuration).t4lastbuild</T4LastConfiguration>
  </PropertyGroup>
  <Target Name="BeforeBuild" DependsOnTargets="ExecuteT4Templates" />
  <Target Name="ExecuteT4Templates"     Inputs="$(T4Template);$(T4CommonTemplate);$(T4LastConfiguration)" Outputs="$(T4Config)">
    <MakeDir Directories="$(BaseIntermediateOutputPath)" Condition="!Exists('$(BaseIntermediateOutputPath)')" />
    <ItemGroup>
      <T4ConfigFlags Include="$(BaseIntermediateOutputPath)\*.t4lastbuild" />
    </ItemGroup>
    <Delete Files="@(T4ConfigFlags)" />
    <WriteLinesToFile File="$(T4LastConfiguration)" Lines="T4 Succeeded" Overwrite="true" />
    <Exec Command="TextTransform &quot;$(T4Template)&quot; -out &quot;$(T4Config)&quot;" WorkingDirectory="C:\Program Files\Common Files\microsoft shared\TextTemplating\1.2\" />
  </Target>
  <Target Name="AfterClean">
    <ItemGroup>
      <T4ConfigFlags Include="$(BaseIntermediateOutputPath)\*.t4lastbuild" />
    </ItemGroup>
    <Delete Files="@(T4ConfigFlags)" />
  </Target>

3) Configuration.tt пример

<#@ template language="C#"#>
<#@ output extension= ".config"#>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
        <add name = "NameSpace.Properties.Settings.SomeConnectionString"
         connectionString = "<#= this.SomeConnectionString #>"
         providerName     = "System.Data.SqlClient" />    
  </connectionStrings>

  <applicationSettings>
    <NameSpace.Properties.Settings>
            <setting name="DefAppSetting" serializeAs="String">
                <value><#= this.DefAppSetting #></value>
            </setting>          
        </NameSpace.Properties.Settings>    
  </applicationSettings>
</configuration>

<#+
  string SomeConnectionString = "default SomeConnectionString";
  string DefAppSetting = "some_value";
#>

4) Debug.App.tt образец

<#
  SomeConnectionString = "Data Source=.;Initial Catalog=SomeDB;Integrated Security=True";  
  DefAppSetting = "debug_some_value";  
#>
<#@ include file="Configuration.tt" #>
0 голосов
/ 19 марта 2012

Я решил эту проблему, используя эту статью: Преобразования XML-документов (XDT) для любого XML-файла в вашем проекте , автор Вишал Джоши, и опубликовал подробности здесь: Как применить преобразования к EntLib.config .

Мое собственное решение последовало за предложением Вишала сохранить файл целей XDT в проекте, чтобы он сохранялся в системе контроля версий и был доступен всем, а не сохранялся локально на машине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...