Как я могу использовать Web.debug.config на встроенном сервере отладчика visual studio? - PullRequest
74 голосов
/ 22 июля 2010

Как я могу объединить и использовать Web.debug.config во встроенном отладчике Visual Studio 2010?

Ответы [ 7 ]

91 голосов
/ 22 июля 2010

Это известная ошибка.Эта функция может использоваться прямо сейчас только как часть процесса развертывания.

https://connect.microsoft.com/VisualStudio/feedback/details/523221/have-web-debug-config-apply-during-development

Пожалуйста, подпишите ее, если вы столкнулись с этим, так что это будет исправлено как можно скорее.

34 голосов
/ 14 марта 2013

Это на самом деле довольно просто сделать, и, хотите верьте, хотите нет, похоже, именно так VS и работает.

Добавьте следующие строки дословно прямо перед закрывающим тегом «Project» файла .csproj проекта, содержащего web.config.

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="Transform">
    <MakeDir Directories="obj\$(Configuration)" Condition="!Exists('obj\$(Configuration)')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="obj\$(Configuration)\Web.config" StackTrace="true" />
</Target>

Добавьте следующие строки дословно к событию после сборки в свойствах проекта, который содержит файл web.config. Делайте это для каждой конфигурации сборки, для которой вы хотите, чтобы преобразования выполнялись.

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y
15 голосов
/ 04 мая 2015

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

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
2 голосов
/ 03 сентября 2015

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

  <Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
    <ItemGroup>
      <OriginalWebConfig Include="$(ProjectDir)Web.config"/>
      <TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
    </ItemGroup>
    <Exec Command="&quot;$(DevEnvDir)tf.exe&quot; checkout &quot;$(ProjectDir)Web.config&quot;" />
    <Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="@(TempWebConfig)" />
    <TransformXml Source="$(ProjectDir)TempWeb.config"
                            Transform="Web.$(Configuration).config"
                            Destination="Web.config" />
  </Target>

Примечания:

Это работает как цель BeforeBuild.

Я хочу, чтобы он работал только при определенной конфигурации (альтернативная среда отладки), поэтому у меня есть Условие.При развертывании через Интернет развернуть цель публикации, и мне не нужно, чтобы эта цель запускалась.

Мне не нужно помнить, чтобы проверить web.config (только чтобы отменить его, когда яготово) поэтому я проверяю web.config перед началом преобразования.Если вы не используете TFS, вы можете удалить эту строку.

Поскольку VS (2010) \ msbuild не хочет выпускать исходный файл web.config, я использую временный файл (спасибо этой статье заинформация: http://www.diaryofaninja.com/blog/2011/09/14/using-custom-webconfig-transformations-in-msbuild)

Я попытался добавить команду для удаления TempWeb.config, но VS \ msbuild не хочет ее отпускать. Я могу с этим смириться, так как она не добавляется вTFS.

2 голосов
/ 13 февраля 2015

Я не хотел обновлять файл web.config в моем проекте, только тот, который заканчивается в папке bin, поэтому вот как я это сделал.

Добавьте следующее в конец .csproj (непосредственно перед окончательным закрывающим тегом проекта)

<Target Name="Transform">
    <MakeDir Directories="bin" Condition="!Exists('bin')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
  </Target>

Затем добавьте следующий шаг пост сборки

"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU

Это означает, что при построении преобразование происходит из конфигурации отладки / выпуска в файл WebsiteName.Config в каталоге выходного бина, таким образом не мешая основному web.config в проекте.

1 голос
/ 01 сентября 2014

Я знаю, что это старый, но я сталкиваюсь с той же проблемой. У нас есть конфигурации Test, Staging, Live, которые заменяют конечные точки, строки подключения и т. Д. Из стандартного Web.config

Однако я бы сделал следующее:

  • Щелкните правой кнопкой мыши на нужной конфигурации преобразования (например, Web.Live.config )
  • Нажмите «Превью предварительного просмотра»
  • Скопируйте все справа (именно так выглядит Web.config с преобразованием)
    • CTRL + A + CTRL + C
  • Открыть файл Web.config (по умолчанию)
  • Выберите все (CTRL + A) и вставьте его (CTRL + V)
  • Run

Это не так много шагов, и это делается довольно быстро, когда вы освоитесь. Надеюсь это поможет. :)

0 голосов
/ 20 мая 2015

@ ologesa: Вашему решению необходим доступ на запись в исходный файл Web.config (вы должны оформить заказ в TFS).Лучшее решение - создать файл Web.config напрямую в папке bin, как это делает keitn.Когда мы объединяем Кейтна и ваше решение, мы получаем следующее:

<Target Name="BeforeBuild">
    <Message Text="Transforming Web.config from Web.$(Configuration).config" Importance="high" />
    <MakeDir Directories="bin" Condition="!Exists('bin')" />
    <TransformXml Source="Web.Config" Transform="Web.$(Configuration).config" Destination="bin\$(TargetFileName).config" StackTrace="true" />
</Target>
...