2009-04-16 14 views
60

मैं ASP.NET MVC बीटा से 1.0 करने के लिए उन्नत और (के रूप में आर सी रिलीज़ नोट में descibed) MVC परियोजना में निम्न परिवर्तन किया गया है:ASP.NET MVC 1.0 AfterBuilding दृश्य TFS पर विफल रहता बिल्ड

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

जबकि निर्माण हमारे स्थानीय देव बक्से पर ठीक चलाता है, इसके साथ 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 पर स्थापित है और एक ही टीएफएस सर्वर पर विजुअल स्टूडियो इंस्टेंस के भीतर बनाया गया समाधान संकलित करता है।

मैं इस टीएफएस बिल्ड मुद्दे को कैसे हल कर सकता हूं?

उत्तर

17

समस्या इस तथ्य से उत्पन्न होती है कि एएसपीनेट एमवीसी परियोजना के आफ्टरबिल्ड लक्ष्य के भीतर एस्पनेट कॉम्पलर एमएसबिल्ड कार्य वेब प्रोजेक्ट के बिन फ़ोल्डर में डीएल के संदर्भ में अपेक्षा करता है।

डेस्कटॉप पर बिन फ़ोल्डर है जहां आप इसे अपने स्रोत पेड़ के नीचे उम्मीद करेंगे।

हालांकि टीएफएस टीम्बुल्ड बिल्ड स्रोत पर एक अलग निर्देशिका में आपके स्रोत के आउटपुट को संकलित करता है। जब AspNetCompiler कार्य शुरू होता है तो यह आवश्यक DLL का संदर्भ देने के लिए बिन निर्देशिका नहीं ढूंढ सकता है और आपको अपवाद मिलता है।

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

यह परिवर्तन दोनों डेस्कटॉप पर दृश्य को संकलित करने के लिए सक्षम बनाता है, और TFS सर्वर का निर्माण:

समाधान MVC परियोजना के AfterBuild लक्ष्य को संशोधित करने के रूप में निम्न प्रकार किया जाता है।

+0

जैसी चीजों से निपटने के लिए उपयोग नहीं करते हैं। उम्मीद है कि एमएस तदनुसार .csproj फ़ाइल टेम्पलेट को बदलता है। –

+0

वह पागल है कि उन्होंने इसे क्यों तय नहीं किया है !! ?? –

+0

मैं टीएफएस टीम बिल्ड टीम से जांच करूंगा, लेकिन मुझे यकीन नहीं है कि हम इसे "ठीक" कर सकते हैं या नहीं। यह उत्तर एक टीएफएस विशिष्ट निर्देशिका संरचना "_PublishedWebsites" हार्ड कोड कोड करता है। क्या होगा यदि आप अपनी साइट बनाने के लिए टीएफएस टीम बिल्डिंग का उपयोग नहीं कर रहे हैं लेकिन कुछ और इस्तेमाल कर रहे हैं? वह तोड़ने की संभावना है। इस बिल्ड को टीएफएस टीम बिल्ड में ले जाकर, आपने अपनी प्रोजेक्ट को कस्टमाइज़ किया है। आपको तदनुसार पथ अपडेट करना होगा, जो व्यक्ति ने इस प्रश्न का उत्तर दिया था। – Haacked

-6

आप एएसपी.नेट एमवीसी अनुप्रयोग को पूर्व-निर्माण नहीं कर सकते हैं।

+0

सही समाधान के लिए जिम लैम्ब द्वारा उत्तर देखें। –

1

मुझे लगता है आप का मतलब है आप .csproj फ़ाइल में निम्न सेटिंग को बदला गया:

<MvcBuildViews>true</MvcBuildViews> 

निर्धारित करके आप अपने सवाल में तैनात छुआ नहीं किया जाना चाहिए। यदि यह आपकी स्थानीय मशीन पर काम करता है, तो जाहिर है कि आप एएसपी.नेट एमवीसी अनुप्रयोग को पूर्व-निर्माण कर सकते हैं।

मुझे लगता है कि आपको अपने टीएफएस निर्माण पर्यावरण और आपकी स्थानीय वीएस मशीनों के बीच क्या अंतर है, इसे ट्रैक करने की आवश्यकता है। शायद यह एमएसबिल्ड या कुछ के एक अलग संस्करण का उपयोग कर रहा है।

वर्बोज़ आउटपुट के साथ दोनों बिल्ड करने का प्रयास करें और यह देखने के लिए दोनों की तुलना करें कि अलग क्या है।

+0

टीएफएस में उपयोग किए जाने वाले पथ आदि मेरी स्थानीय मशीन और स्रोत नियंत्रण में उनसे अलग हैं, इसलिए आपको प्रत्येक परिदृश्य के लिए अलग-अलग स्थानों को निर्दिष्ट करना होगा। – Leather

+0

@ हॅक किया गया यह टेम्पलेट में कभी अपडेट नहीं किया गया था? पहली बार जब आप इसके खिलाफ दौड़ते हैं तो यह काफी उलझन में है। खासतौर पर उन सभी नए 'टीएफएस बेसिक' उपयोगकर्ता इस –

