Как скомпилировать проект ASP.Net MVC с использованием MSBuild
Как скомпилировать проект ASP.Net MVC с использованием MSBuild? Мы используем сервер непрерывной интеграции для компиляции и развертывания наших приложений. Чтобы все было просто, я создал проект MVC 1.0 в VS2008. Я сразу же создал файл MSBuild script для его компиляции. Я не изменил код в проекте. MSBuild script содержит следующую цель.
<AspNetCompiler
VirtualPath="/"
PhysicalPath="C:\Development\mvc1\"
TargetPath="c:\publish\xxx"
Force="true"
Debug="false"
Updateable="true"
Файл sln проекта MVC содержится в каталоге c:\development\mvc1 \. Я запускаю XP/Pro.
Я получаю сообщение об ошибке ASPCONFIG: ошибка в использовании раздела, зарегистрированного как allowDefintion = 'MachineToApplication', превышает уровень приложения. Я удалил режим аутентификации, поставщика членства и т.д. из файла веб-конфигурации, пока я наконец не увидел другое сообщение об ошибке. Теперь я получаю сообщение об ошибке, указывающее, что файл '/views/shared/site.master' не существует.
Что происходит? Заранее благодарим за помощь!
Использую ли я неправильную команду MSBuild?
Ответы
Ответ 1
Если вы скомпилируете свой sln файл (msbuild mysolution.sln) или
<MSBuild Projects="msbuild mysolution.sln" Targets="Rebuild" ContinueOnError="false"
StopOnFirstFailure="false" /><!-- -d -errorstack -->
и sln файл имеет ASP.NET MVC-проект .csproj файл, тогда файл .csproj имеет все, что вам нужно. Откройте .csproj с помощью блокнота и найдите:
1) Это должно быть правдой:
<MvcBuildViews>false</MvcBuildViews>
2) Цель Name= "AfterBuildCompiler":
<Target Name="AfterBuildCompiler" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="SomeVirtualDir" PhysicalPath="C:\Development\mvc1\" TargetPath="c:\publish\xxx\" />
</Target>
Я ничего не делал, и это сработало. Я фактически сделал свой конфиг, чтобы только релиз-сборка разворачивала приложение (перемещая MvcBuildViews-свойство в PropertyGroups. Тогда я могу использовать тот же .csproj в разработке (отладке) и развертывании (выпуске).
Ответ 2
Эта сборка script компилирует приложение asp.net MVC 3. Поскольку весь интернет, похоже, забыл концепцию "Build Script", это не требует, чтобы Visual Studio была установлена на целевой машине или "LOL", вам просто нужно отредактировать файл csproj, чтобы получить msbuild! "
Перемещение.
Убедитесь, что установлены .NET 4 и MVC3. Кстати, мои скрипты сборки работают только с msbuild 4, поэтому убедитесь, что вы используете правильный.
Общий процесс выглядит следующим образом (благодаря множеству намеков и ответов, которые я получил здесь!)
1) Build the dependencies (you DLL's)
2) Build the DLL for your web application.
3) Call the asp.net compiler task.
4) Check the scripts for additional comments.
Обратите внимание, что это вызывается из внешнего script, который компилирует другую DLL (бизнес, доступ к данным и т.д.)
<Project ToolsVersion="4.0" DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildDir>..\..\dist</BuildDir>
<Optimize>true</Optimize>
</PropertyGroup>
<ItemGroup >
<Reference Include="System.dll" />
<Reference Include="System.Core.dll" />
<Reference Include="System.Web.Abstractions.dll" />
<!-- add the remaining DLL required. Check your References folder inside VS2010 and add the relevant entries here. It a lot of references. I ommited them to make the post more compact.
For reasons that are beyond me, I only managed to get some DLL referenced by full path. Go figure... -->
<Reference Include="C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.Helpers\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.Helpers.dll" />
<Reference Include="C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll" />
<Reference Include="C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.dll" />
<!-- The "main build script" compiles the other DLL from the project and places them on the BuildDir folder. Just reference it here-->
<Reference Include="$(BuildDir)\*.dll"></Reference>
</ItemGroup>
<!-- Build a DLL for the code file inside your web project (controllers, models, the lot...) place it together with the other DLL
WARNING: Simple build command. Resource files are not included in this.
-->
<Target Name="BuildWebDll">
<ItemGroup>
<CodeFiles Include=".\**\*.cs" />
</ItemGroup>
<CSC Sources="@(CodeFiles)" TargetType="Library" References="@(Reference)" OutputAssembly="$(BuildDir)\cth.web.dll" >
</CSC>
</Target>
<!-- For reasons also unkown, but covered in a number os posts in this forum, the asp.net compiler requires the necessary DLL to be placed on the BIN/ folder of your web project. That why we're copying every DLL we need to said folder. For debugging, check the Bin folder on Visual Studio after you compile the project. You need to replicate that in your BIN/
-->
<Target Name="CopyDLLs">
<ItemGroup>
<DllFiles Include="$(BuildDir)/*.dll"/>
</ItemGroup>
<Copy SourceFiles="@(DllFiles)" DestinationFolder="Bin\"></Copy>
</Target>
<Target Name="build">
<CallTarget Targets="BuildWebDll"></CallTarget>
<CallTarget Targets="CopyDLLs"></CallTarget>
<!-- Call this from the webproject directory. PhysicalPath references ".". TargetPath can be everything you want -->
<AspNetCompiler Updateable="true" VirtualPath="/CTH.Web" PhysicalPath="./" TargetPath="$(BuildDir)/CTH.Web" Force="true" Debug="false" />
</Target>
Помните, что вам нужно включать файлы ресурсов, выполнять любые замены web.config и т.д. Я действительно надеюсь, что это поможет.
Ответ 3
Вы можете использовать NAnt, у которого есть задача "msbuild", которая просто сделает это за вас. NAnt - отличный способ для сборки CI.
домашняя страница NAnt
NAnt Contrib главная страница
Ссылка на задания MSBuild от NAnt Contrib
... библиотека Contrib добавляет некоторые отличные функциональные возможности, которые не имеет ванильного NAnt. Это очень просто. Я включил фрагмент моего файла .build, чтобы вы могли видеть, как я его использовал:
<property name="DeployDestination" value="\\MyTestServerName\DestinationFolder"/>
<property name="Solution.Configuration" value="Debug" overwrite="True" />
<property name="nant.settings.currentframework" value="net-3.5" />
<if test="${WebContentDestination=='Production'}">
<property name="DeployDestination" value="\\MyProductionServer\DestinationFolder"/>
</if>
...<snip>
<target name="Build">
<msbuild project="SolutionFileName.sln">
<arg value="/p:Configuration=${Solution.Configuration}" />
</msbuild>
</target>
<target name="Deploy">
<copy todir="${DeployDestination}" flatten="true" >
<fileset>All files to copy</fileset>
</copy>
</target>
Ответ 4
Самый простой способ, который я нашел, - добавить проект WebDeployment к вашему решению.
http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=0aa30ae8-c73b-4bdd-bb1b-fe697256c459&displaylang=en
Вы устанавливаете свойства для сборки в проекте WebDeployment (например, прекомпилируете). Buildserver создает wdprj.
В моей среде я должен сначала создать веб-сайт. После этого я могу запустить wdprj.
Вот мой nant - script. В msbuild должно быть легко написать то же самое. Это действительно работает в TeamCity.
xml version="1.0"?>
<project name="GreatProjectWeb"
default="build" basedir="."
xmlns="http://nant.sf.net/release/0.85/nant.xsd">
<description>Build Script</description>
<!-- builds only the csproj, not the entire solution-->
<target name="build" description="Compile the project using Debug configuration for more verbose error descriptions">
<echo message="Building..."> </echo>
<exec program="C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" >
<arg value="GreatProjectWeb\GreatProjectWeb.csproj" />
<arg value="/t:Build" />
<arg value="/p:Configuration=Release" />
</exec>
<echo message="Building Projektfile finished. Starting WDP Project..."> </echo>
<exec program="C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" >
<arg value="GreatProjectWeb_Build\GreatProjectWeb_Build.wdproj" />
<arg value="/t:Build" />
<arg value="/p:Configuration=Release" />
</exec>
<exec program="7z" >
<arg value="a" />
<arg value="GreatProjectWeb_Deploy\web_GreatProject.zip" />
<arg value="GreatProjectWeb_Deploy\*" />
</exec>
</target>
</project>