Tại sao Microsoft.CodeAnalysis được xuất bản với trang web ASP.NET Core?


13

Tôi đang xuất bản một trang web ASP.NET Core MVC 3.0 và thư mục đầu ra chứa nhiều tài liệu tham khảo bằng nhiều ngôn ngữ cho những kẻ Microsoft.CodeAnalysisphỉ báng, ai đó biết tại sao?

Tất nhiên FxCopAnalyzersgói Nuget được cài đặt trên dự án, nhưng nó không được xuất bản trong phiên bản trước của dự án, vì vậy tôi không hiểu tại sao bây giờ vì nó chỉ hữu ích trong thời gian phát triển không phải trong môi trường sản xuất.


Có vẻ như bằng cách nào đó có liên quan đến .net core 3 biên dịch lượt xem trên xuất bản nhưng tôi không chắc chắn
Jonathan

Câu trả lời:


5

chứa nhiều tài liệu tham khảo bằng nhiều ngôn ngữ cho những lời nói dối của Microsoft.CodeAnalysis

Tôi đã gặp vấn đề tương tự khi tôi sử dụng phiên bản 3.0. Nhưng tôi không nghĩ rằng nó gây ra bởi .net core 3 biên dịch các lượt xem trên xuất bản vì cũng có View ViewCompilation trong release/2.1chi nhánh.


nó chỉ hữu ích ở thời điểm dev không phải trong môi trường sản xuất.

  1. Tôi tin bạn đã đúng. Những phân tích này chỉ nên được sử dụng ở thời gian lệch.

  2. Nhưng khi tôi gỡ cài đặt SDK (3.0) theo cách thủ công và cài đặt lại SDK mới nhất , tôi không thể sao chép nữa. Tôi không biết tại sao nó lại xảy ra, có lẽ nó đã được sửa rồi. Có nhiều khả năng gây ra bởi một lý do khác: Tôi đã thêm một tham chiếu bổ sung vào các gói khác phụ thuộc vào Microsoft.CodeAnalysis do tai nạn). Dù sao, trước tiên, vui lòng nâng cấp SDK của bạn lên phiên bản mới nhất.

  3. Một điều quan trọng khác là, khi sử dụng Visual Studio để thêm bộ điều khiển, nó sẽ Microsoft.VisualStudio.Web.CodeGeneration.Designtự động thêm một tham chiếu . Lưu ý gói này có sự phụ thuộc vào Microsoft.CodeAnalysis.Commongói gián tiếp. Đây Microsoft.CodeAnalysis.Commonlà gói chia sẻ được sử dụng bởi Nền tảng trình biên dịch Microsoft .NET ("Roslyn"). Nếu bạn tải xuống gói này và giải nén lib này theo cách thủ công, bạn sẽ thấy rằng có Microsoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib /
    └───netst Chuẩn2.0 /
    ├─── ...
    │ ├─── Microsoft.CodeAnalysis.dll
    │ ├─── Microsoft.CodeAnalysis.pdb
    │ ├─── Microsoft.CodeAnalysis.xml
    └─── ...
    ├───packpack /
    └─── ...
    └───_ bọn /
    

    Gói này chỉ cần thiết tại Dev-Time. Nếu bạn không loại bỏ sự phụ thuộc này, bạn sẽ nhận được khá nhiều dll liên quan đến Microsoft.CodeAnalysistrong thư mục xuất bản của bạn.

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

    Loại bỏ các gói phụ thuộc vào Microsoft.CodeAnalysis, và sau đó bạn sẽ không nhận được Microsoft.CodeAnalysiscác dll liên quan:

    nhập mô tả hình ảnh ở đây


Làm cách nào tôi có thể thấy gói nào có phụ thuộc trực tiếp hoặc gián tiếp vào Microsoft.CodeAnalysis?
Jonathan


