2013-12-12 9 views
11

मैं निर्माण कर रहा हूँ में वेब अनुप्रयोग/निर्माण निर्माण सर्वर में एक वेब अनुप्रयोग पैकिंग "CodeDom प्रदाता प्रकार Microsoft.VisualC.CppCodeProvider नहीं पाया जा सका" और यह निम्न अपवादों के साथ विफल रहता है:अपवाद है जब बिल्ड सर्वर

ASPNETCOMPILER त्रुटि ASPCONFIG: CodeDom प्रदाता प्रकार "Microsoft.VisualC.CppCodeProvider, CppCodeProvider, संस्करण = 10.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b03f5f7f11d50a3a" खोजा नहीं जा सका।

बिल्ड सर्वर:

  • Windows Server 2008 R2 मानक
  • TeamCity 8.0.4
  • .NET 4.5
  • विंडोज एसडीके विंडोज 7 और .NET 4
  • विंडोज के लिए विंडोज 8 और .NET 4.5
  • पोर्टेबल क्लास लाइब्रेरी टूल्स
  • के लिए एसडीके
  • एएसपी MVC 4

अनुप्रयोग एक एएसपी MVC 4 वेब अनुप्रयोग को लक्षित .NET 4.5 है।

बिल्ड कॉन्फ़िगरेशन में एमएसबिल्ड के साथ समाधान बनाने में शामिल है, जो पैकेज में तैनाती को सक्षम बनाता है ताकि मैं इसे बाद में प्रकाशित कर सकूं।

TeamCity का लॉग के माध्यम से, मैं त्रुटि पैदा होती है जब MSBuild "aspnet_compiler.exe" चलाता देख सकते हैं।

मेरे देव मशीन में कोई समस्या नहीं है और इसे बिना किसी समस्या के स्थानीय आईआईएस में प्रकाशित कर सकते हैं।

क्या कोई जानता है कि उस समस्या का कारण क्या हो सकता है?

अद्यतन

See my answer below.

उत्तर

13

This post मुझे एक महत्वपूर्ण सुराग दे दिया: जाहिरा तौर पर ASP.NET precompilation परियोजना और आउटपुट फ़ाइलों को स्कैन करता है और यह अपनी तरह से पाता है हर स्रोत फ़ाइल को संकलित करने का प्रयास करता है, इसकी भाषा के बावजूद (here देखें)।

इस मामले में, मेरा वेब ऐप एक परियोजना पर निर्भर करता है जिसमें ".h" फ़ाइल के साथ कुछ अप्रबंधित डीएल शामिल है। इन फ़ाइलों को आउटपुट निर्देशिका में कॉपी किया गया है ("अगर नई है तो कॉपी करें") तो मैं रनटाइम पर इसे पिनवॉक कर सकता हूं।

ऐसा लगता है कि एएसपी.नेट प्रीकंपिलेशन को ".h" मिल जाता है और इसे संकलित करने का प्रयास करता है, भले ही इसकी आवश्यकता न हो। और, जैसा कि मैंने इसे देखा है, यह विफल रहता है क्योंकि मेरे बिल्ड सर्वर में नौकरी के लिए उपकरण नहीं हैं (ऐसा लगता है कि CppCodeProvider.NET 2.0 SDK के साथ आता है)।

जब मैं परियोजना उत्पादन निर्देशिका के लिए उन फ़ाइलों की प्रतिलिपि बनाना नहीं बदला, निर्माण ठीक भाग गया। मैंने फाइलों की प्रतिलिपि बनाने का भी परीक्षण किया, लेकिन "प्रीकंपाइल बायफोर्पिश" के साथ प्रकाशित प्रोफ़ाइल में झूठी सेट की गई, और यह भी काम किया।

