Як я можу об’єднати та використовувати Web.debug.config
вбудований налагоджувач Visual Studio 2010?
Як я можу об’єднати та використовувати Web.debug.config
вбудований налагоджувач Visual Studio 2010?
Відповіді:
Це відома помилка. Цю функцію зараз можна використовувати лише як частину процесу розгортання.
Будь ласка, проголосуйте за це, якщо ви також стикаєтесь із цим, тому це буде виправлено якомога швидше.
Це насправді досить просто зробити, вірте чи ні, здається, саме таким чином 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
Web.config
, тому всі ваші перетворення повинні бути "ідемпотентними" (їх можна повторно застосувати до результатів будь-яких інших перетворень). Це також заважатиме вам зберігати здоровий глузд, якщо ви покладете файл під контроль джерела (як ви, мабуть, повинні). Загалом, "простий" хак, який зміщує складність / біль на наступний набір проблем. Добре, якщо ви зможете вирішити це питання "краще" там, погано, якщо ні. Також рекомендується використовувати $ (VisualStudioVersion) замість жорсткого кодування версії VS (ви будете забувати змінити її).
Я вирішив це простіше, додавши це в кінці файлу .csproj, безпосередньо перед тегом. Це схоже на відповідь keitn, з тією різницею, що він не використовує подію побудови повідомлення.
<Target Name="BeforeBuild">
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>
Я не хотів оновлювати 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 у проекті.
Після прочитання багатьох подібних постів і виникнення проблем із файлами, які неможливо перезаписати, або web.config недоступний, оскільки він читається лише для мене, ось що я працював для мене:
<Target Name="BeforeBuild" Condition="$(Configuration) == 'MyAltDebugConfiguration'">
<ItemGroup>
<OriginalWebConfig Include="$(ProjectDir)Web.config"/>
<TempWebConfig Include="$(ProjectDir)TempWeb.config"/>
</ItemGroup>
<Exec Command=""$(DevEnvDir)tf.exe" checkout "$(ProjectDir)Web.config"" />
<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
. Будь-які ідеї?
Я знаю, що це старе, але я стикаюся з тією ж проблемою. У нас є конфігурації Test, Staging, Live, які замінюють кінцеві точки, рядки підключень тощо із Web.config за замовчуванням
Однак я б зробив наступне:
Це не так вже й багато кроків, і це робиться досить швидко, коли ви це звикаєте. Сподіваюся, це допомагає. :)
@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>