ok giống như bạn đã nói gói Microsoft.VisualStudio.Web.CodeGeneration.Design có sự phụ thuộc vào nó. Bằng cách đặt thuộc tính PrivateAssets cho tất cả, các tệp Microsoft.CodeAnalysis không còn trong dự án đã xuất bản nữa. Chỉ không chắc chắn việc tạo mã sẽ vẫn hoạt động tốt hay không vì bây giờ có một hình tam giác màu vàng trên gói trong danh sách phụ thuộc của dự án.
Jonathan

@Jonathan Bạn chỉ cần gói này trong thời gian phát triển. Trên thực tế, nếu bạn không cần tính năng giàn giáo, ví dụ như sử dụng VSCode, bạn sẽ không thêm phụ thuộc như vậy.
itminus

@Jonathan Nếu bạn cần giàn giáo, khi sử dụng VS, gói sẽ được cài đặt lại. Nếu bạn đang sử dụng VSCode / CLI, bạn phải thêm gói như vậy trước khi gọidotnet aspnet-codegenerator controlller ...
itminus

10

Đối với tôi, dòng này bên trong *.csprojtập tin đã giải quyết vấn đề bằng cách nào đó. Nó vẫn triển khai Microsoft.CodeAnalysis, nhưng chỉ cho en:

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

Xem bình luận (của Jonathon Marolf) về vấn đề Github.


Điều này làm việc cho tôi trên ASP.Net Core 3.0 và ngăn các thư mục quốc gia. Có thể ngăn các thư mục con của thư mục "thời gian chạy" mà tôi không cần (unix, v.v.) không?
Gen1-1

@ Gen1-1 Vui lòng xem câu hỏi này liên quan đến .NET Core 2.1: stackoverflow.com/questions/53507229/NH
mrmowji

Cảm ơn. Vì vậy, có thể khi xuất bản, nhưng tôi đoán bạn không thể ngăn các thư mục bị lãng phí khi chỉ cần xây dựng / biên dịch.
Gen1-1

3

Đây là nỗ lực của tôi để cố gắng làm cho giải pháp dễ nhìn hơn.

Vấn đề, nhiều khả năng là sử dụng AddRazorRuntimeCompilation(). Cụ thể hơn, trong startup.cs bạn có khả năng thêm phần biên dịch thời gian chạy dao cạo như vậy:

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

và để hỗ trợ điều đó, dự án web của bạn có thể có một tài liệu tham khảo Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Gói nuget đó có một phụ thuộc vào Microsoft.CodeAnalysisđó là tạo ra tất cả đầu ra không mong muốn đó trong thư mục xuất bản.

Cách khắc phục là chỉnh sửa tệp dự án và tạo điều kiện phụ thuộc vào chế độ Gỡ lỗi như sau:

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

và sau đó trong tệp startup.cs có điều kiện gọi AddRazorRuntimeCompilation()như vậy:

    IMvcBuilder builder = services.AddControllersWithViews();

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

Điều này sẽ khiến tất cả những lời nói Microsoft.CodeAnalysisdối đó chỉ bị loại bỏ khi biên dịch ở chế độ Gỡ lỗi. Vì vậy, bây giờ khi bạn xuất bản bằng chế độ Phát hành, chúng sẽ không phải là một phần của đầu ra.


1
IWebhostEn Môi trường (Env trong ví dụ trên) không có sẵn trong ConfigureService (), bạn có thể tiết lộ nó khá dễ dàng mặc dù. stackoverflow.com/questions/37660043/
Mạnh

@AntonioNicolaasTeyken Bổ sung tuyệt vời, đó là một chi tiết quan trọng tôi không nhận ra tôi đã che đậy.
Ron C

0

Có lẽ điều này có thể giúp ai đó, trong trường hợp của tôi, vấn đề là "Microsoft.VisualStudio.Web.CodeGeneration.Desig", tôi cần thay đổi tham chiếu gói trong tệp ".csproj" để bao gồm ExcludeAssets = "all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.