Как заставить Team Build 2010 публиковать веб-приложения как не обновляемые? - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь переключить нашу сборку с CruiseControl.NET, в которой выполняется пользовательский файл .msbuild, на Team Build 2010. Скомпилированное приложение представляет собой решение VS2008 с многочисленными проектами, два из которых являются веб-проектами.

Используя DefaultTemplate.xaml, кажется, что два веб-проекта развернуты на Binaries\_PublishedWebsites\(ProjectName). Это расположение по умолчанию в порядке. Однако содержимое выходных каталогов представляется обновляемым, как если бы aspnet_compiler.exe вызывалось с -u, или как будто задача MSBuild <AspNetCompiler> использовалась с Updateable="true". Итак, два вопроса:

  1. Как заставить Team Build выводить не обновляемый вывод в каталог _PublishedWebsites?
  2. Как я также могу установить IIS VirtualPath, как если бы я делал следующее в задаче MSBuild:

    <AspNetCompiler Clean="true" Force="true" VirtualPath="/My-IIS-Virtual-Path" />
    

В предыдущих решениях по устранению неполадок я обнаружил, что единственный способ заставить IIS 6 обслуживать веб-службу, скомпилированную с aspnet_compiler.exe в режиме без возможности обновления, - это указать в команде виртуальный путь, поэтому я спрашиваю о # 2.

Изменить:

Увидев пока один ответ, я понял, что должен был быть намного яснее в том, в чем проблема. Я понимаю, что если я могу что-то сделать в MSBuild, я могу просто вызвать MSBuild из шаблона сборки. Однако мне интересно узнать немного больше о том, как изменить то, что происходит при копировании вывода в каталог _PublishedWebsites. «Найти задачу, которая копирует веб-сайт и изменить его» будет работать хорошо, за исключением того, что я не вижу, что на самом деле копирует вывод в _PublishedWebsites. То, что я действительно хочу сделать, это изменить шаг в шаблоне, который выполняет это.

Журнал сборки ссылается на цель компиляции под названием _CopyWebApplication, которая, по-видимому, выполняет копирование файлов, необходимых для веб-приложения. Однако я не уверен, как изменить эту цель компиляции, так как я не вижу ее ни в шаблоне сборки, ни в каком-либо файле решения. Кроме того, все, что запускается _CopyWebApplication, похоже, работает только для проектов веб-приложений, а не для многих других проектов в решении. Это хорошо, за исключением того, что я не знаю, где существует логика, определяющая, использовать ли _CopyWebApplication.

Может быть, есть какой-то файл MSBuild по умолчанию, который мне не хватает? Какой-то параметр сборки, который я мог бы использовать? Как мне изменить вышеупомянутый шаг сборки?

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

Вся логика цели _CopyWebApplication определена в:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets

Сама цель довольно проста, но содержит множество предварительных условий:

<Target Name="_CopyWebApplication" 
        Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'" 
        DependsOnTargets="$(_CopyWebApplicationDependsOn)">

  <CallTarget Condition="'$(OnAfter_CopyWebApplication)' != ''" Targets="$(OnAfter_CopyWebApplication)" RunEachTargetSeparately="true" />

</Target>

Выможет контролировать процесс, добравшись до нужного набора флагов.Ниже приведены значения по умолчанию:

<WebProjectOutputDirInsideProjectDefault>True</WebProjectOutputDirInsideProjectDefault>
<WebProjectOutputDirInsideProjectDefault  Condition="('$(OutDir)' != '$(OutputPath)') Or ('$(IsDesktopBuild)' == 'False')" >False</WebProjectOutputDirInsideProjectDefault>
<DisableLinkInCopyWebApplicaton Condition="'$(DisableLinkInCopyWebApplicaton)'==''">False</DisableLinkInCopyWebApplicaton>
<Disable_CopyWebApplication Condition="'$(Disable_CopyWebApplication)' == ''">False</Disable_CopyWebApplication>
<UseWPP_CopyWebApplication Condition="'$(UseWPP_CopyWebApplication)' == ''">False</UseWPP_CopyWebApplication>
<CleanWebProjectOutputDir>True</CleanWebProjectOutputDir>
<CleanWebProjectOutputDir Condition="$(WebProjectOutputDirInsideProject)" >False</CleanWebProjectOutputDir>
4 голосов
/ 08 марта 2012