0

हम अभी भी इसका परीक्षण कर रहे हैं, लेकिन ऐसा लगता है कि आप टैग सेट से झूठी/सत्य को अपने DEBUG बिल्ड संस्करण के लिए प्रॉपर्टी ग्रुप में ले जा सकते हैं, फिर भी आप इसे सत्य पर सेट कर सकते हैं और एमएसबिल्ड संकलित करेंगे (मानते हैं 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 टैग स्थानांतरित करने के लिए डिबग विन्यास संपत्ति समूह (नीचे) के लिए, की जरूरत है। दोबारा, जब हमें टीएफएस/एमएसबिल्ड सेटअप मिलता है, तो मैं टीएफएस में हमारे TFSBuild.proj फ़ाइल में जोड़े गए चरण को पोस्ट करने का प्रयास करूंगा।

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

यह समस्या के समान लगता है यहाँ के बारे में बात: http://blogs.msdn.com/aaronhallberg/archive/2007/07/02/team-build-and-web-deployment-projects.aspx ऐसा लगता है aspnet_compiler.exe के आह्वान बाइनरी का पता लगाने की वजह से निर्माण मशीन पर MVC परियोजना के बिन फ़ोल्डर में नहीं हैं विफल रहता है । मैंने अभी तक समाधान नहीं किया है।

0

स्वीकृत उत्तर मेरे लिए काम नहीं करता था। $ (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> 
+0

वैसे जब तक उत्तर आपको सही दिशा में इंगित करता है, तो यह सब अच्छा है। मेरे सेटअप बिंदुओं पर आउटडिर रूट बिल्ड डीआईआर को इंगित करता है जिसमें समाधान के भीतर अन्य परियोजनाओं से सभी असेंबली शामिल हैं, PublishDir समाधान में निहित वेब अनुप्रयोग परियोजनाओं को इंगित करता है। क्या आपके समाधान में केवल एमवीसी वेब ऐप की तुलना में अन्य परियोजनाएं हैं? – crowleym

+0

हां इसमें कई परियोजनाएं हैं, और हां आपके उत्तर ने मुझे सही दिशा में इंगित किया है। मुझे यकीन नहीं है कि $ PublishDir आपके लिए क्यों काम करता है और मुझे नहीं, लेकिन मैं भी उस पर लटका नहीं रहा हूं, फिक्स सीधा था और मैंने सोचा कि अगर मैं किसी और मुद्दे को चलाता हूं तो मैं इसे बाहर रखूंगा । –

178

असल में, इस समस्या का बेहतर समाधान है। मैं वी.एस./TFS 2010 से यह परीक्षण किया है लेकिन यह भी वी.एस./TFS साथ काम करना चाहिए 2008.

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

मैं MVC टीम के साथ काम करने के लिए के साथ-साथ इस दृष्टिकोण का उपयोग करने के लिए करने के लिए अपने प्रोजेक्ट टेम्पलेट अद्यतन करने के लिए जा रहा हूँ एक कस्टम लक्ष्य (AfterBuild ओवरराइड करने के बजाय)।

मैंने कैसे एक ब्लॉग पोस्ट प्रकाशित किया है कैसे Turn on Compile-time View Checking for ASP.NET MVC projects in TFS Build 2010 पर।

+0

और यदि आपके समाधान में एक से अधिक वेब प्रोजेक्ट हैं, तो यह कैसे काम करेगा? यही कारण है कि मैंने अपना रास्ता बनाया ... – crowleym

+1

कई वेब परियोजनाओं के साथ ठीक काम करना चाहिए - WebProjectOutputDir प्रत्येक प्रोजेक्ट के लिए अलग है। –

+0

जो वास्तव में काम करता है! अच्छा और साफ समाधान –

0

मेरे स्रोत नियंत्रण में कुछ पुराने फ़ोल्डर्स थे जो समाधान में दिखाई नहीं दे रहे थे।

3

जिम लैम्ब्स समाधान हमारे लिए काम नहीं किया, जब मैं क्योंकि लक्ष्य AfterBuild निष्पादित किया जा रहा था और आवेदन WebProjectOutputDir में अभी तक कॉपी नहीं किया गया है

/p:UseWPP_CopyWebApplication=true;PipelineDependsOnBuild=False 

साथ हमारी वेब .csproj का निर्माण किया। (बीटीडब्लू, मैं उन प्रॉपर्टी को वेब प्रोजेक्ट बिल्ड में पास करता हूं, मैं चाहता हूं कि बिल्डिंग केवल मेरे बाइनरी और सीएसटीएमएल फाइलों को ज़िप के लिए उपयुक्त है, यानी इन-प्लेस बिल्ड के लिए उपयुक्त)

इस समस्या को हल करने के लिए और अपने मूल लक्ष्य के इरादे का सम्मान करते हुए, मैंने निम्नलिखित किया:

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

<Target Name="MvcBuildViews" Condition="'$(MvcBuildViews)'=='true'"> 
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
</Target> 
संबंधित मुद्दे