Как преобразовать конфигурацию log4net, такую как web.config?
Из моего файла .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 и не публикуется при публикации.
Ответы
Ответ 1
Закончено с помощью 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
ОБНОВЛЕНО: для Visual Studio 2012 (эти обновления также работают в VS2010)
После попытки множества различных решений я вникнул в то, как происходят преобразования web.Config... Вот что я нахожу самым элегантным решением.
Во-первых, исключите файлы log4net.config из своего проекта, если вы действительно не понимаете XML-проект, вы можете столкнуться с очень запутанной дублирующей ссылкой. НЕ удаляйте файлы, просто исключите их (мы будем включать их через редактор проекта).
Теперь выгрузите проект, а затем отредактируйте его... или, тем не менее, вы решите перейти на прогл xml. Убедитесь, что у вас есть node импорт Microsoft.WebApplication.targets. Если вы находитесь в веб-проекте, возможно, он был добавлен для вас... найдите этот node
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
После этого node вам нужно только добавить ItemGroup node...
<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.
Ответ 3
Сотрудник Microsoft в свободное время добавил возможность сделать это для всех файлов теперь, как вы могли с web.config
, в расширении, называемом SlowCheetah. Ознакомьтесь с обзором SlowCheetah Xml Transform и скачать расширение vsi.
Ответ 4
Я использовал следующую статью для этого типа конфигурации
http://geekswithblogs.net/EltonStoneman/archive/2010/08/20/using-msbuild-4.0-web.config-transformation-to-generate-any-config-file.aspx
это было очень полезно для меня
Ответ 5
Для меня это решение работало лучше всего (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
в этом случае просто замените $(Конфигурация) на $(PublishProfile)
Ответ 6
Ответ на вопрос 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>