KMoraz указал мне правильное направление, и мне пришлось сделать еще несколько вещей, чтобы заставить это работать. Я действительно не хотел редактировать встроенные файлы .targets, так как это создало бы некоторые проблемы с техническим обслуживанием в будущем для любого другого разработчика, который не знал, что я сделал. Я закончил редактировать файлы .csproj для двух веб-приложений, начиная с элемента <Import> по умолчанию в конце файла и заканчивая элементом <ProjectExtensions> по умолчанию:

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <!-- Since this Import serves no real purpose in VS2008 under Team Build, I'm commenting it out to remove
       a _CopyWebApplication step that we don't want.
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
  -->
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
  <!-- Now, for Team Build, do the AspNetCompile steps ourselves. -->
  <PropertyGroup>
      <WebProjectOutputDir Condition="'$(OutDir)' != '$(OutputPath)'">$(OutDir)_CompiledWebsites\$(MSBuildProjectName)</WebProjectOutputDir>
  </PropertyGroup>
  <PropertyGroup>
      <BuildDependsOn>
          $(BuildDependsOn);
          DoAspNetCompile
      </BuildDependsOn>
  </PropertyGroup>
  <Target Name="DoAspNetCompile" Condition="'$(CompileWebsites)' == 'True' And '$(OutDir)' != '$(OutputPath)'">
      <Message Text="Performing AspNetCompile step for $(MSBuildProjectName)" />
      <Message Text="Output will have IIS virtual directory '$(IISVirtualPath)'" />
      <Message Text="ProjectDir is $(ProjectDir)" />
      <Message Text="IsDebug is $(IsDebug)" />
      <RemoveDir Directories="$(WebProjectOutputDir)" ContinueOnError="true" />
      <MakeDir Directories="$(WebProjectOutputDir)" />
      <!-- We need the /bin directory, populated with some DLLs and PDBs -->
      <CreateItem Include="$(OutDir)*.dll;$(OutDir)*.pdb">
          <Output TaskParameter="Include" ItemName="BinariesToCopy" />
      </CreateItem>
      <Copy DestinationFolder="$(ProjectDir)\bin" SourceFiles="@(BinariesToCopy)" />
      <AspNetCompiler Clean="True" Force="True" Debug="$(IsDebug)" Updateable="False" VirtualPath="$(IISVirtualPath)" PhysicalPath="$(ProjectDir)" TargetPath="$(WebProjectOutputDir)" />
  </Target>

Некоторые объяснения:

  1. Как видно из файла .csproj, в файле *1011* по умолчанию используется C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets. Раньше я не осознавал, что MSBuild знал, как использовать этот файл .targets. Поскольку единственный способ не использовать цель _CopyWebApplication целевого файла в VS2008 - это не использовать файл, и поскольку версия VS2010 действительно мне тоже не помогла, я просто закомментировал импорт.
  2. Чтобы отличить вывод от стандартного, я изменил имя выходного каталога на _CompiledWebsites вместо _PublishedWebsites.
  3. Я добавил элемент <BuildDependsOn>, чтобы любые другие файлы проекта, которые изменяют точки расширения, не отключали мою цель.
  4. Мне требуется, чтобы CompileWebsites было установлено в true (используя что-то вроде параметра /p:CompileWebsites=true, передаваемого в MSBuild, хотя в Team Build есть и другие способы сделать это, если это необходимо). Таким образом, локальная сборка по умолчанию не затрагивается.
  5. Элементы <Message> предназначены для отладки. Я установил $(IsDebug) в True или False в конфигурациях в верхней части файла. У нас есть много конфигураций, кроме ванильных «Debug» и «Release», поэтому этот флаг был необходим, чтобы я мог сказать AspNetCompiler, включать ли символы отладки. $(IISVirtualPath) также устанавливается в конфигурациях в верхней части файла. Это необходимо для того, чтобы IIS 6 обслуживал веб-службу, скомпилированную таким образом.
  6. AspNetCompiler не может найти предварительно скомпилированные двоичные файлы, куда Team Build помещает их по умолчанию, поэтому я копирую их в каталог bin\ проекта, где AspNetCompiler ожидает их нахождения.
  7. Мне не нужно было делать ничего особенного с шаблоном .xaml в Team Build, чтобы заставить это работать. Я должен был убедиться, что определение сборки включает в себя параметр /p:CompileWebsites=True. Для этого щелкните правой кнопкой мыши определение сборки в окне Team Explorer (в разделе «Сборки» под командным проектом), нажмите «Обработка», разверните запись «3. Дополнительно» и введите /p:CompileWebsites=True для строки, помеченной «Аргументы MSBuild» ».

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

2 голосов
/ 24 февраля 2012

DefaultTemplate.xaml в TFS 2010 Build по-прежнему использует MSBuild для сборки ваших проектов, поэтому, если две вещи, которые вы перечисляете, можно сделать с помощью MSBuild.exe, они могут быть выполнены в процессе сборки 2010 года.Все, что вам нужно сделать, это добавить нужные аргументы MSBuild в Параметры процесса вашего определения сборки.Более подробную информацию об обновлении определения сборки можно найти на MSDN .

...