Преобразование включенных файлов конфигурации с помощью configSource

Этот вопрос состоит из двух частей. В VS2015 мой проект MVC имеет несколько различных конфигураций сборки: Test, UAT, Live и т. д. С моим web.config я могу просто щелкнуть его правой кнопкой мыши и выбрать Add Config Transform, чтобы создать файлы преобразования для каждой конфигурации сборки.

Если у меня есть внешний файл конфигурации, такой как Log4Net.config, как я могу настроить его для зависимых преобразований, таких как web.config? Это делается вручную путем редактирования файла project.csproj?

Во-вторых, у меня есть файл web.config таким образом:

<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, Log4net" />
    </configSections>

    ...

    <log4net configSource="Log4Net.config" />
</configuration>

Когда я создаю проект, web.config автоматически преобразуется с помощью следующей цели AfterBuild в файле project.csproj:

<Target Name="AfterBuild">
    <TransformXml Source="Web.config"
            Transform="Web.$(Configuration).config"
            Destination="$(OutputPath)\$(AssemblyName).config" />
</Target>

Как я могу преобразовать включенный файл Log4Net.config, используя то же преобразование конфигурации? Я понимаю, что я мог бы поместить еще один TransformXml в цель AfterBuild, но это правильный способ сделать это преобразование, или я что-то упустил?


person MrDeveloper    schedule 10.07.2015    source источник
comment
У меня такая же проблема. Вам удалось ее решить?   -  person Matias Cicero    schedule 20.10.2015
comment
@MatiasCicero Я решил это, используя дополнительный TransformXml в цели AfterBuild. Я изложил это в ответе ниже. ХТН.   -  person MrDeveloper    schedule 21.10.2015


Ответы (1)


Я выбрал решение с использованием базового файла Log4Net.config, файла Log4Net.XXX.config для каждой конфигурации сборки и дополнительной задачи TransformXml в цели AfterBuild:

  • Log4Net.config
  • Log4Net.Debug.config
  • Log4Net.Release.config
  • Log4Net.Test.config
  • Log4Net.UAT.config

Файл project.csproj теперь выглядит так:

<Content Include="Log4Net.config">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Include="Log4Net.Debug.config">
  <DependentUpon>Log4Net.config</DependentUpon>
</None>
<None Include="Log4Net.Release.config">
  <DependentUpon>Log4Net.config</DependentUpon>
</None>
<None Include="Log4Net.Test.config">
  <DependentUpon>Log4Net.config</DependentUpon>
</None>
<None Include="Log4Net.UAT.config">
  <DependentUpon>Log4Net.config</DependentUpon>
</None>

....

<Target Name="AfterBuild">
   <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="$(OutputPath)\$(AssemblyName).config" />
   <TransformXml Source="Log4Net.config" Transform="Log4Net.$(Configuration).config" Destination="$(OutputPath)\Log4Net.config" />
</Target>

И пример Log4Net.Test.config выглядит так (я использую преобразование для изменения строк подключения и уровня ведения журнала Log4Net):

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

<log4net  xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <appender>
        <connectionString
            value="Data Source=example.com;Initial Catalog=ExampleLogs;User ID=xxx;Password=xxx"
            xdt:Transform="Replace" />
    </appender>

    <root>
        <level
            value="DEBUG"
            xdt:Transform="Replace" />
    </root>
</log4net>

Это успешно преобразует файл Log4Net.config в выходной путь. Он использует тот же подход, что и преобразование web.config файлов, и поэтому должен быть легко понятен любому другому разработчику, который возьмется за проект.

Хотя это работает и уже некоторое время находится в производстве, я все еще ищу какое-то подтверждение того, что это правильный способ преобразования включенных файлов конфигурации.

person MrDeveloper    schedule 21.10.2015