เหตุใด Microsoft.CodeAnalysis จึงถูกเผยแพร่ด้วยเว็บไซต์ ASP.NET Core


13

ฉันกำลังเผยแพร่เว็บไซต์ ASP.NET Core MVC 3.0 และโฟลเดอร์เอาต์พุตมีการอ้างอิงจำนวนมากในหลายภาษาไปยังMicrosoft.CodeAnalysislibrairies มีคนรู้ว่าทำไม

แน่นอนว่าFxCopAnalyzersแพ็คเกจ Nuget นั้นติดตั้งอยู่ในโครงการ แต่มันไม่ได้ถูกเผยแพร่ในเวอร์ชั่นก่อนหน้าของโครงการดังนั้นฉันจึงไม่เข้าใจว่าทำไมตอนนี้เนื่องจากมันควรจะมีประโยชน์เฉพาะเวลา dev ไม่ใช่ในสภาพแวดล้อมการใช้งานจริง


มันดูเหมือนว่าจะเกี่ยวข้องอย่างใดเพื่อ .net หลัก 3 รวบรวมมุมมองเกี่ยวกับการตีพิมพ์ แต่ผมไม่แน่ใจว่า
โจนาธาน

คำตอบ:


5

มีการอ้างอิงจำนวนมากในหลายภาษากับ Microsoft.CodeAnalysis librairies

ฉันพบปัญหาเดียวกันเมื่อฉันใช้รุ่น 3.0 แต่ฉันไม่คิดว่ามันเกิดจาก. net core 3 รวบรวมมุมมองในการเผยแพร่เพราะยังมีViewCompilationในrelease/2.1สาขา


มันควรจะมีประโยชน์เฉพาะเวลา dev ไม่ใช่ในสภาพแวดล้อมการผลิต

  1. ฉันเชื่อว่าคุณถูกต้อง การวิเคราะห์เหล่านี้ควรใช้ในเวลาที่กำหนดเท่านั้น

  2. แต่เมื่อฉันถอนการติดตั้ง SDK (3.0) ด้วยตนเองและติดตั้ง SDK ล่าสุดอีกครั้งฉันไม่สามารถทำซ้ำได้อีก ฉันไม่ทำไมมันเกิดขึ้นบางทีมันอาจจะได้รับการแก้ไขแล้ว มันมีแนวโน้มที่จะเกิดจากสาเหตุอื่น: ฉันเพิ่มการอ้างอิงพิเศษในแพ็คเกจอื่น ๆ ที่ขึ้นอยู่กับ Microsoft.CodeAnalysisโดยบังเอิญ) อย่างไรก็ตามโปรดอัปเกรด SDK ของคุณเป็นเวอร์ชันล่าสุดก่อน

  3. อีกสิ่งที่สำคัญคือเมื่อใช้ Visual Studio เพื่อเพิ่มตัวควบคุมมันจะเพิ่มการอ้างอิงMicrosoft.VisualStudio.Web.CodeGeneration.Designโดยอัตโนมัติ หมายเหตุแพคเกจนี้มีการพึ่งพาMicrosoft.CodeAnalysis.Commonแพคเกจทางอ้อม นี่Microsoft.CodeAnalysis.Commonคือแพ็คเกจที่ใช้ร่วมกันซึ่งใช้โดย Microsoft .NET Compiler Platform ("Roslyn") หากคุณดาวน์โหลดแพ็คเกจนี้และคลายซิป lib ด้วยตนเองคุณจะพบว่ามีMicrosoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib /
    stand └───netstandard2.0 /
    │├─── ...
    . ├─── Microsoft.CodeAnalysis.dll
    ├───├─── Microsoft.CodeAnalysis.pdb
    . ├─── Microsoft.CodeAnalysis.xml
    │└─── ...
    ├───package /
    │└─── ...
    └───_rels /
    

    แพ็คเกจนี้จำเป็นสำหรับ Dev-Time เท่านั้น หากคุณไม่ลบการขึ้นต่อกันนี้คุณจะได้รับ DLLs จำนวนมากที่เกี่ยวข้องกับMicrosoft.CodeAnalysisในโฟลเดอร์การเผยแพร่ของคุณ

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

    ลบแพ็คเกจเหล่านั้นขึ้นอยู่กับMicrosoft.CodeAnalysisและจากนั้นคุณควรจะไม่มีMicrosoft.CodeAnalysisที่กำลังเกี่ยวข้อง:

    ป้อนคำอธิบายรูปภาพที่นี่


ฉันจะดูแพ็คเกจที่มีการพึ่งพา Microsoft.CodeAnalysis โดยตรงหรือโดยอ้อมได้อย่างไร
Jonathan


