Я хочу быть в состоянии автоматически опубликовать к локальной папке каждый раз, когда веб-проект asp.net mvc 2 разрабатывается.
Я использую Visual Studio 2008.
Самый простой способ автоматизировать функциональность, включенную в действие Visual Studio "опубликовать", доступное из меню "Сборка", - это использовать проект веб-развертывания . Есть еще один для VS2005. По сути, это дополнительный проект, который вы добавляете в свое решение, которое будет нацелено на ваш веб-проект и после сборки опубликует ваш веб-проект как часть процесса сборки. Это упрощает автоматическое создание сайта как часть сборки без использования MSBuild (хотя MSBuild не так уж и сложен).
Ну вы могли бы сделать это с MSBuild в событии post-build.
Но вы уверены, что хотите это сделать? Это замедлит работу, и, возможно, вам не нужно публиковать каждую сборку? Почему бы просто не запустить сайт в IIS вместо Cassini.
Вот как я это делаю в своем проекте веб-сайта. Обратите внимание, что это будет скопировано в папку; если вы хотите публиковать через FTB, WebDav или SSH, вам необходимо использовать задачу Exec
вместо задачи Копировать
и указать инструмент командной строки, который может развертывать файлы через желаемый протокол.
Кроме того, вы не можете редактировать задачу AfterBuild
из настроек проекта в VS IDE. Вам нужно открыть его в Блокноте или в вашем любимом текстовом / XML-редакторе. (Вы даже можете использовать VS, если закроете решение и заставите его открыть файл с помощью редактора XML: -))
Также есть цель сборки, которая вызывает AspNetCompiler
, который у меня сейчас выключен, но вы можете легко включить его с помощью значения свойства MvcBuildViews
.
<PropertyGroup>
<MvcBuildViews>false</MvcBuildViews>
<DropPath>..\..\drop\</DropPath>
</PropertyGroup>
<Target Name="AfterBuildCompiler" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)" />
</Target>
<Target Name="AfterBuild" DependsOnTargets="AfterBuildCompiler">
<ConvertToAbsolutePath Paths="$(DropPath)">
<Output TaskParameter="AbsolutePaths" ItemName="FullDropPath" />
</ConvertToAbsolutePath>
<Message Importance="High" Text="Binplacing -> @(FullDropPath)" />
<ItemGroup>
<Binaries Include="$(OutputPath)**\*.*" />
</ItemGroup>
<Copy SkipUnchangedFiles="True" SourceFiles="@(Compile)" DestinationFiles="@(Compile->'$(DropPath)%(Identity)')" />
<Copy SkipUnchangedFiles="True" SourceFiles="@(Content)" DestinationFiles="@(Content->'$(DropPath)%(Identity)')" />
<Copy SkipUnchangedFiles="True" SourceFiles="@(EntityDeploy)" DestinationFiles="@(EntityDeploy->'$(DropPath)%(Identity)')" />
<Copy SkipUnchangedFiles="True" SourceFiles="@(Binaries)" DestinationFiles="@(Binaries->'$(DropPath)%(Identity)')" />
</Target>
Вариант 1. Переключитесь с круиз-контроля на JetBrains TeamCity (вы не пожалеете!). В TeamCity есть опция Артефакты, которая ...
«Артефакты - это файлы, созданные сборкой. После завершения сборки TeamCity ищет артефакты в каталоге проверки сборки в соответствии с указанными шаблонами артефактов. Соответствующие файлы затем загружаются в сервер, где они становятся доступными для загрузки »
Вариант 2: Создайте задачу в Круиз-контроле для выполнения XCOPY после завершения сборки.
<tasks>
<msbuild>
... here's your main build ...
</msbuild>
<exec>
... define your XCOPY or other executable task here ...
<buildTimeoutSeconds>900</buildTimeoutSeconds>
</exec>
Вариант 3: Создайте проект после сборки в своем решении и включите в него задачу по копированию файлов, добавьте условие для этой задачи, которое будет запускаться только при работе в режиме круиз-контроля (это позволяют различные переменные среды).