Как преобразовать конфигурацию log4net как web.config? - PullRequest
13 голосов
/ 06 апреля 2011

Из моего файла .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>  

Внизу моего файла .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>

Из log4net.config

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

Из log4net.Live.config (удалены конфиденциальные данные)

<?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>

Я проверил вывод msbuild и вижучто он преобразовал мой web.config правильно, но я не вижу выходных данных для его преобразования log4net.Кроме того, когда я проверяю файл log4net.config после публикации, он имеет исходную строку подключения.

Что я делаю не так:)?

Спасибо!

Обновление

У меня были некоторые ошибки в коде msbuildвыводили как предупреждения, которые я не видел.Я исправил их, и теперь я получаю некоторые выходные данные из MSBuild:

AfterCompile: Преобразование исходного файла: log4net.config Применение файла преобразования: log4net.Live.config Выходной файл: obj \ Live \ Common.UI.Web.dll.config
Преобразование выполнено успешно

Это все еще проблема, поскольку файл должен называться log4net.config, а не Common.UI.Web.dll.config ...

По любой причине

$ (TargetFileName)

принимает имя файла .csproj.Если я заменю его просто на log4net, то он выдает правильно

Обновление

Файл застрял в папке obj и не поднимается при публикации.

Ответы [ 6 ]

15 голосов
/ 14 мая 2011

ОБНОВЛЕНО: для Visual Studio 2012 (эти обновления также работают в VS2010)

После попыток многих различных решений я покопался в том, как происходят преобразования web.Config ... Вот что я считаю самым элегантным решением.

Прежде всего исключите ваши файлы log4net.config из вашего проекта, если вы действительно не понимаете XML проекта, в результате вы можете получить очень запутанную дублирующую ссылку.НЕ удаляйте файлы, просто исключите их (мы будем включать их через редактор проекта).

Теперь выгрузите ваш проект, а затем отредактируйте его ... или, если хотите, перейдите в proj xml.Убедитесь, что у вас есть узел, импортирующий Microsoft.WebApplication.targets.Если вы находитесь в веб-проекте, он может быть добавлен для вас ... искать этот узел

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

После того, как у вас есть этот узел, вам нужно только добавить узел 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>

Я включил зависимые файлы в ItemGroup, хотя в этом нет необходимости, но все это вместе.Обратите внимание, что вы не создали новую задачу или цель, теперь преобразование обрабатывается ТОЧНО, как преобразования web.config.

7 голосов
/ 23 августа 2011

Сотрудник Microsoft в свободное время добавил возможность делать это для всех файлов сейчас, как вы могли бы с web.config, в расширении под названием SlowCheetah. Посмотрите обзор SlowCheetah Xml Transform и расширение vsi .

2 голосов
/ 11 апреля 2011

Завершено с помощью http://mint.litemedia.se/2010/01/29/transforming-an-app-config-file/ как для конфигурации приложения, так и для конфигурации log4net. Работает очень хорошо.

Для конфигурации log4net добавьте это в 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 голосов
/ 06 апреля 2011

Я использовал следующую статью для настройки этого типа

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

это было наиболее полезно для меня

1 голос
/ 08 мая 2014

Для меня это решение работало лучше всего (VS2013):

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

Если у вас есть другие свойства, кроме $ (конфигурация), вы можете использовать то, что вам нужно. Мы используем publishprofiles и используем эту команду msbuild в нашей сборке CI

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

в этом случае просто замените $ (Configuration) на $ (PublishProfile)

0 голосов
/ 05 июня 2017

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

  <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...