अब मैं कुछ विकल्प हैं, लेकिन मैं उनमें से किसी को पसंद नहीं है:

  • अक्षम "PrecompileBeforePublish"। मेरा मानना ​​है कि इसका मुख्य नुकसान यह है कि ऐप उपयोगकर्ता का अनुभव पहली साइट पहुंच पर धीमा हो जाएगा। आउटपुट फ़ोल्डर से फाइल को बाहर और पूर्व संकलन के बाद फिर से उन्हें जोड़ने के लिए

  • प्रयास करें। ऐसा कुछ ऐसा लगता है जो मुझे पहले स्थान पर चिंता न करना चाहिए।

  • का प्रयास करते समय क्रियान्वित हमलावर फ़ाइलें/फ़ोल्डर निकालने के लिए "aspnet_compiler.exe" बताने के लिए। मुझे नहीं पता कि प्रकाशित प्रोफाइल का उपयोग करके इसे कैसे किया जाए, क्योंकि मेरे पास केवल "प्रीकंपाइल बायफोर्पिश" पर नियंत्रण है। साथ ही, ऐसा लगता है कि "aspnet_compiler.exe" उस विकल्प की पेशकश नहीं करता है (here और here)।

मुझे लगता है कि अभी मैं, "PrecompileBeforePublish" अक्षम कर देंगे, क्योंकि यह कुछ कैविएट्स के साथ एक तेजी से रास्ता लगता है। लेकिन मेरा मानना ​​है कि इसे प्रकाशित करने के लिए प्रीकंपिलेशन से फ़ोल्डर या फ़ाइल प्रकारों को छोड़कर, इसे संभालने का बेहतर तरीका होना चाहिए।

+0

मेरी भलाई! - इस पोस्ट के लिए आपको बहुत बहुत धन्यवाद - आपने शायद मुझे निराशा के दिन बचाए क्योंकि यह वही है जो हमारे साथ हुआ था। क्या आपको कभी किसी फ़ोल्डर को अनदेखा करने का कोई तरीका मिला है? (हालांकि मेरी पहली पसंद रेपो से अपमानजनक फाइलों को मिटाना है।) – Edward

+0

नहीं, एडवर्ड, मुझे "प्रीकंपाइल बेयरफब्लिश" अक्षम रखना पड़ा। हालांकि, मैंने इस समस्या के तुरंत बाद उस परियोजना पर काम करना बंद कर दिया, तो हो सकता है कि उत्तर अभी भी कहीं बाहर है =] –

+3

@ एडवर्ड मैं बस इसमें भी भाग गया। Aspnet_compiler.exe चलाने से पहले मेरी बिल्ड स्क्रिप्ट में छिपी हुई विशेषता ('attrib + H c: \ path \ to \ problem \ directory') के साथ मेरे संकलन आवश्यक फ़ोल्डरों को चिह्नित करने के साथ अब तक मेरी शुभकामनाएं मिली हैं, फिर छिपी हुई विशेषता को रीसेट करना जब ये पूर्ण हो जाए। – twamley

0

मेरे मामले में मुद्दा आईआईएस में एक माता पिता समाधान (रूट स्तर परियोजना) के वेब config यह इस वेब config (गलती से, यकीन नहीं है कि यह कैसे वहाँ गया) है था कि था। ट्रैक करने के लिए काफी समय लगा, क्योंकि मेरे समाधान/परियोजना में मैं कुछ भी नहीं कर सकता था, इसे किसी भी तरह से प्रभावित कर सकता था।

तो वह सब शामिल हो सकता की web.config जाँच के लायक हो सकता है।

0

मेरे लिए इस त्रुटि दिखा जब मेरी वेबसाइट की शारीरिक पथ IIS में अवैध था था। उस वेबसाइट को राइट क्लिक करने के लिए (वेबसाइट प्रबंधित करें -> उन्नत सेटिंग्स -> भौतिक पथ) पर क्लिक करें।

17

मेरे लिए यह त्रुटि वेब प्रोजेक्ट बनाने के दौरान VS2017 में पॉप-अप हो रही थी। फिक्स फ़ाइल एक्सप्लोरर में node_modules निर्देशिका छिपाने के लिए था। स्पष्ट रूप से यह इन सभी फ़ाइलों को स्कैन करने से एएसपी.NET कंपाइलर को रोकता है और इस प्रकार त्रुटि को रोकता है।

+0

वीएस 2017 – ihimv

+0

