Как мне скомпилировать проект ASP.Net MVC с помощью MSBuild - PullRequest
14 голосов
/ 04 февраля 2010

Как мне скомпилировать проект ASP.Net MVC с помощью MSBuild?Мы используем сервер непрерывной интеграции для компиляции и развертывания наших приложений.Для простоты я создал проект MVC 1.0 в VS2008.Я немедленно создал файл сценария MSBuild для его компиляции.Я не изменил код в проекте.Скрипт MSBuild содержал следующую цель:

   <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?

Ответы [ 4 ]

6 голосов
/ 14 июня 2011

Этот скрипт сборки компилирует приложение asp.net MVC 3. Поскольку весь Интернет, кажется, забыл концепцию «Build Script», для этого не требуется, чтобы на целевом компьютере была установлена ​​Visual Studio или «LOL», вам просто нужно отредактировать файл csproj, чтобы получить msbuild !! 1001 *

Двигаемся дальше.

Убедитесь, что у вас установлены .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>

Помните, что вы должны включать файлы ресурсов, делать любые замены web.config и т. Д. Я действительно надеюсь, что это поможет.

6 голосов
/ 04 февраля 2010

Если вы компилируете свой sln-файл (msbuild mysolution.sln) или

<MSBuild Projects="msbuild mysolution.sln" Targets="Rebuild" ContinueOnError="false"
StopOnFirstFailure="false" /><!-- -d -errorstack -->

и в sln-файле есть .csproj-файл ASP.NET MVC-проекта, тогда в .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>

Я больше ничего не делал, и это сработало. Я на самом деле сделал свою конфигурацию так, чтобы только выпуск сборки выполнил развертывание приложения (путем перемещения свойства MvcBuildViews в PropertyGroups. Затем я могу использовать тот же .csproj при разработке (отладка) и развертывании (выпуск).

0 голосов
/ 04 февраля 2010

Самый простой способ, который я нашел, - это добавить проект WebDeployment в ваше решение.http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=0aa30ae8-c73b-4bdd-bb1b-fe697256c459&displaylang=en

Вы устанавливаете свойства для сборки в проекте WebDeployment (например, прекомпиляция).Buildserver создает wdprj.

В моей среде я должен начать с создания веб-сайта.После этого я могу запустить wdprj.

Вот мой скрипт nant.Должно быть легко написать то же самое в 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>
0 голосов
/ 04 февраля 2010

Вы можете использовать NAnt, в котором есть задача "msbuild", которая просто сделает это за вас.NAnt - отличный способ использовать сборки CI.

Домашняя страница NAnt Домашняя страница NAnt Ссылка на задачу MSBuild от NAntContrib

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