Ответ 1
Это известная ошибка. Эта функция может быть использована прямо сейчас только как часть процесса развертывания.
Продвиньте его, если вы столкнулись с этим, так что это будет исправлено как можно скорее.
Как я могу объединить и использовать Web.debug.config
в встроенном отладчике Visual Studio 2010?
Это известная ошибка. Эта функция может быть использована прямо сейчас только как часть процесса развертывания.
Продвиньте его, если вы столкнулись с этим, так что это будет исправлено как можно скорее.
На самом деле это довольно просто сделать, и, верьте или нет, похоже, так работает 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>
Поместите следующие строки дословно в событие post-build в свойствах проекта проекта, который содержит файл web.config. Сделайте это для каждой конфигурации сборки, для которой нужно выполнить преобразования.
"$(MSBUILDBINPATH)\msbuild" "$(ProjectPath)" /t:Transform /p:Configuration=$(ConfigurationName);Platform=AnyCPU
xcopy "$(ProjectDir)obj\$(ConfigurationName)\Web.Config" "$(ProjectDir)". /F /R /Y
Я решил это проще, добавив это в конец файла .csproj прямо перед тегом. Это похоже на ответ keitn, с той разницей, что он не использует событие post build.
<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
Это означает, что при создании преобразования происходит из конфигурации debug/release в файл WebsiteName.Config в каталоге выходного bin, что не мешает основному 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.
Я хочу, чтобы он запускался в определенной конфигурации (альтернативная среда отладки), и поэтому у меня есть условие. При развертывании через веб-развертывание цели публикации запускаются, и мне не нужна эта цель для запуска.
Я не хочу забывать, чтобы проверить web.config(только чтобы отменить его, когда я закончил), поэтому я проверяю web.config перед началом преобразования. Если вы не используете TFS, вы можете удалить эту строку.
Поскольку VS (2010)\msbuild не хочет отпускать Source web.config, я использую временный файл (благодаря этой статье для информации: http://www.diaryofaninja.com/blog/2011/09/14/using-custom-webconfig-transformations-in-msbuild)
Я попытался добавить команду для удаления TempWeb.config, но VS\msbuild не хочет ее отпускать. Я могу жить с ним, поскольку он не добавляется в TFS.
Я знаю, что это старо, но я столкнулся с той же проблемой. У нас есть Test, Staging, Live configs, которые заменяют конечные точки, строки подключения и т.д. Из стандартного Web.config
Однако я бы сделал следующее:
Это не так много шагов и выполняется довольно быстро, когда вы его повесили. Надеюсь это поможет.:)
@ologesa: Вашему решению нужен доступ на запись к исходному Web.config(вы должны зарегистрироваться в TFS). Лучшим решением является прямое создание Web.config в папке bin, как это делает keitn. Когда мы объединяем 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>