ASP.NET कोर वेबसाइट के साथ Microsoft.CodeAnalysis क्यों प्रकाशित किया गया है?


13

मैं एक ASP.NET Core MVC 3.0 वेबसाइट प्रकाशित कर रहा हूं और आउटपुट फ़ोल्डर में कई भाषाओं में बहुत सारी Microsoft.CodeAnalysisलिबर्ररीज़ हैं, कोई जानता है कि क्यों?

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


ऐसा लगता है कि यह किसी भी तरह से संबंधित है .net कोर 3 प्रकाशन पर विचारों को संकलित करता है, लेकिन मुझे यकीन नहीं है
जोनाथन

जवाबों:


5

Microsoft.CodeAnalysis librairies के लिए कई भाषा में बहुत सारे संदर्भ हैं

जब मैंने 3.0 संस्करण का उपयोग किया था तो मैंने उसी मुद्दे का सामना किया था। लेकिन मुझे नहीं लगता कि यह .net Core 3 के प्रकाशन पर संकलित विचारों के कारण है क्योंकि शाखा में ViewCompilation भी है release/2.1


यह केवल उत्पादन समय में उपयोगी नहीं होना चाहिए एक उत्पादन environnement में।

  1. मेरा मानना ​​है कि आप सही हैं। इन विश्लेषणों का उपयोग केवल समय पर किया जाना चाहिए।

  2. लेकिन जब मैं एसडीके (3.0) को मैन्युअल रूप से अनइंस्टॉल करता हूं और नवीनतम एसडीके फिर से स्थापित करता हूं, तो मैं किसी भी अधिक पुन: पेश नहीं कर सकता। मैं ऐसा क्यों नहीं करता, शायद यह अब तय हो गया है। यह किसी अन्य कारण से होने की अधिक संभावना है: मैंने अन्य पैकेजों पर एक अतिरिक्त संदर्भ जोड़ा है जो Microsoft पर निर्भर करता है । दुर्घटना से कोडैनालिसिस)। वैसे भी, कृपया अपने एसडीके को पहले नवीनतम संस्करण में अपग्रेड करें।

  3. नियंत्रक जोड़ने के लिए Visual Studio का उपयोग करते समय एक और महत्वपूर्ण बात यह है कि यह Microsoft.VisualStudio.Web.CodeGeneration.Designस्वचालित रूप से एक संदर्भ जोड़ देगा । नोट इस पैकेज में Microsoft.CodeAnalysis.Commonअप्रत्यक्ष रूप से पैकेज पर निर्भरता है । यहां Microsoft.CodeAnalysis.CommonMicrosoft .NET कंपाइलर प्लेटफ़ॉर्म ("रोसलिन") द्वारा उपयोग किया जाने वाला एक साझा पैकेज है। यदि आप इस पैकेज को डाउनलोड करते हैं और इस दायित्व को मैन्युअल रूप से अनज़िप करते हैं, तो आप पाएंगे कि ए Microsoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib /
    St │netstandard2.0 /
    │ │ ...
    । Ll Microsoft.CodeAnalysis.dll
    । P Microsoft.CodeAnalysis.pdb
    । X Microsoft.CodeAnalysis.xml
    │ │ ...
    ├───package /
    │ │ ...
    └───_rels /
    

    यह पैकेज केवल देव-समय पर आवश्यक है। यदि आप इस निर्भरता को दूर नहीं करते हैं, तो आपको Microsoft.CodeAnalysisअपने प्रकाशित फ़ोल्डर में संबंधित बहुत सारे dll मिलेंगे ।

    <ItemGroup>
        <!-- this is not necessary when publishing -->
        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.0.0" />
    </ItemGroup>

    उन पैकेजों को निकालें जो निर्भर करते हैं Microsoft.CodeAnalysis, और फिर आपको कोई Microsoft.CodeAnalysisसंबंधित डीएल नहीं मिलना चाहिए :

    यहां छवि विवरण दर्ज करें


मैं कैसे देख सकता हूं कि किस पैकेज में Microsoft के लिए प्रत्यक्ष या अप्रत्यक्ष निर्भरता है। कोडएनालिसिस?
जोनाथन


ठीक है जैसे आपने Microsoft.VisualStudio.Web.CodeGeneration.Design पैकेज कहा है, जिस पर निर्भरता है। सभी के लिए PrivateAssets संपत्ति सेट करके, Microsoft.CodeAnalysis फाइलें अब प्रकाशित परियोजना में नहीं हैं। बस सुनिश्चित नहीं है कि कोड पीढ़ी अभी भी ठीक काम करेगी क्योंकि अब परियोजना की निर्भरता सूची में पैकेज पर एक पीला त्रिकोण है।
जोनाथन

