Автоматизация публикации функциональных возможностей Visual Studio 2010?

Я прочитал несколько хороших постов по автоматизации процессов сборки, однако меня интересует не просто процесс сборки, а публикация.

У меня есть несколько сайтов и сервисов, которые используют базовую модель. Когда я изменяю эту модель (что случается не очень часто), все сайты / службы должны быть перестроены и опубликованы в соответствующих целевых каталогах (уже содержащихся в их конфигурации).

Все папки проекта существуют в одной папке.

Подход, который я рассматриваю, состоит в том, чтобы использовать MSBuild для запуска скрипта из главной папки с именованным списком проектов для сборки / публикации.

Я нашел хороший пример создания сценария сборки для MSBuild здесь, однако, это удовлетворяет только сборке для одного проекта.

Как бы мне было пройти через именованный список проектов / каталогов, чтобы выполнить тот же сценарий сборки / публикации?

Благодарю.

3 ответа

Решение

Так что у меня наконец-то появилось время взглянуть на это снова.

Я создал следующий скрипт MSBuild, который находится в папке на том же уровне всех сайтов, которые у меня есть.

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


  <Target Name ="DeleteFiles">
    <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\debug\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\release\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).pdb"></Delete>
  </Target>

  <Target Name="Compile" DependsOnTargets="DeleteFiles">
    <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
      Targets="Clean;Build"
      Properties="OutputPath=..\$(ProjectName)\bin"/>
  </Target>

  <Target Name="Deploy" DependsOnTargets="Compile">
    <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
        Targets="ResolveReferences;_CopyWebApplication"
        Properties="OutDir=C:\inetpub\wwwroot\$(ProjectName)\bin\;WebProjectOutputDir=C:\inetpub\wwwroot\$(ProjectName)" />
  </Target>


</Project>

И называется так:

msbuild build.xml /p:ProjectName="websitetopublish.com "/ v: n

Прекрасно работает на одном сайте, однако я бы хотел решение, связанное с пакетами, которое читает текстовый файл. Для каждой записи в этом текстовом файле выполните процесс сборки.

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

Окончательное, многоразовое решение заключается в следующем.

Резюме:

У меня есть несколько сайтов в корневой папке, чьи каталоги и имена файлов проектов названы по значению сайта. Я хочу иметь возможность публиковать все сайты (или выбранный список) из командной строки - запуск сценария. Веб-сайты должны быть опубликованы в каталогах моего сервера IIS.

Сначала создайте скрипт MSBuild, который принимает параметр имени сайта:

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Compile,Deploy" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name ="DeleteFiles">
    <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\debug\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\obj\release\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).dll"></Delete>
    <Delete Files="..\$(ProjectName)\$(ProjectName)\bin\$(ProjectName).pdb"></Delete>
  </Target>

  <Target Name="Compile" DependsOnTargets="DeleteFiles">
    <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
      Targets="Clean;Build"
      Properties="OutputPath=..\$(ProjectName)\bin"/>
  </Target>

  <Target Name="Deploy" DependsOnTargets="Compile">
    <MSBuild Projects="..\$(ProjectName)\$(ProjectName)\$(ProjectName).csproj"
        Targets="ResolveReferences;_CopyWebApplication"
        Properties="OutDir=C:\inetpub\wwwroot\$(ProjectName)\bin\;WebProjectOutputDir=C:\inetpub\wwwroot\$(ProjectName)" />
  </Target>

</Project>

Затем создайте текстовый файл с одним именем веб-сайта в строке. Это можно легко сгенерировать, выполнив "dir> sites.txt", а затем колонку, отредактировав лишний контент.

то есть.

site1.com
site2.com
site3.com
site4.com

Наконец, создайте командный файл, который просматривает список, содержащийся в sites.txt, и выполняет сценарий MSBuild:

@echo --------------------------------------------
@echo --  Iterating through list in sites.txt  --
@echo --------------------------------------------
for /f %%X in (sites.txt) do msbuild build.xml /p:ProjectName="%%X" /v:n

Это решение находится в каталоге на том же уровне, что и остальные веб-сайты из корневого каталога, поэтому в сценарии сборки указано "..\$(ProjectName)".

Отличный способ публикации множества сайтов, и надеюсь, что это кому-нибудь поможет.

Используйте <ItemGroup /> элемент с пользовательскими метаданными, в результате чего получается что-то вроде следующего:

   <ItemGroup>
      <ProjectToPublish Include="WebApplication1\WebApplication1.csproj" >
                <OutputDir>OutputDir1</OutputDir>
      </ProjectToPublish>
      <ProjectToPublish Include="WebApplication2\WebApplication2.csproj" >
                <OutputDir>OutputDir2</OutputDir>
      </ProjectToPublish>
   </ItemGroup>

   <Target Name="Publish" Inputs="@(ProjectsToPublish)" Outputs="%(Identity).Dummy">
      <RemoveDir Directories="%(OutputDir)" ContinueOnError="true" />
      <MSBuild Projects="%(Identity)"
         Targets="ResolveReferences;_CopyWebApplication"
         Properties="WebProjectOutputDir=$(OutputDir);
         OutDir=%(OutputDir)\" />
   </Target>
Другие вопросы по тегам