Автоматизация публикации функциональных возможностей Visual Studio 2010? - PullRequest
0 голосов
/ 15 декабря 2011

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

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

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

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

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

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 27 декабря 2011

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

Резюме:

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

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

0 голосов
/ 27 декабря 2011

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

Я создал следующий скрипт 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, но излишне, и мне хотелось бы знать, как этого добиться, используя некоторые механизмы зацикливания в пакетных файлах.

0 голосов
/ 19 декабря 2011

Используйте элемент <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>
...