@ जोनाथन आपको केवल विकास के समय इस पैकेज की आवश्यकता है। वास्तव में, यदि आपको मचान सुविधा की आवश्यकता नहीं है, उदाहरण के लिए, VSCode का उपयोग करके, आप इस तरह की निर्भरता बिल्कुल नहीं जोड़ेंगे।
itminus

@ जोनाथन यदि आपको वीएस का उपयोग करते समय मचान की आवश्यकता होती है, तो पैकेज फिर से स्थापित किया जाएगा। यदि आप VSCode / CLI का उपयोग कर रहे हैं, तो आपको आह्वान करने से पहले इस तरह के एक पैकेज को जोड़ना होगाdotnet aspnet-codegenerator controlller ...
itminus

10

मेरे लिए, *.csprojफ़ाइल के अंदर की इस लाइन ने किसी तरह समस्या को हल कर दिया। यह अभी भी तैनात है Microsoft.CodeAnalysis, लेकिन केवल इसके लिए en:

<PropertyGroup>
  <!-- ... -->
  <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>

जीथुब मुद्दे पर टिप्पणी (जोनाथन मारोलफ द्वारा) देखें ।


इसने ASP.Net Core 3.0 पर मेरे लिए काम किया और देश के फोल्डर को रोका। क्या "रनटाइम" फ़ोल्डर के सबफ़ोल्डर्स को रोकना संभव है जो मुझे (यूनिक्स, आदि) की आवश्यकता नहीं है?
Gen1-1

@ Gen1-1 कृपया इस सवाल को .NET कोर 2.1 के बारे में देखें: stackoverflow.com/questions/53507229/…
mrmowji

धन्यवाद। इसलिए यह संभव है जब प्रकाशन हो, लेकिन मुझे लगता है कि आप बर्बाद फ़ोल्डर्स को रोक नहीं सकते हैं जब बस निर्माण / संकलन करते हैं।
Gen1-1

3

यहाँ मेरा समाधान को देखने के लिए आसान बनाने की कोशिश कर रहा है।

समस्या, संभावना से अधिक का उपयोग है AddRazorRuntimeCompilation()। अधिक विशेष रूप से, startup.cs में आप जैसे रेजर रनटाइम संकलन को जोड़ने की संभावना है:

     IMvcBuilder builder = services.AddControllersWithViews()
                          .AddRazorRuntimeCompilation(); 

और इसका समर्थन करने के लिए, संभवतः आपके वेब प्रोजेक्ट का संदर्भ है Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

उस नौगट पैकेज पर निर्भरता है Microsoft.CodeAnalysisकि प्रकाशित फ़ोल्डर में सभी अवांछित उत्पादन का उत्पादन होता है।

फिक्स परियोजना फ़ाइल को संपादित करने और डिबग मोड पर निर्भरता सशर्त बनाने के लिए है:

    <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" 
Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />
  </ItemGroup>

और फिर स्टार्टअप में। AddRazorRuntimeCompilation()जैसे फ़ाइल सशर्त रूप से कॉल करें :

    IMvcBuilder builder = services.AddControllersWithViews();

     #if DEBUG
            if (Env.IsDevelopment()) {
                builder.AddRazorRuntimeCompilation();
            }
      #endif

यह उन सभी Microsoft.CodeAnalysisलिब्रेरीज़ का कारण होगा जब केवल डिबग मोड में संकलन किया जाएगा। इसलिए अब जब आप रिलीज़ मोड का उपयोग करके प्रकाशित करेंगे तो वे आउटपुट का हिस्सा नहीं होंगे।


1
IWebHostEnvironment (उपरोक्त उदाहरण में Env) कंफिगर सर्विसेज () में आसानी से उपलब्ध नहीं है, आप इसे बहुत आसानी से प्रकट कर सकते हैं। stackoverflow.com/questions/37660043/…
एंटोनियो निकोलास टाइकेन

@AntonioNicolaasTeyken उत्कृष्ट इसके अलावा, यह एक महत्वपूर्ण विवरण है जिसे मैंने महसूस नहीं किया कि मैं चमक गया।
रॉन सी

0

हो सकता है कि यह किसी की मदद कर सकता है, मेरे मामले में समस्या "Microsoft.VisualStudio.Web.CodeGeneration.Desig" थी, मुझे एक्सक्लूसिवली = "सभी" को शामिल करने के लिए ".csproj" फ़ाइल में पैकेज संदर्भ को बदलने की आवश्यकता थी।

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.