Подтвердить что ты не робот

Как мне преобразовать Web.config с проектами веб-сайта Visual Studio?

Невозможно изменить конфигурацию сборки проектов Visual Studio 2010 (в отличие от веб-приложений Visual Studio) и изменить конструкцию сборки Конфигурация является ключевой частью включения преобразований Web.config(изменить конфигурацию на все, кроме Debug) невозможно.

Как мне преобразовать Web.config для работы с проектами веб-сайта Visual Studio 2010, если невозможно изменить конфигурацию сборки?

4b9b3361

Ответ 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" />

Адаптировано из ответа здесь.