में काम करता है यह निश्चित रूप से एक कामकाज है (एक मैं इसका उपयोग नहीं कर सका क्योंकि नोड_मॉडल फ़ोल्डर छिपे हुए अन्य वर्कफ़्लो को तोड़ दिया।) मैंने .NET 3.5 इंस्टॉल किया इस समस्या को दूर कर दिया। –

2

यह तब शुरू हो रहा था जब मैं वीएस2017 में अपडेट कर रहा था। मेरे लिए समस्या node.js थी, अगर मैंने node_modules फ़ोल्डर हटा दिया तो परियोजना त्रुटियों के बिना निर्माण करेगी। यह पता चला है कि mvcBuildViews के मान को csproj फ़ाइल में गलत करने के लिए एंडर्स here द्वारा सुझाए गए अनुसार इसे ठीक करता है। यह आदर्श नहीं है हालांकि एमवीसी विचारों को तब तक संकलित नहीं किया जाएगा जब तक आईआईएस उन्हें प्रस्तुत नहीं करता। निजी तौर पर, मैं इस मुद्दे को पाने के लिए नोड_मोड्यूल फ़ोल्डर को छिपाता हूं लेकिन अगर मैं किसी और के लिए अंतर्निहित मुद्दे पर कुछ प्रकाश डालने में मदद करता हूं तो मैं यह जवाब जोड़ना चाहता हूं।

<MvcBuildViews>false</MvcBuildViews>

0

मेरी परिदृश्य में, मैं अपने ASP.Net वेबसाइट के साथ एक पर्ल दुभाषिया जहाज करने के लिए है (पूछना नहीं क्यों मैं पर्ल की जरूरत है, और मुझे खेद है मैं पहले से कर रहा हूँ!), और कहा कि .c फाइलें शामिल हैं जो aspnet_compiler.exe को त्रुटि के कारण उत्पन्न करती हैं, क्योंकि अन्य ने अपनी समस्या का उल्लेख किया है। Perl निर्देशिका मेरे बिन फ़ोल्डर में है, और रनटाइम पर आवश्यक है।

मुझे मिली समस्या जब आप attrib +H फ़ोल्डर में थे, तो यह वास्तव में aspnet_compiler द्वारा छोड़ा गया था, लेकिन तब मेरे प्रकाशित आउटपुट फ़ोल्डर में नहीं होगा।इसलिए मुझे फ़ोल्डर को छिपाने, विचारों को संकलित करने, फ़ोल्डर को अनदेखा करके और फिर फ़ोल्डर को सही स्थान पर कॉपी करके इसे और भी हैक करना पड़ा। इसमें मूल AspNetPreCompile कार्य को संशोधित करना शामिल था। नीचे देखें:

