2010-09-01 2 views
13

Использование msbuild в .NET 4.0, я могу создать веб-проект с целью «Пакет», и он неплохо выполняет задачу поместить пакет в zip-файл. Но, когда я смотрю на web.config там, он не преобразован, он имеет «$ (ReplacableToken_Web_SiteConnection-Web.config Connection String_0)»Может ли MS Deploy делать пакет и преобразовывать, но не развертывать?

Я могу запустить цель «TransformWebConfig», и она будет делать правильное преобразование , но только в своем собственном бункере.

Я также могу запустить цель «Создать» и передать свойства «DeployOnBuild = True; DeployTarget = MSDeployPublish», и он развернет пакет на моем сервере с правильным преобразованием web.config.

Но если я хочу вручную развернуть пакет на сервере, как мне сделать «Пакет» с «TransformWebConfig», чтобы zip-файл имел окончательный файл web.config?

ответ

10

Способ, которым мы это делаем, путем модификации сборки проекта, чтобы сделать преобразование перед его упаковкой.

Целью является вызов TransformXml и является частью Microsoft.Web.Publishing.Tasks.dll

В ваших собственных целей его

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" /> 

Но он будет включен по умолчанию в VS C# построить ,

Так

<TransformXml Source="web.config" Transform="web.release.config" Destination="$(DeployPath)\web.config" /> 

ли трюк для нас.

Настройте эти пути с помощью правой ItemGroup (скорее всего, «контент») и убедитесь, что цель запущена до вызова пакета в вашем .csproj, а вывод сборки будет содержать «Web.config», например нормальный, с правыми преобразованными значениями.

В качестве альтернативы (мы использовали это для пакетов, которые должны быть всем для всех), вы можете использовать этот трюк, чтобы делать ВСЕ преобразования и включать каждый из них в финальный пакет.

Затем вызывается MSDeploy вручную и использовать его пропуск и заменить директивы (забыли технический термин) для вывода только правильной при развёртывании времени

Предполагая, что у вас есть web.usethisone.config в вашем пакете, что выглядит как

-skip:objectname=filepath,absolutepath=web\..*\.config 

-replace:objectName=filepath,match=.*web\.usethisone\.config,replace=web.config 
+0

Спасибо, это работает как шарм и экономит много времени. Я потратил много времени, чтобы преобразовать несколько файлов Web.config для различных сред развертывания. –

+0

Я борюсь с той же проблемой. Я добавил в файл .csproj моего веб-приложения, но я не совсем понял, где я должен разместить раздел . Как я узнаю, какая из них «правильная ItemGroup (« контент », скорее всего)» и как мне «убедиться, что цель запущена до вызова пакета» в моем файле .csproj? –

12

Если вы хотите пропустить это, то вам нужно установить свойство в своей сборке. Вы можете сделать это двумя способами

  1. Редактировать ваш файл проекта
  2. Создать .wpp.targets файл

Я бы рекомендовал # 2. В этом случае создайте новый файл в том же каталоге, что и файл проекта, с именем {ProjectName} .wpp.targets, где {ProjectName} - это имя вашего проекта. Затем внутри этого файла вы должны поместить следующее содержимое.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="4.0"> 
    <PropertyGroup> 
    <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings> 
    </PropertyGroup> 
</Project> 

В этом случае вы устанавливаете свойство AutoParameterizationWebConfigConnectionStrings который сообщает Publishing Pipeline Web, чтобы не вставить эти {} заполнителей в web.config для строки подключения.

+0

Это относится к заполнителям, но не объясняет, как применять преобразования при упаковке. –

 Смежные вопросы

  • Нет связанных вопросов^_^