2012-02-23 12 views
4

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

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

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

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

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

Edit:

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

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

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

ответ

4

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, как вы можете видеть, что 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 (в разделе «Builds» в рамках проекта вашей команды), нажмите «Процесс», разверните запись «3. Дополнительно» и введите /p:CompileWebsites=True для строки с надписью «Аргументы MSBuild».

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

2

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

4

Все логика _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> 
+1

Теперь мы добираемся куда-нибудь, но возможно ли изменить флаги по умолчанию, не редактируя файл? Я бы подумал, что использование '/ p: Disable_CopyWebApplication = True' в качестве параметра MSBuild будет делать трюк, но до сих пор, независимо от того, где я пытался установить параметр, он не остановил цель' _CopyWebApplication'. Остановить его _might_ будет приемлемым, потому что тогда было бы проще просто добавить шаг MSBuild после всей компиляции, чтобы сделать AspNetCompile. – Andrew

+0

'Disable_CopyWebApplication = True' предотвращает публикацию веб-приложения. Вы уверены, что двоичные файлы, которые вы видите, не из предыдущего запуска? Также попробуйте передать 'IsDesktopBuild = True' – KMoraz

+0

Нашел часть проблемы в еще одном тестировании ... Team Build использует целевой файл v9.0, а не v10.0. Это имеет смысл, поскольку это решение VS2008. На первый взгляд, я не вижу аналогичного параметра. – Andrew