Як я можу використовувати Web.debug.config на вбудованому сервері відладчика Visual Studio?


Відповіді:


92

Це відома помилка. Цю функцію зараз можна використовувати лише як частину процесу розгортання.

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

Будь ласка, проголосуйте за це, якщо ви також стикаєтесь із цим, тому це буде виправлено якомога швидше.


16
Для протоколу це не помилка, це задум. Ці файли призначені для пакетування / публікації. Але це не повинно стримувати когось від голосування.
Sayed Ibrahim Hashimi

26
Ну для мене це помилка, інакше яка мета трансформації налагодження / випуску на локальному сервері? Іноді конструкції помилкові, це не означає, що вони правильні :)
Lord of Scripts

4
Проблема виникає, коли ви використовуєте Github, і вам потрібно ігнорувати web.config під час синхронізації. Але це перевершує мету створення резервної копії - я маю на увазі саме тому я використовую Github. Тепер додайте AppHarbor до сценарію, і ви повинні підтримувати два типи файлів web.config, оскільки ви хочете, щоб ваші файли опубліковані на Github, тому вам доведеться замінити значення у своїх конфігураціях перед синхронізацією та публікацією. Це проблема. Забудьте помилково підставити свої значення в конфігурі та синхронізувати, і вгадайте що? Ваші програми просто перетворилися на загальнодоступне сховище. Так, яка проблема.
Девід Роббінс,

8
Посилання на MS Connect перервано
Майкл Фрейдгайм

17
@LordofScripts: коли помилка закрита "за задумом", я іноді хочу сказати "тоді у вашому дизайні є помилка!"
Рой Тінкер,

34

Це насправді досить просто зробити, вірте чи ні, здається, саме таким чином VS створений для роботи.

Додайте наступні рядки дослівно перед закриваючим тегом "Проект" файлу .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

1
Я б рекомендував лише додавати подвійні лапки навколо $ (ProjectDir) та $ (ProjectPath), щоб уникнути помилок, якщо ваш шлях до проекту містить пробіли.
Олександр Прокоф’єв

1
Це краще використовувати <Target Name = "BeforeBuild»>, як це було запропоновано в stackoverflow.com/a/10506476/52277
Майкл Freidgeim

Я можу змусити трансформації працювати, використовуючи цей підхід, але я не можу досягти своїх точок зупинки. У мене налагодження встановлено на true, але я ніколи не потрапляв до точки зупинки, і я отримую таке повідомлення: "Точка зупинки наразі не буде врахована. Для цього документа не завантажено жодних символів.". Це трапляється лише для моїх користувацьких конфігурацій і працює чудово, якщо для моєї конфігурації встановлено "Налагодження". Будь-які ідеї?
mithun_daa 03.03.14

1
Мені довелося додати подвійні лапки навколо $ (MSBUILDBINPATH), щоб це працювало, інакше він виходить із кодом 9009
sotn

6
Зверніть увагу, що це замінює оригінал Web.config, тому всі ваші перетворення повинні бути "ідемпотентними" (їх можна повторно застосувати до результатів будь-яких інших перетворень). Це також заважатиме вам зберігати здоровий глузд, якщо ви покладете файл під контроль джерела (як ви, мабуть, повинні). Загалом, "простий" хак, який зміщує складність / біль на наступний набір проблем. Добре, якщо ви зможете вирішити це питання "краще" там, погано, якщо ні. Також рекомендується використовувати $ (VisualStudioVersion) замість жорсткого кодування версії VS (ви будете забувати змінити її).
tne

16

Я вирішив це простіше, додавши це в кінці файлу .csproj, безпосередньо перед тегом. Це схоже на відповідь keitn, з тією різницею, що він не використовує подію побудови повідомлення.

<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>

3
Підтверджено, це працює. Але будьте обережні, це змінює локальну копію Web.config. Отже, якщо ви використовуєте перетворення XSLT на зразок RemoveAttributes, це точно видалено! Добре працює з SetAttributes
Loul G.

Це зробило саме те, що я шукав. Просто і прямо до справи. Не впевнений, чому всі інші рішення повинні бути такими ... складними.
Девід Керріган,

Хто-небудь знає, як скасувати цю дію в розділі <Target name = "AfterBuild">?
Cameron Belt

1
Це має бути відповіддю.
Cameron Belt

2

Я не хотів оновлювати 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 у проекті.


2
Це перетворює конфігурацію в каталог bin, на жаль, ця конфігурація ніколи не використовується. Завантажена конфігурація насправді є Web.Config у папці проекту, а не в каталозі bin.
Мік

2

Після прочитання багатьох подібних постів і виникнення проблем із файлами, які неможливо перезаписати, або 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.

Я хочу, щоб він працював лише за певної конфігурації (альтернативне середовище налагодження), і тому я маю Condition. Під час розгортання через Інтернет розгортається ціль публікації, і мені не потрібна ця ціль для запуску.

Я не хочу пам’ятати перевіряти 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.


У мене ця помилка The command ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\tf.exe" checkout "C:\_Code\RTS\SCTimeSheet\Web.config"" exited with code 9009. Будь-які ідеї?
небо91

1

Я знаю, що це старе, але я стикаюся з тією ж проблемою. У нас є конфігурації Test, Staging, Live, які замінюють кінцеві точки, рядки підключень тощо із Web.config за замовчуванням

Однак я б зробив наступне:

  • Клацніть правою кнопкою миші на бажаній конфігурації перетворення (наприклад, Web.Live.config )
  • Клацніть на "Попередній перегляд перетворення"
  • Скопіюйте все справа (так виглядає Web.config із перетворенням)
    • CTRL + A + CTRL + C
  • Відкрийте файл Web.config (за замовчуванням)
  • Виділіть все (CTRL + A) і вставте (CTRL + V)
  • Біжи

Це не так вже й багато кроків, і це робиться досить швидко, коли ви це звикаєте. Сподіваюся, це допомагає. :)


Якщо я правильно зрозумів, то це руйнівна зміна оригінального файлу web.config. У контексті питання ці кроки потрібно було б виконувати щоразу, коли запускається сеанс налагодження.
Red Taz,

-1

@ologesa: Для вашого рішення потрібен доступ для запису до оригінального Web.config (ви повинні зареєструватися в TFS). Кращим рішенням є безпосереднє створення Web.config у папці bin, як це робить keitn. Коли ми поєднуємо keitn's та ваше рішення, ми отримуємо таке:

<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>

3
Було б непогано, але як прокоментував Мік; цей файл не використовується. Як отримати додаток або IIS використовувати цей конфігураційний файл?
HMR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.