Автоматизация публикации функциональных возможностей 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>