سؤال

لقد قمت بالترقية من ASP.NET MVC Beta إلى 1.0 وقمت بالتغييرات التالية في مشروع MVC (كما devcibed في ملاحظات إصدار RC):

<Project ...>
  ...
  <MvcBuildViews>true</MvcBuildViews>
  ...
  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
  </Target>
  ...
</Project>

في حين أن Build يعمل بشكل جيد على صناديق Dev المحلية الخاصة بنا، فإنه يفشل تحت Build TFS 2008 مع "لا يمكن تحميل نوع" XXX.MVCapplication "، انظر أدناه سجل" بناء ":

...
using "AspNetCompiler" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "AspNetCompiler"

  Command:
  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v temp -p D:\Builds\xxx\Continuous\TeamBuild\Sources\UI\xxx.UI.Dashboard\\..\xxx.UI.Dashboard 
  The "AspNetCompiler" task is using "aspnet_compiler.exe" from "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe".
  Utility to precompile an ASP.NET application
  Copyright (C) Microsoft Corporation. All rights reserved.

/temp/global.asax(1): error ASPPARSE: Could not load type 'xxx.UI.Dashboard.MvcApplication'.
  The command exited with code 1.

Done executing task "AspNetCompiler" -- FAILED.
...

يتم تثبيت MVC 1.0 على TFS وتجميع الحل عند الإنشاء داخل مثيل Visual Studio على نفس خادم TFS.

كيف يمكنني حل مشكلة بناء TFS هذه؟

هل كانت مفيدة؟

المحلول

تتوقف المشكلة عن حقيقة أن مهمة ASPNENTCOMPILER MSBUILD المستخدمة في الهدف Afterbuild لمشروع ASP.NET MVC تتوقع أن تشير إلى DLL في مجلد BIN لمشروع الويب.

على سطح المكتب، قم ببناء مجلد Bin هو المكان الذي تتوقعه تحت شجرة المصدر الخاصة بك.

ومع ذلك، تقوم TFS TeamBuild بتجميع إخراج مصدرك إلى دليل مختلف على خادم Build. عند بدء تشغيل مهمة Aspnetcompiler، لا يمكن العثور على دليل BIN للإضافة إلى DLL المطلوبة وتحصل على الاستثناء.

الحل هو تعديل الهدف Afterbuild لمشروع MVC ليكون كما يلي:

  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler Condition="'$(IsDesktopBuild)' != 'false'" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
    <AspNetCompiler Condition="'$(IsDesktopBuild)' == 'false'" VirtualPath="temp" PhysicalPath="$(PublishDir)\_PublishedWebsites\$(ProjectName)" />
  </Target>

يمكنك هذا التغيير لتجميع طرق العرض على سطح المكتب، وخادم Build TFS.

نصائح أخرى

في الواقع، هناك حلا أفضل لهذه المشكلة. لقد اختبرتها مع VS / TFS 2010 ولكن يجب أن تعمل أيضا مع VS / TFS 2008.

<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

سأعمل مع فريق MVC لتحديث قالب مشروعه لاستخدام هذا النهج جنبا إلى جنب مع هدف مخصص (بدلا من تجاوز ما بعد البيع).

لقد نشرت مشاركة مدونة حول كيفية قم بتشغيل التحقق من طريقة عرض تجميع مشاريع ASP.NET MVC في TFS Build 2010.

لم ينجح حل Jim Lamb من أجلنا عندما بنيت على الويب .csproj

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False

لأنه تم تنفيذ الهدف AfterBuild ولم يتم نسخ التطبيق إلى WebProjectOutputDir بعد. (راجع للشغل، وأرمر تلك الخصائص إلى مشروع الويب بناء كوس أريد أن أقوم بإنشاء مجلد خارجي مع ثنائيات بلدي فقط وملفات CSHTML مناسبة ل Zipping، أي لا يوجد بناء في مكان)

للحصول على هذه المشكلة وتكريم نية هدفه الأصلي، فعلت ما يلي:

<PropertyGroup>
    <OnAfter_WPPCopyWebApplication>
        MvcBuildViews;
    </OnAfter_WPPCopyWebApplication>
</PropertyGroup>

<Target Name="MvcBuildViews" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

أفترض أنك تعني تغيير الإعداد التالي في ملف .csproj:

<MvcBuildViews>true</MvcBuildViews>

يجب ألا تطرق الإعداد الذي نشرته في سؤالك. إذا كان يعمل على جهازك المحلي، فمن الواضح أنه يمكنك مسبقا بناء تطبيق ASP.NET MVC.

أعتقد أنك بحاجة إلى تعقب ما يختلف عن بيئة بناء TFS الخاصة بك وأجهزة VS المحلية الخاصة بك. ربما تستخدم نسخة مختلفة من msbuild أو شيء من هذا.

حاول تنفيذ كلا بين الإخراج المطلي ومقارنة بين اثنين لمعرفة ما هو مختلف.

ما زلنا لا نزال يختبر ذلك، ولكن يبدو أنه يمكنك نقل FALSE / TRUE من مجموعة العلامة، إلى مجموعة الخاصية لإصدار بناء Debug الخاص بك، لا يزال بإمكانك تعيينه إلى True و Msbuild Compled (على افتراض Msbuild Tfsbuild.proj الملف هو الإعداد لاستخدام شيء آخر غير تكوين التصحيح). ستحتاج إلى تحرير ملف CSProj باستخدام المفكرة لإنجاز هذا.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <MvcBuildViews>true</MvcBuildViews>
    ....

تحتاج إلى نقل علامة mvcbuildviews من مجموعة الممتلكات الافتراضية أعلاه، إلى مجموعة خاصية تكوين Debug (أدناه). مرة أخرى، عندما نحصل على إعداد TFS / Msbuild، سأحاول نشر الخطوة التي أضفناها إلى ملف Tfsbuild.proj في TFS.

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <MvcBuildViews>true</MvcBuildViews>
    <DebugSymbols>true</DebugSymbols>
    ....

هذه المشكلة تبدو مشابهة لتلك التي تحدثت عنها هنا:http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deplation-projects.aspx.يبدو أن استدعاء ASPNENT_COMPILER.EXE فشل في تحديد موقع الثنائيات لأن لا تكون في مجلد BIN لمشروع MVC على جهاز الإنشاء. أنا لم أعمل في حل حتى الآن.

الإجابة المقبولة لم تنجح بالنسبة لي. المعلمة $ (PublishDir) لم تشير إلى الموقع الصحيح. بدلا من ذلك اضطررت إلى استخدام:

  <Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler Condition="'$(IsDesktopBuild)' != 'false'" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
    <AspNetCompiler Condition="'$(IsDesktopBuild)' == 'false'" VirtualPath="temp" PhysicalPath="$(OutDir)\_PublishedWebsites\$(ProjectName)" />
  </Target>

كان لدي بعض المجلدات القديمة في سيطرتي المصدر التي لم تكن مرئية في الحل.

لا يمكنك بناء تطبيق ASP.NET MVC.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top