Как скомпилировать ASP.Net проект MVC с использованием MSBuild
как скомпилировать ASP.Net проект MVC с использованием MSBuild? Мы используем сервер непрерывной интеграции для компиляции и развертывания нашего приложения. Чтобы все было просто, я создал проект MVC 1.0 в VS2008. Я сразу же создал файл сценария MSBuild для его компиляции. Я не менял код в проекте. Скрипт MSBuild содержал следующие цели.
<AspNetCompiler VirtualPath="/" PhysicalPath="C:Developmentmvc1" TargetPath="c:publishxxx" Force="true" Debug="false" Updateable="true"
файл sln проекта MVC содержится в c:developmentmvc1 каталог. Я запускаю XP / Pro.
Я получаю ошибку ASPCONFIG: это ошибка использовать раздел, зарегистрированный как allowDefintion='MachineToApplication' за пределами уровня приложения.. Я удалил режим аутентификации, поставщика членства и т. д. из файла веб-конфигурации, пока я, наконец, не увидел другое сообщение об ошибке. Теперь я получаю сообщение об ошибке, говорящее, что файл " / views/shared / site.мастер не существует.
что происходит? Заранее спасибо за помощь!
Я использую неправильную команду MSBuild?
4 ответов
Если вы компилируете sln-файл (MSBuild mysolution.СЛН) или
<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) Целевое Имя= "AfterBuildCompiler":
<Target Name="AfterBuildCompiler" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="SomeVirtualDir" PhysicalPath="C:\Development\mvc1\" TargetPath="c:\publish\xxx\" />
</Target>
Я больше ничего не делал и оно работало. Я фактически сделал свою конфигурацию так, чтобы только release build развертывал приложение (перемещая MvcBuildViews-свойство в PropertyGroups. Тогда я могу использовать то же самое .csproj в разработке (отладка) и развертывании (выпуск).
этот скрипт сборки компилирует asp.net приложение MVC 3. Поскольку весь интернет, похоже, забыл концепцию "сценария сборки", это не требует, чтобы у вас была установлена 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.
обратите внимание,что это вызывается из внешнего скрипта, который компилирует другие 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's required. Check your References folder inside VS2010 and add the relevant entries here. It's 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's 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's 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's
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's to be placed on the BIN/ folder of your web project. That's 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>
помните, что вы должны включать файлы ресурсов, делать любой веб.замены конфигурации, etc. Я очень надеюсь, что это поможет.
самый простой способ, который я нашел, - добавить проект WebDeployment в ваше решение. http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=0aa30ae8-c73b-4bdd-bb1b-fe697256c459&displaylang=en
вы задаете свойства для сборки в проекте WebDeployment (например, precompile ) . Buildserver строит wdprj.
в моей среде я должен начать с создания веб-сайта. После этого я могу запустить wdprj.
вот мой Нант - скрипт. Это должно быть легко написать то же самое в 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>
вы можете использовать NAnt, в котором есть задача "msbuild", которая просто сделает это за вас. NAnt-отличный способ пойти на сборки CI.
на NAnt Домашняя страница The NAnt Contrib Домашняя страница The MSBuild Task reference от NAnt Contrib
...библиотека contrib добавляет некоторые большие функциональные возможности, которых нет у vanilla NAnt. Это очень просто. Я включил фрагмент моего .создайте файл здесь, чтобы вы могли увидеть, как я использовал это:
<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>