Как мне выполнить преобразования Web.config с проектами веб-сайтов Visual Studio? - PullRequest
27 голосов
/ 22 февраля 2011

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

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

Ответы [ 5 ]

9 голосов
/ 05 апреля 2011

Я бы предпочел не использовать целое решение для проекта веб-приложений из коробки.Мое решение состоит в том, чтобы использовать задачу XmlTransform, определенную в Microsoft.Web.Publishing.Tasks.dll напрямую (эта задача является ядром WebConfigTransformation). Таким образом, она достаточно гибкая и выполняет именно то, что вы ожидаете.Например, вот WebSiteTransformator.csproj, который я использую для преобразования web.config.

Здесь также приведен пример гибкости, которой невозможно достичь с помощью оригинального WebConfigTransformation: он принимает web.Template.config, применяет web. $ (Configuration) .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>
6 голосов
/ 23 февраля 2011

Я нашел довольно хороший пост в блоге, описывающий решение этой проблемы: http://andrewtwest.com/2010/02/25/using-web-config-transformations-in-web-site-projects/

Вкратце: создайте пустой проект (если это не другой проект веб-сайта) в вашем решении, которое содержитВеб-сайт.Пустой проект даст вам доступ к msbuild через его файл проекта, который позволит вам выполнять преобразования на вашем веб-сайте web.config.

4 голосов
/ 27 января 2014

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

  1. Вручную добавьте файл Web.Release.config на веб-сайт и добавьте необходимые преобразования - очевидно, что для веб-сайтов нет опции «Добавить преобразование конфигурации», поэтому приходится делать это вручную. Пример 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>
    
  2. Внутри файла website.publishproj убедитесь, что для конфигурации установлено значение Release:

    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    
  3. Добавьте в самый низ 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>
    
2 голосов
/ 23 июля 2011

Как упомянуто в комментарии Андрея выше, События сборки всего решения определенно кажется более чистым способом сделать это.

Я добавляю это как отдельный ответ, так как он немного теряется в комментарии, но IMHO - лучший ответ. Реквизит Андрею К и Сайеду Ибрагиму.

1 голос
/ 13 февраля 2012

Если вы предпочитаете не использовать 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" />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...