ตกลงมันเป็นเหมือนที่คุณกล่าวว่าแพคเกจ Microsoft.VisualStudio.Web.CodeGeneration.Design ที่มีการพึ่งพามัน โดยการตั้งค่าคุณสมบัติ PrivateAssets เป็นทั้งหมดไฟล์ Microsoft.CodeAnalysis ไม่ได้อยู่ในโครงการที่เผยแพร่อีกต่อไป ไม่แน่ใจว่าการสร้างรหัสจะยังทำงานได้ดีหรือไม่เพราะตอนนี้มีรูปสามเหลี่ยมสีเหลืองอยู่เหนือแพ็คเกจในรายการการพึ่งพาของโครงการ
Jonathan

@ Jonathan คุณต้องใช้แพ็คเกจนี้ในระหว่างการพัฒนาเท่านั้น ที่จริงแล้วถ้าคุณไม่ต้องการฟีเจอร์นั่งร้านเช่นใช้ VSCode คุณจะไม่เพิ่มการพึ่งพาดังกล่าวเลย
itminus

@ Jonathan ถ้าคุณต้องการนั่งร้าน, เมื่อใช้ VS, แพ็คเกจจะถูกติดตั้งอีกครั้ง หากคุณใช้ VSCode / CLI คุณจะต้องเพิ่มแพ็คเกจดังกล่าวก่อนที่จะเรียกใช้dotnet aspnet-codegenerator controlller ...
itminus

10

สำหรับฉันแล้ว*.csprojไฟล์ในไฟล์นี้แก้ไขปัญหาได้ มันยังคงปรับใช้Microsoft.CodeAnalysisแต่สำหรับen:

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

ดูความคิดเห็น (โดย Jonathon Marolf) เกี่ยวกับปัญหา Github


สิ่งนี้ใช้ได้กับฉันใน ASP.Net Core 3.0 และป้องกันโฟลเดอร์ประเทศ เป็นไปได้หรือไม่ที่จะป้องกันไม่ให้โฟลเดอร์ย่อยของโฟลเดอร์ "runtimes" ที่ฉันไม่ต้องการ (unix และอื่น ๆ )?
Gen1-1

@ Gen1-1 โปรดดูคำถามนี้เกี่ยวกับ. NET Core 2.1: stackoverflow.com/questions/53507229/…
mrmowji

ขอบคุณ ดังนั้นจึงเป็นไปได้เมื่อเผยแพร่ แต่ฉันคิดว่าคุณไม่สามารถป้องกันโฟลเดอร์ที่สูญเปล่าเมื่อสร้าง / รวบรวม
Gen1-1

3

นี่คือเวลาที่ฉันพยายามทำให้วิธีแก้ปัญหาดูง่ายขึ้น

AddRazorRuntimeCompilation()ปัญหากว่าจะมีการใช้ โดยเฉพาะอย่างยิ่งใน startup.cs คุณน่าจะเพิ่มการรวบรวมรันไทม์ของมีดโกนดังนี้:

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

และเพื่อสนับสนุนโครงการเว็บของคุณอาจมีการอ้างอิงถึง Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

แพ็คเกจ nuget นั้นมีการพึ่งพาMicrosoft.CodeAnalysisที่สร้างเอาท์พุทที่ไม่ต้องการทั้งหมดในโฟลเดอร์เผยแพร่

การแก้ไขคือการแก้ไขไฟล์โครงการและสร้างเงื่อนไขการพึ่งพาในโหมดดีบั๊กดังนี้:

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

และจากนั้นในไฟล์ startup.cs เรียกAddRazorRuntimeCompilation()อย่างมีเงื่อนไขดังนี้:

    IMvcBuilder builder = services.AddControllersWithViews();

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

สิ่งนี้จะทำให้Microsoft.CodeAnalysislibrairies เหล่านั้นทั้งหมดจะออกเมื่อรวบรวมในโหมด Debug เท่านั้น ดังนั้นเมื่อคุณเผยแพร่โดยใช้โหมด Release พวกเขาจะไม่ได้เป็นส่วนหนึ่งของผลลัพธ์


1
IWebHostEnvironment (Env ในตัวอย่างด้านบน) ไม่พร้อมใช้งานใน ConfigureServices () คุณสามารถเปิดเผยได้อย่างง่ายดายแม้ว่า stackoverflow.com/questions/37660043/…
Antonio Nicolaas Teyken

@AntonioNicolaasTeyken นอกจากนี้ยอดเยี่ยมมากนั่นเป็นรายละเอียดที่สำคัญที่ฉันไม่ได้รู้เลยว่าฉันคัดสรรมา
Ron C

0

บางทีนี่อาจช่วยให้ใครบางคนในกรณีของฉันปัญหาคือ "Microsoft.VisualStudio.Web.CodeGeneration.Desig" ฉันต้องเปลี่ยนการอ้างอิงแพ็คเกจในไฟล์ ".csproj" เพื่อรวม ExcludeAssets = "all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.