Как мне преобразовать Web.config с проектами веб-сайта Visual Studio?
Невозможно изменить конфигурацию сборки проектов Visual Studio 2010 (в отличие от веб-приложений Visual Studio) и изменить конструкцию сборки Конфигурация является ключевой частью включения преобразований Web.config(изменить конфигурацию на все, кроме Debug) невозможно.
Как мне преобразовать Web.config для работы с проектами веб-сайта Visual Studio 2010, если невозможно изменить конфигурацию сборки?
Ответы
Ответ 1
Я нашел довольно хорошее сообщение в блоге, описывающее решение для этого здесь:
http://andrewtwest.com/2010/02/25/using-web-config-transformations-in-web-site-projects/
Вкратце: создайте пустой проект (пока он не является другим проектом веб-сайта) в вашем решении, которое содержит веб-сайт. Пустой проект даст вам доступ к msbuild через файл проекта, который позволит вам выполнять преобразования на вашем веб-сайте web.config.
Ответ 2
Я бы предпочел не использовать все решение для веб-приложения Project из коробки.
Мое решение - использовать задачу XmlTransform, определенную непосредственно в Microsoft.Web.Publishing.Tasks.dll(эта задача является ядром WebConfigTransformation)
Таким образом, он достаточно гибкий и делает именно то, что вы ожидаете от него.
Например, здесь используется WebSiteTransformator.csproj, который используется для преобразования web.config.
Здесь также приведен пример гибкости, которой невозможно достичь с помощью оригинальной WebConfigTransformation: требуется web.Template.config, применяется web. $(Конфигурация).config над ним и пишет web.config. Это позволяет нам добавить web.config в список игнорирования в исходном элементе управления. До сих пор действительный csproj ссылается на веб-сайт:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<SchemaVersion>2.0</SchemaVersion>
<OutputType>Library</OutputType>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<OutputPath>$(TEMP)\TransformWebConfig\bin</OutputPath>
<BaseIntermediateOutputPath>$(TEMP)\TransformWebConfig\obj\</BaseIntermediateOutputPath>
<IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
<WebFolderName>$(SolutionDir)\MyWebSite\</WebFolderName>
</PropertyGroup>
<ItemGroup>
<Compile Include="Dummy.cs" />
</ItemGroup>
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="BeforeBuild">
<TransformXml Source="$(WebFolderName)Web.Template.config"
Transform="$(WebFolderName)Web.$(Configuration).config"
Destination="$(WebFolderName)Web.config" />
</Target>
</Project>
Ответ 3
Я использовал немного альтернативный подход. Еще немного взломать, но я думаю, что это намного проще. Это сработало для меня, но, очевидно, существует множество различных конфигураций, поэтому я не могу гарантировать, что это будет работать для всех. Это вращается вокруг того, что веб-сайт сначала упакован в вашу папку AppData
, прежде чем публиковать...
-
Вручную добавьте файл Web.Release.config
на веб-сайт и добавьте необходимые преобразования - очевидно, нет опции "Добавить Config Transform" для веб-сайтов, поэтому необходимо сделать это вручную. Пример Web.Release.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="MySetting" value="NewValue" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
</configuration>
-
Внутри файла website.publishproj
убедитесь, что для конфигурации установлено значение Release:
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
-
Добавьте до самой нижней части website.publishproj
(непосредственно перед </Project>
):
<Target Name="AfterBuild">
<MakeDir Directories="$(PackageArchiveRootDir)\..\CSAutoParameterize\original" />
<TransformXml Source="Web.config" Transform="Web.$(ConfigurationName).config" Destination="$(PackageArchiveRootDir)\..\CSAutoParameterize\original\Web.config" StackTrace="false" />
</Target>
Ответ 4
Как уже упоминалось в комментарии Андрея выше, Решение широкомасштабных событий определенно кажется более чистым способом сделать это.
Я добавляю это как отдельный ответ, так как он немного теряется в комментарии, но IMHO - лучший ответ. Подкрепляет Андрея К и Сайеда Ибрахима.
Ответ 5
Если вы предпочитаете не использовать Web.Template.config, я использовал это:
<PropertyGroup>
<_tempSourceFile>$([System.IO.Path]::GetTempFileName())</_tempSourceFile>
<_tempTransformFile>$([System.IO.Path]::GetTempFileName())</_tempTransformFile>
</PropertyGroup>
<Copy SourceFiles="$(ProjectDir)Web.config" DestinationFiles="$(_tempSourceFile)"/>
<Copy SourceFiles="$(ProjectDir)Web.$(Configuration).config" DestinationFiles="$(_tempTransformFile)"/>
<TransformXml Source="$(_tempSourceFile)"
Transform="$(_tempTransformFile)"
Destination="$(ProjectDir)Web.config"
StackTrace="false" />
Адаптировано из ответа здесь.