MSBuild Script и VS2010 публикуют приложение Web.config Transform.

66

Итак, у меня установлен VS 2010 и я в процессе изменения моего MSBuild script для нашей интеграции сборки TeamCity. Все отлично работает с одним исключением.

Как сообщить MSBuild, что я хочу применить файлы преобразования Web.conifg, которые я создал при публикации сборки...

У меня есть следующее, которое создает скомпилированный веб-сайт, но он выводит файлы Web.config, Web.Debug.config и Web.Release.config(все 3) в скомпилированный выходной каталог. В студии, когда я выполняю публикацию в файловой системе, она будет выполнять преобразование и выводит Web.config с соответствующими изменениями...

<Target Name="CompileWeb">
    <MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" />
</Target>

<Target Name="PublishWeb" DependsOnTargets="CompileWeb">
    <MSBuild Projects="myproj.csproj"
    Targets="ResolveReferences;_CopyWebApplication"
    Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder);
                OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" />
</Target>

Любая помощь будет отличной..!

Я знаю, что это можно сделать другими способами, но я хотел бы сделать это, используя, возможно, новый VS 2010

Теги:
msbuild
visual-studio-2010
web-config-transform

6 ответов

65
Лучший ответ

Я искал аналогичную информацию и не нашел ее, поэтому я немного искал файлы .targets, которые поставляются с Visual Studio 2010 и MSBuild 4.0. Я подумал, что это лучшее место для поиска задачи MSBuild, которая будет выполнять преобразование.

Насколько я могу сказать, используется следующая задача MSBuild:

<Project ToolsVersion="4.0"
         DefaultTargets="Deploy"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

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

    <PropertyGroup>
        <ProjectPath>C:\Path to Project\Here</ProjectPath>
        <DeployPath>C:\Path to Deploy\There</DeployPath>
        <TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile>
        <TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile>
        <TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile>
        <StackTraceEnabled>False</StackTraceEnabled>
    </PropertyGroup>


    <Target Name="Transform">
        <TransformXml Source="$(TransformInputFile)"
                      Transform="$(TransformFile)"
                      Destination="$(TransformOutputFile)"
                      Condition="some condition here"
                      StackTrace="$(StackTraceEnabled)" />
    </Target>
</Project>

Я тестировал вышеописанное и могу подтвердить, что он работает. Возможно, вам придется немного подстроить структуру, чтобы она соответствовала вашей компоновке script.

  • 4
    это очень похоже на решение, которое я выбрал. Единственное предостережение в том, что в действии TransformXml в настоящее время есть ошибка, из-за которой он не закрывает исходный файл, и поэтому вы не можете избавиться от исходного файла. Просто кое-что рассмотреть; в моем случае после преобразования я хотел удалить файлы Debug.config и Release.config из каталога развертывания. Чтобы обойти это, пока MS не решит проблему. Вы можете просто скопировать исходный файл и преобразовать файл во временный каталог, а затем скопировать вновь преобразованный файл обратно, тогда вы сможете удалить / удалить файлы ...
  • 1
    Да, я тоже столкнулся с этой ошибкой, когда пытался. Вот почему мне пришлось использовать $ (ProjectPath) и $ (DeployPath). На самом деле, я бы предложил использовать промежуточное местоположение для сбора всех артефактов сборки (включая файл Web.config), а затем развернуть его на различных веб-серверах из этого местоположения, содержащих все артефакты. Это избавит от преобразования Web.config несколько раз, при условии, что все веб-серверы будут использовать один и тот же файл Web.config.
Показать ещё 3 комментария
13

Вы должны выполнить это, используя целевой объект Package и указав каталог temp.

msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish

http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/

  • 0
    Единственная проблема состоит в том, что этот подход не будет применять преобразования конфигурации к строкам соединения.
  • 0
    Все преобразования web.config должны работать с использованием этого метода. Почему строка подключения специально не работает?
Показать ещё 3 комментария
8

В качестве альтернативы вы пытаетесь использовать инструмент преобразования XDT:

http://ctt.codeplex.com

Я использую это вместо того, чтобы возиться с неясными целями msbuild. Работает с app.config не только web.config.

5

Это сработало для меня со следующим изменением

<MSBuild Projects="$(ProjectFile)"
         Targets="ResolveReferences;_WPPCopyWebApplication"
     Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" />

Из файла Microsoft.WebApplication.targets в папке MsBuild

_CopyWebApplication

This target will copy the build outputs along with the 
content files into a _PublishedWebsites folder.

This Task is only necessary when $(OutDir) has been redirected
to a folder other than ~\bin such as is the case with Team Build.

The original _CopyWebApplication is now a Legacy, you can still use it by 
 setting $(UseWPP_CopyWebApplication) to true.
By default, it now change to use _WPPCopyWebApplication target in
 Microsoft.Web.Publish.targets.   
It allow to leverage the web.config trsnaformation.
  • 0
    Я использую nant, и цель TransformWebConfig не будет работать правильно для меня, пока я также не добавлю цель _WPPCopyWebApplication. Это исправило мою проблему.
1

Это отличная запись о пользовательских преобразованиях:

http://www.diaryofaninja.com/blog/2011/09/14/using-custom-webconfig-transformations-in-msbuild

Нам нужно было настроить веб-развертывания немного больше, чем обычно, из-за тонны классического ASP и других гадостей, которые нам пришлось приспособить. В этой статье были сохранены часы рытья по объектам MS.

  • 0
    Эта статья прекрасно объясняет, что не так с реализацией преобразований конфигурации.
0

Я не эксперт в MSBuild, но я смог использовать информацию из этой ссылки для выполнения той же задачи:

http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

В нижней части статьи есть раздел, связанный с MSBuild. Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню