2011-01-20 2 views
28

Цель состоит в том, чтобы TFS создавала и развертывала 2+ различные конфигурации, а файлы преобразования web.config включали предполагаемый контент в свой вывод. Это в проекте ASP.NET MVC.TFS Build не преобразует web.config как ожидалось

alt text

Web.Debug.Config - see on PasteBin.
Web.Release.Config - see on PasteBin

В 2 преобразованные файлы конфигурации имеют свои Сложение Действие установлено значение Нет. Это было изменено, потому что в развертывание включены все 3 файла конфигурации. *. Config.

TFS настроен правильно для создания и развертывания обеих конфигураций. Он разворачивается в 2 места падения, как ожидалось. В определении сборки нет аргументов MSBuild.

alt text

Проблема: В 2 встроенных и развернутые веб-сайты имеют один и тот же файл web.config. В принципе, это как если бы преобразованные файлы не существовали.

Ожидаемое: изменения указанных (xdt:Transform="Replace" и xdt:Transform="Remove") будет присутствовать в файлах web.config.

Как вы можете настроить свой проект или TFS для обеспечения преобразования преобразований web.config, а их выходы развернуты в правильные места развертывания? Что еще я могу проверить/изменить?

  • Подтвердили, что преобразования хороши - Vishal's Joshit's tutorial with the MSBuild on the command line выведите правильные преобразования!
  • Никаких изменений в .csproj для каких-либо пост-сборки или развертывания не внесено.
  • Неправильно ли используются или отсутствуют какие-либо xdt атрибуты?
  • В определении сборки нет аргументов MSBuild.
  • Правильно ли установлены правила сборки Web.config?
  • Мы не используем пакеты веб-развертывания или что-то еще. Просто ожидая, что xproy эти выходы будут перенесены в различные местоположения веб-серверов позднее.

Если у меня отсутствует какая-либо важная информация, оставьте комментарий, и я расскажу о какой-либо более важной информации!

ответ

4

Вот что я использовал. Текущая задача TransformXml имеет ошибку, при которой файлы остаются открытыми. Подробнее here.

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

<Target Name="TransformWebConfig"> 

    <PropertyGroup> 
     <_tempSourceFile>$([System.IO.Path]::GetTempFileName())</_tempSourceFile> 
     <_tempTransformFile>$([System.IO.Path]::GetTempFileName())</_tempTransformFile> 
    </PropertyGroup> 

    <Copy SourceFiles="$(_websiteDirectory)\Web.config" DestinationFiles="$(_tempSourceFile)"/> 
    <Copy SourceFiles="$(_websiteDirectory)\Web.$(_transformConfiguration).config" DestinationFiles="$(_tempTransformFile)"/> 

    <MSBuild.Community.Tasks.Attrib Files="$(_websiteDirectory)\Web.config" ReadOnly="false" /> 

    <TransformXml Source="$(_tempSourceFile)" 
        Transform="$(_tempTransformFile)" 
        Destination="$(_websiteDirectory)\Web.config" 
        StackTrace="false" /> 
</Target> 
+0

спасибо за это. На этом этапе я немного смущен; где проходит этот фрагмент XML? Любые другие модификации определения конструкции TFS для размещения? –

+0

Насколько хорошо вы знакомы с MSBuild? Вы бы поставили эту цель в свое определение сборки и, возможно, вызвали ее из цели «BeforeDropBuild». – Danny

+0

-1: зачем ему это нужно? Он использует TFS 2010. –

8

TFS Team Build 2010 не автоматически преобразует ваши Web.configs. Чтобы выполнить это, вам необходимо добавить настраиваемую операцию рабочего процесса к шаблону процесса сборки.

У Edwald Hofman есть хороший блог, в котором объясняется, как модифицировать шаблоны процессов TFS 2010 Build, поэтому я не буду углубляться в это.

http://www.ewaldhofman.nl/post/2010/04/29/Customize-Team-Build-2010-e28093-Part-4-Create-your-own-activity.aspx

После выяснить, как добавить собственные действия в шаблон процесса сборки, добавьте следующую деятельность в рабочий процесс, я добавил свою деятельность после того, как «перетаскивать файлы для падения Местоположения». Он использует сборку Microsoft.Web.Publishing.Tasks (расположена по адресу: C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web) для выполнения преобразований:

/// <summary> 
/// Transforms configuration files using TransformXml 
/// </summary> 
[BuildActivity(HostEnvironmentOption.All)] 
public sealed class WebConfigTransform : CodeActivity 
{ 
    #region Public Properties 

    /// <summary> 
    /// The binaries folder 
    /// </summary> 
    [RequiredArgument] 
    public InArgument<string> BinariesLocation { get; set; } 

    #endregion 

    #region Overrides of CodeActivity 

    /// <summary> 
    /// When implemented in a derived class, performs the execution of the activity. 
    /// </summary> 
    /// <param name="context">The execution context under which the activity executes.</param> 
    protected override void Execute(CodeActivityContext context) 
    { 
     var binariesFolder = context.GetValue(BinariesLocation); 

     foreach (var sourceFolder in Directory.GetDirectories(Path.Combine(binariesFolder, "_PublishedWebsites"))) 
     { 
      var sourceFile = Path.Combine(sourceFolder, "Web.config"); 
      if (File.Exists(sourceFile)) 
      { 
       var filesToTransform = Directory.GetFiles(sourceFolder, "Web.*.config"); 


       foreach (var fileToTransform in filesToTransform) 
       { 

        var tempSourceFile = Path.GetTempFileName(); 
        var tempTransformFile = Path.GetTempFileName(); 

        File.Copy(sourceFile, tempSourceFile, true); 
        File.Copy(fileToTransform, tempTransformFile, true); 

        var transformation = new TransformXml 
        { 
         BuildEngine = new BuildEngineStub(), 
         Source = tempSourceFile, 
         Transform = tempTransformFile, 
         Destination = fileToTransform 
        }; 

        transformation.Execute(); 
       } 
      } 
     } 
    } 

    #endregion 
} 

Вам нужно будет передать ему DropLocation в потоке работы. Когда вы добавите его в рабочий поток, щелкните правой кнопкой мыши на активности, затем перейдите к свойствам и вставьте «DropLocation» (выражение VB) в свойство «BinaryLocation»

ПРИМЕЧАНИЕ. Вам необходимо создать класс BuildEngineStub который реализует интерфейс IBuildEngine для использования задачи MSBuild. Вот что я использовал

+1

Другие варианты - намного лучший способ пойти и значительно упростить настройку –

+5

Не согласен. Я бы скорее сделал это изменение в моем шаблоне процесса сборки один раз (для использования всех решений), чем редактировать каждый файл .proj или создавать определение, которое я создаю. – Danny

+1

Хм, хорошо, никогда не думал об этом ... По общему признанию, я новичок в создании через TFS и шаблонах сборки, но все это кажется очень расстраивающим. Похоже, что нам нужно уйти с нашего пути для создания/поддержки скриптов для реализации функций, которые уже присутствуют в msbuild. –

0

The Drop фактически не преобразует. Вам нужно добавить /p:DeployOnBuild=True в аргументы MSBuild.

Это создаст пакет, который затем можно будет использовать для установки веб-сайта либо через командную строку, либо с помощью мастера импорта приложений IIS.

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

0

Старайтесь не устанавливать сборки платформы - поясню удалить «Любой процессор» в ItemToBuild и выберите платформу MSBuild, как «Auto»

19

Раньше я делал что-то похожее на другие ответы. Тем не менее, я просто нашел то, что кажется лучшим решением этой проблемы. Просто добавьте «/ p: UseWPP_CopyWebApplication = true/p: PipelineDependsOnBuild = false» к вашим аргументам MSBuild. Я просто попробовал это на одной из моих сборников TFS, и все работает отлично.

Я нашел этот замечательный совет здесь: http://www.andygeldman.com/index.php/2011/10/web-and-app-config-transformations-with-tfs-build.

+1

Очень простое решение! Работала отлично, даже при настройке сборки TFS для создания нескольких конфигураций (как отладка, так и выпуск были полностью изменены) – Shawson

+0

Только то, что мне было нужно! Спасибо за совет. –