<!-- Overwrite AspNetPreCompile task because it was trying to compile .c files found in the Perl directory. This prevents that but still copies Perl to publish file. --> 
<!-- Taken from: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\Web\Transform --> 
<Target Name="AspNetPreCompile" DependsOnTargets="$(AspNetPreCompileDependsOn)" Condition="'$(AspNetPreCompile)' != 'false'"> 

    <PropertyGroup Condition="'$(UseMetabasePath)' == 'true'" > 
     <_PreAspnetCompileMergeSingleTargetFolderFullPath></_PreAspnetCompileMergeSingleTargetFolderFullPath> 
     <_AspNetCompilerVirtualPath></_AspNetCompilerVirtualPath> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(UseMetabasePath)' != 'true'" > 
     <_PreAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PreAspnetCompileMergeSingleTargetFolder)))</_PreAspnetCompileMergeSingleTargetFolderFullPath> 
    </PropertyGroup> 

    <PropertyGroup> 
     <_PostAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PostAspnetCompileMergeSingleTargetFolder)))</_PostAspnetCompileMergeSingleTargetFolderFullPath> 
    </PropertyGroup> 

    <!-- Modification #1. --> 
    <Exec Command="attrib +H &quot;$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl&quot;" /> 

    <AspNetCompiler 
     PhysicalPath="$(_PreAspnetCompileMergeSingleTargetFolderFullPath)" 
     TargetPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)" 
     VirtualPath="$(_AspNetCompilerVirtualPath)" 
     Force="$(_AspNetCompilerForce)" 
     Debug="$(DebugSymbols)" 
     Updateable="$(EnableUpdateable)" 
     KeyFile="$(_AspNetCompileMergeKeyFile)" 
     KeyContainer="$(_AspNetCompileMergeKeyContainer)" 
     DelaySign="$(DelaySign)" 
     AllowPartiallyTrustedCallers="$(AllowPartiallyTrustedCallers)" 
     FixedNames="$(_AspNetCompilerFixedNames)" 
     Clean="$(Clean)" 
     MetabasePath="$(_AspNetCompilerMetabasePath)" 
     ToolPath="$(AspnetCompilerPath)" 
     /> 

    <!-- Modification #2. --> 
    <Exec Command="attrib -H &quot;$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl&quot;" /> 

    <!-- 
     Removing APP_DATA is done here so that the output groups reflect the fact that App_data is 
     not present 
     --> 
    <RemoveDir Condition="'$(DeleteAppDataFolder)' == 'true' And Exists('$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data')" 
       Directories="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data" /> 


    <CollectFilesinFolder Condition="'$(UseMerge)' != 'true'" 
     RootPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)" > 
     <Output TaskParameter="Result" ItemName="_AspnetCompileMergePrecompiledOutputNoMetadata" /> 
    </CollectFilesinFolder> 

    <ItemGroup Condition="'$(UseMerge)' != 'true'"> 
     <FileWrites Include="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\**"/> 
    </ItemGroup> 

    <!-- Modification #3. --> 
    <ItemGroup> 
     <Perl Include="$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl\**\*.*" /> 
    </ItemGroup> 

    <!-- Modification #4. --> 
    <Copy SourceFiles="@(Perl)" DestinationFolder="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\bin\perl\%(RecursiveDir)"></Copy> 

</Target> 

मूल .targets फ़ाइल को संशोधित नहीं करते हैं, <project> नोड के लिए एक बच्चे के रूप में अपने .csproj फ़ाइल में इस कॉपी।

में महत्वपूर्ण परिणाम:

उपयोग attrib +H Directory को Exec आदेश AspNetCompiler कार्य के माध्यम से aspnet_compiler.exe चलाने से पहले, और बाद में attrib -H Directory

उन सभी फ़ाइलों में चूसने के लिए ItemGroup बनाएं जिन्हें अभी भी कॉपी करने की आवश्यकता है।

Copy कार्य को ItemGroup का उपयोग करके उन फ़ाइलों को रखने के लिए चलाएं जहां उन्हें प्रकाशित करने के लिए शेष प्रकाशन कार्य के क्रम में होना आवश्यक है। हम इस कार्य को संलेखित करते समय माइक्रोसॉफ्ट द्वारा किए गए सभी चर का उपयोग करते हैं, इसलिए हम यहां उन लोगों का भी उपयोग कर सकते हैं।

मूल कार्य को संशोधित करने के लिए प्रो: सामान्य व्यवहार के बारे में बहुत कम परिवर्तन, इसलिए इसे अभी भी काम करना चाहिए।

मूल कार्य को संशोधित करने के लिए संभावित con: Microsoft इस कार्य को भविष्य में बदल सकता है, जिससे हमारी प्रतिलिपि पुरानी हो जाती है।

<Target Name="Test" BeforeTargets="AspNetPreCompile"> 
    <Exec Command="attrib +H Directory" /> 
</Target> 
<Target Name="Test" AfterTargets="AspNetPreCompile"> 
    <Exec Command="attrib -H Directory" /> 
</Target> 

उत्तर टिप्पणी आर्थर Nunes जवाब में किए गए twamley से प्रेरित:

तुम मेरी अजीब आवश्यकताओं की जरूरत नहीं है, तो एक फ़ोल्डर छुपा के लिए सरल समाधान इस प्रकार है।

0

मेरे मामले में, एक नई मशीन पर, वीएस2017 स्थापित किया गया और स्रोत नियंत्रण से एएसपीनेट कोर 1.1 वेब एप्लिकेशन खोला गया। त्रुटि दिखाई दी। मैंने node.js और प्रोजेक्ट संकलित किया।

संबंधित मुद्दे