Чому Microsoft.CodeAnalysis публікується на веб-сайті ASP.NET Core?


13

Я публікую веб-сайт ASP.NET Core MVC 3.0, і папка виводу містить багато посилань на багатьох мовах до Microsoft.CodeAnalysisбібліотек, хтось знає чому?

Звичайно, FxCopAnalyzersпакет Nuget встановлений на проекті, але він не був опублікований у більш ранній версії проекту, тому я не розумію, чому це зараз, оскільки він повинен бути корисним лише у розробник, а не у виробничих умовах.


Здається, це якимось чином пов’язане з .net core 3, що збирає погляди на публікацію, але я не впевнений
Jonathan

Відповіді:


5

містить багато посилань багатьма мовами на бібліотеки Microsoft.CodeAnalysis

З тією ж проблемою я стикався, коли використовував версію 3.0. Але я не думаю, що це викликано .net core 3, що збирає погляди на публікацію, тому що також існує View ViewCompilation у release/2.1галузі.


воно повинно бути корисним лише у розроблений час, а не у виробничому середовищі.

  1. Я вважаю, ти прав. Ці Аналізи слід використовувати лише у програмі devtime.

  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 ("Рослін"). Якщо ви завантажите цей пакет і розпакуйте цю вкладку вручну, ви побачите, що є Microsoft.CodeAnalysis.dll:

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib /
    │ └───netstandard2.0 /
    │ ├─── ...
    │ ├─── Microsoft.CodeAnalysis.dll
    │ ├─── Microsoft.CodeAnalysis.pdb
    │ ├─── Microsoft.CodeAnalysis.xml
    │ └─── ...
    ├───пакет /
    │ └─── ...
    └───_rels /
    

    Цей пакет потрібен лише в Dev-Time. Якщо ви не усунете цю залежність, 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пов'язаних dll:

    введіть тут опис зображення


як я можу побачити, який пакет має пряму чи опосередковану залежність від Microsoft.CodeAnalysis?
Джонатан


ок, як ви сказали, пакет Microsoft.VisualStudio.Web.CodeGeneration.Design, який має залежність від нього. Встановивши властивість PrivateAssets для всіх, файли Microsoft.CodeAnalysis більше не містяться у опублікованому проекті. Просто не впевнений, чи генерація коду все ще буде добре працювати, оскільки тепер у списку залежностей проекту є жовтий трикутник над пакетом.
Джонатан

@Jonathan Цей пакет потрібен лише під час розробки. Насправді, якщо вам не потрібна функція будівельних лісів, наприклад, використовуючи VSCode, таку залежність взагалі не додаватимете.
itminus

@Jonathan Якщо вам потрібні ліси, під час використання VS пакет буде встановлений знову. Якщо ви використовуєте VSCode / CLI, вам слід додати такий пакет перед тим, як викликатиdotnet aspnet-codegenerator controlller ...
itminus

10

Для мене цей рядок у *.csprojфайлі якось вирішив проблему. Він все ще використовує Microsoft.CodeAnalysis, але тільки для en:

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

Дивіться коментар (Джонатан Марольф) до випуску Github.


Це працювало для мене на ASP.Net Core 3.0 і запобігало папкам країни. Чи можна запобігти підпапкам папки "runtimes", які мені не потрібні (unix тощо)?
Gen1-1

@ Gen1-1 ласка , дивіться це питання щодо .NET Ядра 2.1: stackoverflow.com/questions/53507229 / ...
mrmowji

Дякую. Це можливо при публікації, але я думаю, ви не зможете запобігти витраченню папок, просто створюючи / збираючи.
Ген1-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.CodeAnalysisбібліотеки залишатимуться виключно під час компіляції в режимі налагодження. Отже, коли ви публікуєте в режимі випуску, вони не будуть частиною виводу.


1
IWebHostEnvironment (Env у наведеному вище прикладі) недоступний у ConfigureServices (), але ви можете виявити це досить легко. stackoverflow.com/questions/37660043 / ...
Антоніо Ніколаса Teyken

@AntonioNicolaasTeyken Відмінне доповнення, це важлива деталь, яку я не розумів, що заграв.
Рон С

0

Можливо, це може комусь допомогти, у моєму випадку проблема була "Microsoft.VisualStudio.Web.CodeGeneration.Desig", мені потрібно було змінити посилання на пакет у файлі ".csproj", щоб включити ExcludeAssets = "all":

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.