Вы можете достичь желаемого эффекта, используя цели BeforeBuild и AfterBuild, доступные в файле .csproj. IDE VS.NET будет выполнять эти цели при выполнении Build или Rebuild, поэтому вы можете использовать их для выполнения преобразований web.config. Поскольку вам нужно выполнить преобразование web.config, а затем перезаписать реальный файл web.config, вам понадобится новый файл с именем web.default.config для хранения базовых данных web.config.
Я попробовал это в тестовом проекте, вот изменения, которые я внес в файл .csproj:
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<ProjectExtensions>
...
</ProjectExtensions>
<Target Name="BeforeBuild">
<Copy SourceFiles="$(ProjectDir)web.default.config" DestinationFiles="$(ProjectDir)web.config" />
</Target>
<Target Name="AfterBuild" Condition="$(FirstRun) != 'false'">
<MSBuild Projects="$(MSBuildProjectFile)" Targets="TransformWebConfig" Properties="FirstRun=false;" />
<Sleep Milliseconds="2000" />
<Copy SourceFiles="$(ProjectDir)obj\$(ConfigurationName)\TransformWebConfig\transformed\web.config"
DestinationFiles="$(ProjectDir)web.config" />
</Target>
Мне пришлось вручную добавить их в файл .csproj (я использовал Notepad ++). Насколько я могу судить, нет возможности добавить эти инструкции через VSE. Вам необходимо предоставить условие для AfterBuild, чтобы избежать циклической ссылки, так как вызов MSBuild перезапустит сборку для генерации преобразования web.config.
В основном мы копируем файл web.default.config (наш базовый шаблон) поверх существующего файла web.config перед началом сборки, а затем мы используем MSBuild для создания файла web.config для любой конфигурации, которую мы строим. После завершения преобразования мы используем задачу «Копировать», чтобы взять преобразованный файл и скопировать его в файл web.config в корневом веб-каталоге. Одной из проблем, с которой я иногда сталкивался, была ошибка использования файла при попытке перезаписать файл web.config после завершения преобразования. Добавление задачи Sleep (из MSBuildCommunityTasks ) после того, как задача MSBuild решила эту проблему.
Я только протестировал этот подход, используя встроенный сервер ASP.NET, а не IIS, поэтому YMMV, но я чувствую, что это работоспособное решение.
Идея FirstRun пришла из этой записи .