Чому 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.