Ответ 1
ОК, при том понимании, что web.debug.config
и web.release.config
предназначены только для пакета/публикации. Я придумал способ, чтобы вы могли делать то, что вы пытаетесь сделать. Я писал об этом в http://sedodream.com/2010/10/21/ASPNETWebProjectsWebdebugconfigWebreleaseconfig.aspx.
Вот резюме.
Теперь посмотрим, как мы можем включить то, что хочет задать вопрос.
Чтобы повторить, когда он строит на определенной конфигурации, он хочет, чтобы для web.config
применялось определенное преобразование. Поэтому, очевидно, вы не хотите поддерживать файл web.config
, потому что он будет перезаписан.
Итак, нам нужно создать новый файл web.template.config
, который является просто копией web.config
. Затем просто удалите web.config
с помощью проводника Windows (не удаляйте с помощью Visual Studio, потому что мы не хотим его удалять из проекта).
Примечание. Если вы используете поставщик управления версиями, который интегрирован в Visual Studio, вы, вероятно, захотите удалить web.config из исходного элемента управления.
Кроме того, мы не хотим использовать web.debug.config
или web.release.config
, потому что они уже имеют четко определенную роль в веб-публикации, поэтому мы не хотим этого беспокоить. Поэтому вместо этого мы создадим два новых файла в той же папке, что и проект, и web.template.config
, web.dev.debug.config
и web.dev.release.config
.
Идея заключается в том, что это будут преобразования, применяемые при отладке или запуске вашего приложения из Visual Studio. Теперь нам нужно подключиться к процессу сборки/пакета/публикации, чтобы все это подключалось. В проектах веб-приложений (WAP) существует точка расширяемости, в которой вы можете создать файл проекта в той же папке с именем {ProjectName}.wpp.targets
, где {ProjectName}
- это имя проекта. Если этот файл находится на диске в той же папке, что и WAP, он будет автоматически импортирован в файл проекта. Поэтому я создал этот файл. И я разместил следующий контент:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Make sure web.config will be there even for package/publish -->
<Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
<Copy SourceFiles="web.template.config"
DestinationFiles="web.config"/>
</Target>
<PropertyGroup>
<PrepareForRunDependsOn>
$(PrepareForRunDependsOn);
UpdateWebConfigBeforeRun;
</PrepareForRunDependsOn>
</PropertyGroup>
<!-- This target will run right before you run your app in Visual Studio -->
<Target Name="UpdateWebConfigBeforeRun">
<Message Text="Configuration: $(Configuration): web.dev.$(Configuration).config"/>
<TransformXml Source="web.template.config"
Transform="web.dev.$(Configuration).config"
Destination="web.config" />
</Target>
<!-- Exclude the config template files from the created package -->
<Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
<ItemGroup>
<ExcludeFromPackageFiles Include="web.template.config;web.dev.*.config"/>
</ItemGroup>
<Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
</Target>
</Project>
Позвольте мне немного объяснить это. Я создал цель CopyWebTemplateConfig, которая всегда будет копировать web.template.config
в web.config
при сборке, даже если вы не отлаживаете свое приложение в Visual Studio.
Это необходимо, потому что нам еще нужно поддерживать процесс пакет/публикация Visual Studio. Затем я расширил свойство PrepareForRunDependsOn
, включив в него цель UpdateWebConfigBeforeRun
. Это свойство используется для определения списка целей, которые должны быть выполнены до запуска любого управляемого проекта из Visual Studio.
В этой цели я использую задачу TransformXml
для преобразования web.template.config
, используя правильный файл web.dev.***.config
. После этого ваше приложение запускается с использованием правильного web.config
на основе вашей конфигурации сборки.
После этого у меня есть другая цель ExcludeCustomConfigTransformsFiles
, которую я вставляю в процесс package/publish через атрибут BeforeTargets="ExcludeFilesFromPackage"
. Это необходимо, потому что мы не хотим, чтобы эти файлы включались, когда приложение было упаковано или опубликовано.
Так что это действительно все.
Объяснить процесс пакета/публикации немного больше для этого сценария. Когда вы упаковываете/публикуете web.debug.config
или web.release.config
, в зависимости от конфигурации сборки все равно будет использоваться. Но в конечном итоге файл, который он преобразует, web.template.config
, поэтому вам, возможно, придется настраивать в зависимости от того, что у вас есть в этом файле. Вопросы/Комментарии?